Form verdunkeln

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Form verdunkeln

    Hallo Leute,

    ich möchte eine Form auf klicken eines Buttons abdunkeln. (bei magix video deluxe 2008 ist das glaub ich auch so :) ). Ich hatte folgenden Ansatz:

    VB.NET-Quellcode

    1. Dim g As Graphics = Me.CreateGraphics
    2. g.FillRectangle(New SolidBrush(Color.FromArgb(200, 0, 0, 0)), 0, 0, Me.Width, Me.Height)


    Der Code zeichnet ein Rechteck auf die Form das etwas durchlässig ist. Dummerweise deckt es die Controls nicht ab :( sodass der code keinen Sinn hat.
    Hat jemand einen Tipp?

    Danke!
    Hi

    VB.NET-Quellcode

    1. Private clrLayerColor As Color = Color.FromArgb(200, Color.Black)
    2. Private bEnableLayer As Boolean
    3. Public Overridable Property LayerColor() As Color
    4. Get
    5. Return clrLayerColor
    6. End Get
    7. Set(ByVal value As Color)
    8. clrLayerColor = value
    9. Me.Refresh()
    10. End Set
    11. End Property
    12. Public Overridable Property EnableLayer() As Boolean
    13. Get
    14. Return bEnableLayer
    15. End Get
    16. Set(ByVal value As Boolean)
    17. bEnableLayer = value
    18. Me.Refresh()
    19. End Set
    20. End Property
    21. Private Sub Control_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded
    22. EnlistControls(e.Control)
    23. End Sub
    24. Private Sub EnlistControls(ByVal control As Control)
    25. AddHandler control.ControlAdded, AddressOf Control_ControlAdded
    26. AddHandler control.Paint, AddressOf Control_Paint
    27. For Each c As Control In control.Controls
    28. EnlistControls(c)
    29. Next
    30. End Sub
    31. Private Sub DelistControls(ByVal control As Control)
    32. RemoveHandler control.ControlAdded, AddressOf Control_ControlAdded
    33. RemoveHandler control.Paint, AddressOf Control_Paint
    34. For Each c As Control In control.Controls
    35. DelistControls(c)
    36. Next
    37. End Sub
    38. Private Sub MyControlContainer_ControlRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlRemoved
    39. DelistControls(e.Control)
    40. End Sub
    41. Private Sub Control_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    42. If bEnableLayer Then
    43. e.Graphics.FillRectangle(New SolidBrush(LayerColor), e.ClipRectangle)
    44. End If
    45. End Sub


    sollte funktionieren.

    Gruß
    ~blaze~
    Danke ~blaze~,

    der code funktioniert eigentlich prima! Viel dank für deine mühe. Leider ist gdi+ etwas langsam:

    VB.NET-Quellcode

    1. Do
    2. Me.EnableLayer = True
    3. trans += 5
    4. System.Threading.Thread.Sleep(100)
    5. Loop Until trans = 150


    So dunkelt die form ab d.h. es wird langsam immer schwarzer.
    Aber es flackert unmenschlich ;(

    Es gibt keine Möglichkeit das flüssiger zu machen oder? Weil gleich auf directx umsteigen ist vlt. ein bisschen übertrieben....
    Also das ganze über Threading.Thread.Sleep zu lösen ist nicht so toll ;)
    Mach das lieber über nen Timer. Z.B. so: Der Timer ist timDimmingTimer genannt:

    VB.NET-Quellcode

    1. Private clrLayerColor As Color = Color.FromArgb(200, Color.Black)
    2. Private bEnableLayer As Boolean
    3. Private intA As Integer
    4. Public Overridable Property LayerColor() As Color
    5. Get
    6. Return clrLayerColor
    7. End Get
    8. Set(ByVal value As Color)
    9. clrLayerColor = value
    10. Me.Refresh()
    11. End Set
    12. End Property
    13. Public Overridable Property EnableLayer() As Boolean
    14. Get
    15. Return bEnableLayer
    16. End Get
    17. Set(ByVal value As Boolean)
    18. bEnableLayer = value
    19. timDimmingTimer.Start()
    20. End Set
    21. End Property
    22. Private Sub Control_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded
    23. EnlistControls(e.Control)
    24. End Sub
    25. Private Sub EnlistControls(ByVal control As Control)
    26. AddHandler control.ControlAdded, AddressOf Control_ControlAdded
    27. AddHandler control.Paint, AddressOf Control_Paint
    28. For Each c As Control In control.Controls
    29. EnlistControls(c)
    30. Next
    31. End Sub
    32. Private Sub DelistControls(ByVal control As Control)
    33. RemoveHandler control.ControlAdded, AddressOf Control_ControlAdded
    34. RemoveHandler control.Paint, AddressOf Control_Paint
    35. For Each c As Control In control.Controls
    36. DelistControls(c)
    37. Next
    38. End Sub
    39. Private Sub MyControlContainer_ControlRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlRemoved
    40. DelistControls(e.Control)
    41. End Sub
    42. Private Sub Control_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    43. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(intA, LayerColor)), e.ClipRectangle)
    44. End Sub
    45. Private Sub timDimmingTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timDimmingTimer.Tick
    46. If EnableLayer Then
    47. If intA - 5 >= clrLayerColor.A Then
    48. intA = clrLayerColor.A
    49. timDimmingTimer.Stop()
    50. Else
    51. intA += 5
    52. End If
    53. Else
    54. If intA - 5 <= 0 Then
    55. intA = 0
    56. timDimmingTimer.Stop()
    57. Else
    58. intA -= 5
    59. End If
    60. End If
    61. Me.Refresh()
    62. End Sub
    63. Protected Overrides Sub OnCreateControl()
    64. MyBase.OnCreateControl()
    65. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint, True)
    66. End Sub


    Schau dir den Code aber gut an ;). Hab irgendwie zur Zeit meine Sourcecodephase...

    Gruß
    ~blaze~
    Hi,
    cool! Großen Dank!

    Ich hab den Code jetzt etwas erweitert:
    Ich lasse nach dem verdunkeln den clientbereich der form screenshoten und in einer picturbo anzeigen die über die ganze form gezogen sit. das verdindert das man noch buttons oder andere steurelletmet anklicken kann.

    Und jetzt würde ich gerne eine andere form auf der abgedunkelten form anzeigen lassen. Ich dachte an mdichild aber die form wird dann von der picbox abgedunkelt und auch von der picturbeox abgedeckt(diese form soll ja benutzbar sein. wie könnte ich das verwirklichen?
    DANKE blaze!
    du hast mir sehr geholfen! ich benutze jetzt deinen Code und Screenshote das Ergebnis. kommt aber aus gleiche raus wei wenn ich ein recatangel auf die picbox male :D

    Aber die Eigenschaft istopcontrol find ich nicht... wie mache ich das die einen in der anderen dirnn ist. weil mdi container sind ja auch verdunkelt und das soll die form eben nicht sein?
    Sorry, hab den falschen Namen im Kopf gehabt. Der richtige lautet TopLevel... Habs eigentlich noch mal nachgeschaut, aber trotzdem falsch abgeschickt. Also wenn du den Code trotzdem verwenden willst, machs so:
    Verbesser einfach EnlistControls und DelistControls

    VB.NET-Quellcode

    1. Private Sub EnlistControls(ByVal control As Control)
    2. If Not (TypeOf control Is Form OrElse control.GetType.IsSubclassOf(GetType(Form))) Then
    3. AddHandler control.ControlAdded, AddressOf Control_ControlAdded
    4. AddHandler control.Paint, AddressOf Control_Paint
    5. For Each c As Control In control.Controls
    6. EnlistControls(c)
    7. Next
    8. End If
    9. End Sub
    10. Private Sub DelistControls(ByVal control As Control)
    11. If Not (TypeOf control Is Form OrElse control.GetType.IsSubclassOf(GetType(Form))) Then
    12. RemoveHandler control.ControlAdded, AddressOf Control_ControlAdded
    13. RemoveHandler control.Paint, AddressOf Control_Paint
    14. For Each c As Control In control.Controls
    15. DelistControls(c)
    16. Next
    17. End If
    18. End Sub


    Das sollte die Forms ausschließen aus dem Verdunklungsprozess.

    Gruß
    ~blaze~

    PS: Ich befürworte eigentlich die selbstständige Arbeit :rolleyes:
    Sorry das ich das hier nochmal hochhole, aber ich brauche genau das gleiche gerade auch in meinem Projekt. Der Code funktioniert auch wunderbar. Es wird alles abgedunkelt außer die Textboxen, welche ich auf der Form habe. Ne Idee woran das liegen kann?

    WÜrde mich freuen, wenn mir jemand helfen könnte.