FormBorderStyle = None bewegen

    • VB.NET

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

      FormBorderStyle = None bewegen

      Hi,

      hier geb ich euch mal einen Code, womit ihr eure Form bewegen könnt:
      (Viele nehmen MausPosition aber ich hab MausLocation genommen!)

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private MausLocation As Point
      3. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
      4. If e.Button = Windows.Forms.MouseButtons.Left Then
      5. MausLocation = e.Location
      6. End If
      7. End Sub
      8. Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
      9. If e.Button = Windows.Forms.MouseButtons.Left Then
      10. Me.Location = e.Location - MausLocation + Me.Location
      11. End If
      12. End Sub
      13. End Class


      Also bei mir geht alles einwandfrei... Bei Fehlern bitte im Thema posten.


      Greets :thumbsup: :

      8o PhThMaster99 8o

      VB.NET-Quellcode

      1. 'Place this code anywhere on your form code
      2. #Region " ClientAreaMove Handling "
      3. Const WM_NCHITTEST As Integer = &H84
      4. Const HTCLIENT As Integer = &H1
      5. Const HTCAPTION As Integer = &H2
      6. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
      7. Select Case m.Msg
      8. Case WM_NCHITTEST
      9. MyBase.WndProc(m)
      10. If m.Result = HTCLIENT Then m.Result = HTCAPTION
      11. 'If m.Result.ToInt32 = HTCLIENT Then m.Result = IntPtr.op_Explicit(HTCAPTION) 'Try this in VS.NET 2002/2003 if the latter line of code doesn't do it... thx to Suhas for the tip.
      12. Case Else
      13. 'Make sure you pass unhandled messages back to the default message handler.
      14. MyBase.WndProc(m)
      15. End Select
      16. End Sub
      17. #End Region


      Funktioniert genau so super.

      Mit eigenem Rand?

      Wie mache ich das wenn ich mit einer PictureBox einen eigenen Rand eingefügt habe?

      Danke im Vorraus
      Deutron

      EDIT: Ich habe es.Weiter runter. Trotzdem danke für die Hife

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Deutron“ () aus folgendem Grund: Lösung unten

      ist auch nicht wirklich gerade das einfachste :P
      vorallem ist es nicht wirklich performant mit PictureBoxen ein "Style" zu machen...lass die PictureBoxen weg und zeichne mit GDI+ deinen Style direkt auf das Formular, dann kannst du diesen Code auch anwenden...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Hallo Visual Basic-er

      ich habe die Lösung. Ich habe es wie folgt gemacht:

      1. Den oben beschriebenen Code auf die Form (mit FormBorderStyle = None) anwenden.
      2. Dann ein Panel auf den Bereich ziehen mit dem man die Form nicht verschieben soll.

      Da sich der Code nur auf die Form bezieht kann man ihn mit einem Panel "ausstricksen".

      Ich hoffe es hat einigen geholfen. Verbesserungsvorschlage nehme ich gerne an.

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

      nikeee13 schrieb:

      Hat wer eine Idee, wie man das ganze so schreiben kann, dass die Win7-Mausgesten unterstützt werden?

      Ich hab die Lösung gefunden.
      Man muss die WndProc der Form überschreiben. Danach muss die Message WM_NCHITTEST abgefangen werden. Wenn man das hat, muss man die Property Result des Funktionsparameters m auf einen neuen IntPtr gesetzt werden. Dieser IntPtr kommt von dem Integer-Wert 2 (also New IntPtr(2)). Den restlichen Form-Mover-Kram dieses Threads kann man dann verwerfen, mehr braucht man nicht.

      Schon hat man auch Win7-Mausgesten. ;)

      Edit:
      In code würde das so aussehen:

      VB.NET-Quellcode

      1. Public Class MovableForm
      2. Private Const WM_NCHITTEST As Integer = &H84
      3. Private Shared HitTestResult as IntPtr = New IntPtr(2)
      4. Protected Overrides Sub WndProc(ByRef m As Message)
      5. If m.Msg = WM_NCHITTEST Then
      6. ' Hier muss geprüft werden, ob die Form bewegt werden soll (z. B: ob die Maus in einem bestimmten Gebiet ist)
      7. ' Wenn ja, dann das Result auf den IntPtr setzen.
      8. m.Result = HitTestResult
      9. Else
      10. MyBase.WndProc(m)
      11. End If
      12. End Sub
      13. End Class


      Wie das funktioniert?
      Windows sendet beim Mausklick auf die Form an das Fenster eine Nachricht (WindowMessage z. B. via SendMessage), und erwartet eine Antwort (m.Result). Diese Antwort gibt an, ob die NonClient-Area getroffen ("gehittet") wurde. Wenn ja, wird das Fenster dann bewegt. Die "Frage" heißt deshalb WM_NCHITTEST.
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „nikeee13“ () aus folgendem Grund: IC-Tags + Erklärung eingefügt

      auch ne möglichkeit ne Form zuverschieben in mit FormBorderstyle = none

      is diese hier...

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Declare Function ReleaseCapture Lib "user32" () As Integer
      3. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
      4. ByVal hwnd As Integer, _
      5. ByVal wMsg As Integer, _
      6. ByVal wParam As Integer, _
      7. ByRef lParam As Object) As Integer
      8. Private Const HTCAPTION As Short = 2
      9. Private Const WM_NCLBUTTONDOWN As Short = &HA1S
      10. Private Const WM_SYSCOMMAND As Short = &H112S
      11. Function hasClickedOnBorder(ByVal mA As MouseEventArgs, ByVal borderSize As Integer, ByVal mB As MouseButtons) As Boolean
      12. Dim r As New Rectangle(borderSize, borderSize, ClientSize.Width - 2 * borderSize, ClientSize.Height - 2 * borderSize)
      13. Return (mA.Button = mB) And (Not r.Contains(mA.Location))
      14. End Function
      15. Private Sub ToolStrip1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ToolStrip1.MouseDown
      16. ReleaseCapture()
      17. SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0)
      18. End Sub
      19. End Class


      MFG