Panel durch die Form sehen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von DosiSoft.

    Panel durch die Form sehen

    Hey,

    Habe eine Form im Vollbildmodus erstellt.
    Darauf liegt ein Panel.
    Dieses Panel kann ich bereits verschieben.
    Nun soll an der Stelle, wo das Panel liegt dieses unsichtbar sein, was ich ebenfalls geschafft habe. Jedoch sieht man da noch die Form.
    Doch diese soll nur außerhalb des Panels zu sehen sein.
    Wie kann ich sowas bewerkstelligen?

    Habe es der Verständlichkeit halber mal grafisch dargestellt:



    Danke schonmal.

    Grüße
    Ich bin mir ziemlich sicher, dass es dafür eine schönere Variante gibt, aber so funktionierts:

    Form > Eigenschaft > TransparentKey > Farbe auswählen
    Panel > BackColor > Gleiche Farbe auswählen

    Man beachte, dass dann diese Farbe immer transparent dargestellt wird!
    Wenn du Bilder auf deiner Form hast, kann das ein Problem werden --> Siehe Bild (Links ist ein Panel mit Hintergrundfarbe, rechts eine PictureBox mit Bild)



    Greez
    Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Diese Eigenschaft kannte ich noch garnicht. ^^ Danke.
    Allerdings gibt es noch ein kleines Problem:
    Wenn ich nun dieses Panel zur Laufzeit verschieben möchte, minimiert sich die Form, da anscheinend durch das transparente Panel geklickt wird.
    Kann man das irgendwie fixen?

    Danke schonmal.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DosiSoft“ ()

    Okey, ich hab's nach bisschen hirnen hingekriegt.

    Das kann man sicher schöner machen, aber es funktioniert (Falls jemand weiss wie, melden. Würd mich auch interessieren :D )

    Ich hoffe ich habs genug kommentiert. Ansonsten frag nach ;)

    VB.NET-Quellcode

    1. Public Class Frm_MoveTransparentPanel
    2. #Region "Variablen"
    3. 'Deklarationen (Damit man einen Klick ausserhalb der Form erkennt)
    4. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
    5. 'Variablen
    6. Private MouseOutside As Boolean = False
    7. Private MouseIsPressed As Boolean = False
    8. Private MouseIsMoving As Boolean = False
    9. Private PanelPositionBeforeMove As Point
    10. 'Einstellungen
    11. Private WaittimeMouseinside As Integer = 100
    12. Private WaittimePanelmove As Integer = 100
    13. #End Region
    14. #Region "Formevents"
    15. Private Sub Frm_MoveTransparentPanel_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    16. 'Hintergrundthread starten, der Mausbewegungen analysiert
    17. bgw_mouseanalyse.WorkerReportsProgress = True
    18. bgw_mouseanalyse.RunWorkerAsync()
    19. End Sub
    20. Private Sub Frm_MoveTransparentPanel_MouseEnter(sender As Object, e As System.EventArgs) Handles Me.MouseEnter
    21. MouseOutside = False 'Maus hat Form betretten
    22. End Sub
    23. Private Sub Frm_MoveTransparentPanel_MouseLeave(sender As Object, e As System.EventArgs) Handles Me.MouseLeave
    24. MouseOutside = True 'Maus hat Form verlassen
    25. End Sub
    26. #End Region
    27. #Region "BackgroundWorker Events"
    28. Private Sub bgw_mouseanalyse_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw_mouseanalyse.DoWork
    29. While True
    30. While MouseOutside Or MouseIsMoving 'Nur wenn Maus ausserhalb
    31. 'Mausposition ermitteln
    32. Dim X As Integer = Windows.Forms.Cursor.Position.X
    33. Dim Y As Integer = Windows.Forms.Cursor.Position.Y
    34. 'Mausstatus (true = gedrückt)
    35. MouseIsPressed = (GetAsyncKeyState(1) <> 0)
    36. 'Aktion ermitteln
    37. If MouseIsMoving Then
    38. If MouseIsPressed Then
    39. 'Veränderung der Position -> Panel verschieben
    40. bgw_mouseanalyse.ReportProgress(0, New Point(X - PanelPositionBeforeMove.X, Y - PanelPositionBeforeMove.Y))
    41. Threading.Thread.Sleep(WaittimePanelmove)
    42. Else
    43. 'Nicht mehr -> Abschluss der Panel verschiebung
    44. MouseIsMoving = False
    45. PanelPositionBeforeMove = New Point(X, Y)
    46. End If
    47. Else
    48. If MouseIsPressed Then
    49. 'Überprüfen, ob erster Mausklick in Panel liegt (Falls ja, Mausbewegungen beachten)
    50. If X >= (pnl_transparent.Location.X + Me.Location.X) And X <= (pnl_transparent.Location.X + pnl_transparent.Size.Width + Me.Location.X) AndAlso Y >= (pnl_transparent.Location.Y + Me.Location.Y) And Y <= (pnl_transparent.Location.Y + pnl_transparent.Size.Height + Me.Location.Y) Then
    51. PanelPositionBeforeMove = New Point(Windows.Forms.Cursor.Position.X - pnl_transparent.Left(), Windows.Forms.Cursor.Position.Y - pnl_transparent.Top)
    52. MouseIsMoving = True
    53. End If
    54. End If
    55. End If
    56. End While
    57. Threading.Thread.Sleep(WaittimeMouseinside)
    58. End While
    59. End Sub
    60. Private Sub bgw_mouseanalyse_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw_mouseanalyse.ProgressChanged
    61. 'Panel an übergebene Position setzen
    62. pnl_transparent.Location = CType(e.UserState, Point)
    63. End Sub
    64. #End Region
    65. End Class


    Edit: Beispielprojekt angehängt

    Greez
    Dancger
    Dateien
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dancger“ ()

    Erstmal Danke für die Hilfe.

    VB.NET-Quellcode

    1. Select Case True
    2. Case MouseIsMoving & MouseIsPressed 'Veränderung der Position -> Panel verschieben
    3. bgw_mouseanalyse.ReportProgress(0, New Point(X - PanelPositionBeforeMove.X, Y - PanelPositionBeforeMove.Y))
    4. Threading.Thread.Sleep(WaittimePanelmove)
    5. Case MouseIsMoving & Not MouseIsPressed 'Nicht mehr -> Abschluss der Panelverschiebung
    6. MouseIsMoving = False
    7. PanelPositionBeforeMove = New Point(X, Y)
    8. Case MouseIsPressed 'Überprüfen, ob erster Mausklick in Panel liegt (Falls ja, Mausbewegungen beachten)
    9. If X >= (Panel1.Location.X + Me.Location.X) And X <= (Panel1.Location.X + Panel1.Size.Width + Me.Location.X) AndAlso Y >= (Panel1.Location.Y + Me.Location.Y) And Y <= (Panel1.Location.Y + Panel1.Size.Height + Me.Location.Y) Then
    10. PanelPositionBeforeMove = New Point(Windows.Forms.Cursor.Position.X - Panel1.Left(), Windows.Forms.Cursor.Position.Y - Panel1.Top)
    11. MouseIsMoving = True
    12. End If
    13. End Select


    Was genau passiert da?`Habe es mal versucht selbst herauszufinden, allerdings erscheint bei dem

    VB.NET-Quellcode

    1. Select Case True
    2. Case MouseIsMoving & MouseIsPressed '


    Ein Fehler:

    VB.NET-Quellcode

    1. Ungültige Konvertierung von der Zeichenfolge FalseTrue in Typ Boolean.


    Sobald ich den Cursor in das Panel bewege. Wie kann ich das beheben?