Schatten um komplette Form ohne Borderstyle

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Toni03.

    Schatten um komplette Form ohne Borderstyle

    Hey Leute,

    Ich habe jetzt mir eine Form erstellt ohne Borderstyle. Jetzt habe ich das Problem, dass ich keinen passenden Code finde um den Schatten um die komplette Form zu erstellen. Ich bemühte auch die SuFu fand aber auch da nichts. Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
    2. Get
    3. Const CS_DROPSHADOW = &H20000
    4. Dim cParam As CreateParams = MyBase.CreateParams
    5. cParam.ClassStyle = cParam.ClassStyle Or CS_DROPSHADOW
    6. Return cParam
    7. End Get
    8. End Property


    Ich habe mir auch schon die Seite von den Microsoft Docs angesehen. Link

    Wie ist das anstellbar?
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    @Toni03 Kann es sein, dass Du unter Win10 arbeitest?
    Bei mir geht das auch nicht. Ich teste mal morgen unter W7.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Kann es sein, dass Du unter Win10 arbeitest?


    Ja ich benutze Win10.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    @Toni03 Es ist so, wie ich befürchtete:
    Unter W7 funktioniert der Schatten problemlos.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Öhm. Ich versteh nicht ganz. Klappt bei mir mit Win7 (blau) und Win10 (orange). FW4.6.1.
    Bilder
    • WithAndWithoutShadow.png

      6,83 kB, 741×203, 108 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann bist Du da aber mit den Parametern falsch.

    MSDN schrieb:


    Enables the drop shadow effect on a window. The effect is turned on and off through SPI_SETDROPSHADOW.
    Typically, this is enabled for small, short-lived windows such as menus to emphasize their Z-order relationship to other windows. Windows created from a class with this style must be top-level windows; they may not be child windows.

    Mikrosaft sagt ja selber, dass es dafür ist, dass es sich so darstellt, dass es über einem anderen Fenster liegt und dies bedeckt, also dass der oben gezeigte Effekt entsteht. Komplett drumherum ist da m.E. nicht drin. Woher hast Du die Info mit drumherum?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich wollte den Schatten nur um die komplette Form, hatte es nirgends gelesen. Hab ein Code der in C# funzt. Aber wenn man telerik zum übersetzen nimmt, dann funktioniert er nicht mehr
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Ok, dann gib mal bitte den C#-Code und per [+ Erweiterte Antwort] nen Screenshot, wie es aussehen soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist der Code den ich gefunden hatte

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace TestShadow
    11. {
    12. public partial class Form1 : Form
    13. {
    14. private bool Drag;
    15. private int MouseX;
    16. private int MouseY;
    17. private const int WM_NCHITTEST = 0x84;
    18. private const int HTCLIENT = 0x1;
    19. private const int HTCAPTION = 0x2;
    20. private bool m_aeroEnabled;
    21. private const int CS_DROPSHADOW = 0x00020000;
    22. private const int WM_NCPAINT = 0x0085;
    23. private const int WM_ACTIVATEAPP = 0x001C;
    24. [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
    25. public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
    26. [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
    27. public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
    28. [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
    29. public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
    30. [System.Runtime.InteropServices.DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
    31. private static extern IntPtr CreateRoundRectRgn(
    32. int nLeftRect,
    33. int nTopRect,
    34. int nRightRect,
    35. int nBottomRect,
    36. int nWidthEllipse,
    37. int nHeightEllipse
    38. );
    39. public struct MARGINS
    40. {
    41. public int leftWidth;
    42. public int rightWidth;
    43. public int topHeight;
    44. public int bottomHeight;
    45. }
    46. protected override CreateParams CreateParams
    47. {
    48. get
    49. {
    50. m_aeroEnabled = CheckAeroEnabled();
    51. CreateParams cp = base.CreateParams;
    52. if (!m_aeroEnabled)
    53. cp.ClassStyle |= CS_DROPSHADOW; return cp;
    54. }
    55. }
    56. private bool CheckAeroEnabled()
    57. {
    58. if (Environment.OSVersion.Version.Major >= 6)
    59. {
    60. int enabled = 0; DwmIsCompositionEnabled(ref enabled);
    61. return (enabled == 1) ? true : false;
    62. }
    63. return false;
    64. }
    65. protected override void WndProc(ref Message m)
    66. {
    67. switch (m.Msg)
    68. {
    69. case WM_NCPAINT:
    70. if (m_aeroEnabled)
    71. {
    72. var v = 2;
    73. DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
    74. MARGINS margins = new MARGINS()
    75. {
    76. bottomHeight = 1,
    77. leftWidth = 0,
    78. rightWidth = 0,
    79. topHeight = 0
    80. }; DwmExtendFrameIntoClientArea(this.Handle, ref margins);
    81. }
    82. break;
    83. default: break;
    84. }
    85. base.WndProc(ref m);
    86. if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION;
    87. }
    88. private void PanelMove_MouseDown(object sender, MouseEventArgs e)
    89. {
    90. Drag = true;
    91. MouseX = Cursor.Position.X - this.Left;
    92. MouseY = Cursor.Position.Y - this.Top;
    93. }
    94. private void PanelMove_MouseMove(object sender, MouseEventArgs e)
    95. {
    96. if (Drag)
    97. {
    98. this.Top = Cursor.Position.Y - MouseY;
    99. this.Left = Cursor.Position.X - MouseX;
    100. }
    101. }
    102. private void PanelMove_MouseUp(object sender, MouseEventArgs e) { Drag = false; }
    103. public Form1()
    104. {
    105. InitializeComponent();
    106. }
    107. }
    108. }


    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Das ist jetzt nicht Dein Ernst, oder?
    Nach 10 Posts rückst Du endlich mit Code raus, der das Ziel erreicht und wesentlich mehr macht als das, was Du in Post#1 zeigst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ups || Sorry, hatte nicht mehr an den Code gedacht. Ich hatte den vorgestern benutzt und dann ständig recherchiert und da war er ein wenig in Vergessenheit geraten.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Wie kann ich den Code aber dann nutzen? Wenn man ihn mit telerik übersetzt, funzt der Code nicht mehr.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Wie kann ich den Code aber dann nutzen?
    Indem du dich ransetzt und das tust, was ein Programmierer nunmal so tut. Recherchieren.

    Dein VS wird dir ja sagen, was ihm nicht passt. Schau dir jeden Fehler einzeln an und such nach dem spezifischen Fehler. Verstehst du manche Begriffe aus C# nicht, such nach dem VB.NET Equivalent. Arbeite dich nach und nach durch die Fehler durch.
    Nichts anderes würden wir für dich tun.
    Moment. Nur nochmal, damit ich gar nichts mehr verstehe. Wenn ich ne c#-WinForms-App kreiere, keinen weiteren Code eingeben und das Ding starte, bekomm ich ja schon genau das hier:

    Und wenn das das ist, was Du haben willst, wofür ist dann der Code da??? Ich weiß, das willst Du in VB haben. Aber wenn es keine Code benötigt, um das Ding so in C# anzeigen zu lassen, wozu ist dann Deines Erachtens der C#-Code überhaupt?

    ##########

    Ach, Blödsinn. FormBorderStyle vergessen. :S

    ##########

    Tja, was soll ich sagen? Telerik klappt ganz gut. Ich bekomm es in VB zum Laufen, mit dem gewünschten Effekt:



    An 2-3 Stellen musste ich noch nachbessern, weil noch was im Code fehlte, da es Telerik nicht automatisch hinzugefügt hat, aber VS konnte mir mit klarer Fehlermeldung und Gegenvorschlag weiterhelfen.

    Das Grundsatzproblem ist also nicht, dass es nicht klappt, sondern dass nicht verstanden wurde, wie einem Visual Studio helfen bei auftretenden Problemen kann.

    @Gather: Gemerkt und behoben. Inkl. dem Grundsatzproblem.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed wenn du eine Form mit BorderStyle = None erstellst, ist besagter Schatten nicht sichtbar.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Inner VM mit Win7 geht's net, mit 8(.1)net, auch mit Win10 wills net. Den Schatten kriege ich nur wenn FormBorderStyle <> none ist.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @NoIde: Welchen Code hast Du verwendet? Den aus Post#1 oder den übersetzten aus Post#11?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke, ich habe jetzt knapp zwei Stunden davor gesessen, bis ich bemerkt hatte, dass ich noch ein

    VB.NET-Quellcode

    1. inherits Form
    drinne hatte. War fast verzweifelt. Manchmal stelle ich mich echt blöd an. Ich Poste hier nochmal den Code in vb. Falls unerwünscht einfach bescheid sagen und ich entferne ihn.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Drag As Boolean
    3. Private MouseX As Integer
    4. Private MouseY As Integer
    5. Private Const WM_NCHITTEST As Integer = &H84
    6. Private Const HTCLIENT As Integer = &H1
    7. Private Const HTCAPTION As Integer = &H2
    8. Private m_aeroEnabled As Boolean
    9. Private Const CS_DROPSHADOW As Integer = &H20000
    10. Private Const WM_NCPAINT As Integer = &H85
    11. Private Const WM_ACTIVATEAPP As Integer = &H1C
    12. <System.Runtime.InteropServices.DllImport("dwmapi.dll")>
    13. Public Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarInset As MARGINS) As Integer : End Function
    14. <System.Runtime.InteropServices.DllImport("dwmapi.dll")>
    15. Public Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal attr As Integer, ByRef attrValue As Integer, ByVal attrSize As Integer) As Integer : End Function
    16. <System.Runtime.InteropServices.DllImport("dwmapi.dll")>
    17. Public Shared Function DwmIsCompositionEnabled(ByRef pfEnabled As Integer) As Integer : End Function
    18. <System.Runtime.InteropServices.DllImport("Gdi32.dll", EntryPoint:="CreateRoundRectRgn")>
    19. Private Shared Function CreateRoundRectRgn(ByVal nLeftRect As Integer, ByVal nTopRect As Integer, ByVal nRightRect As Integer, ByVal nBottomRect As Integer, ByVal nWidthEllipse As Integer, ByVal nHeightEllipse As Integer) As IntPtr : End Function
    20. Public Structure MARGINS
    21. Public leftWidth As Integer
    22. Public rightWidth As Integer
    23. Public topHeight As Integer
    24. Public bottomHeight As Integer
    25. End Structure
    26. Protected Overrides ReadOnly Property CreateParams As CreateParams
    27. Get
    28. m_aeroEnabled = CheckAeroEnabled()
    29. Dim cp As CreateParams = MyBase.CreateParams
    30. If Not m_aeroEnabled Then cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
    31. Return cp
    32. End Get
    33. End Property
    34. Private Function CheckAeroEnabled() As Boolean
    35. If Environment.OSVersion.Version.Major >= 6 Then
    36. Dim enabled As Integer = 0
    37. DwmIsCompositionEnabled(enabled)
    38. Return If((enabled = 1), True, False)
    39. End If
    40. Return False
    41. End Function
    42. Protected Overrides Sub WndProc(ByRef m As Message)
    43. Select Case m.Msg
    44. Case WM_NCPAINT
    45. If m_aeroEnabled Then
    46. Dim v = 2
    47. DwmSetWindowAttribute(Me.Handle, 2, v, 4)
    48. Dim margins As MARGINS = New MARGINS() With {
    49. .bottomHeight = 1,
    50. .leftWidth = 0,
    51. .rightWidth = 0,
    52. .topHeight = 0
    53. }
    54. DwmExtendFrameIntoClientArea(Me.Handle, margins)
    55. End If
    56. Case Else
    57. End Select
    58. MyBase.WndProc(m)
    59. If m.Msg = WM_NCHITTEST AndAlso CInt(m.Result) = HTCLIENT Then m.Result = CType(HTCAPTION, IntPtr)
    60. End Sub
    61. Private Sub PanelMove_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    62. Drag = True
    63. MouseX = Cursor.Position.X - Me.Left
    64. MouseY = Cursor.Position.Y - Me.Top
    65. End Sub
    66. Private Sub PanelMove_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
    67. If Drag Then
    68. Me.Top = Cursor.Position.Y - MouseY
    69. Me.Left = Cursor.Position.X - MouseX
    70. End If
    71. End Sub
    72. Private Sub PanelMove_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
    73. Drag = False
    74. End Sub
    75. Public Sub New()
    76. InitializeComponent()
    77. End Sub
    78. End Class
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down