[VB.Net/VB2010] Form 'abdunkeln' - Form auf Form mit 'opacity' - nur, wie?

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von haiyyu.

    [VB.Net/VB2010] Form 'abdunkeln' - Form auf Form mit 'opacity' - nur, wie?

    Hallo Gemeinde!

    Ich komme als blutiger Umsteiger von VB6 einfach nicht weiter.
    Eine komplette Form (mit samt ihren Controls und Bildern) abdunkeln möchte ich.
    Gefunden habe ich als einzige Möglichkeit, mit dem opacity zu arbeiten.
    Dieses gibt es nur bei der Form, also: Form auf Form.
    In der MSDN-Datenbank habe ich ein Beispiel gefunden, dass mir eine Form aber nur als "Modal Box",
    also ausserhalb meiner Form als Extrafenster darstellt.

    Ich möchte sie aber übereinander, gleichzeitig darstellen.
    Was mache ich falsch? Geht das überhaupt so "einfach"?

    Hier meine vergeblichen Mühen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Me.Size = New Size(500, 500)
    4. Me.BackColor = Color.Azure
    5. Panel1.Size = New Size(300, 300)
    6. Panel1.BackColor = Color.Coral
    7. Dim form2 As New Form()
    8. form2.Text = "So will ich die Form haben, aber über einer zweiten Form, gleichzeitig!"
    9. form2.BackColor = Color.Black
    10. form2.Opacity = 0.5
    11. form2.Size = New Size(300, 300)
    12. form2.StartPosition = FormStartPosition.CenterScreen
    13. form2.BringToFront()
    14. form2.Dock = DockStyle.Fill
    15. form2.Opacity = 0.5
    16. 'Als "modal dialog box" geht es hier
    17. form2.ShowDialog(Me)
    18. Dim f2 As New Form()
    19. f2.Text = "Wie hier Transparenz erzeugen?"
    20. f2.BackColor = Color.Black
    21. f2.Opacity = 0.5
    22. f2.BringToFront()
    23. f2.Dock = DockStyle.Fill
    24. f2.TopLevel = False
    25. f2.Show()
    26. Panel1.Controls.Add(f2)
    27. 'Me.Controls.Add(f2) bringt die neue Form hinter das Panel1 ?
    28. f2.TopMost = True
    29. End Sub
    30. End Class
    Du könntest versuchen, mit GDI+ ein Rechteck über das gesamte Formular zu zeichnen, das nach und nach an Alpha-Wert gewinnt.

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' du brauchst einen Timer, dessen Intervall du beliebig einstellen kannst
    3. Private AlphaValue As Byte = 0
    4. Public Sub Verdunkeln()
    5. Timer1.Start() ' ggf. mit dem Namen des Timers ersetzen
    6. End Sub
    7. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    8. If AlphaValue < 128 Then
    9. AlphaValue += 1
    10. Refresh()
    11. Else
    12. Timer1.Stop()
    13. End If
    14. End Sub
    15. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
    16. If AlphaValue > 0 Then
    17. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(AlphaValue, 0, 0, 0)), ClientRectangle)
    18. End If
    19. End Sub
    20. End Class
    Allerdings denke ich, dass die Controls auf dem Form am Schluss gezeichnet werden, weshalb es sein kann, dass sie sich über dem Rechteck befinden.
    Am besten probierst du den Code einfach mal aus.

    // Edit: Okay, ~blaze~ hat es soeben bestätigt, mein Code dunkelt die Controls leider nicht ab.