拖放主窗体以将其重新定位到屏幕上、其他线程或后台工作线程上



>我有一个winforms应用程序,有时主线程非常繁忙。 当主线程繁忙时,我希望用户能够拖放主窗体(使用窗体顶部的 pbAppHeader 控件),以便他们可以在屏幕上重新定位主窗体。 由于主线程有时非常繁忙,因此移动主窗体非常缓慢且生涩。

如何在不同的线程或后台工作者上运行以下子,以便移动主窗体很流畅? 或者有更好的方法可以做到这一点吗?

Dim drag As Boolean
Dim mousex As Integer
Dim mousey As Integer
Private Sub pbAppHeader_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseDown
    drag = True 'Sets the variable drag to true.
    mousex = Windows.Forms.Cursor.Position.X - Me.Left 'Sets variable mousex
    mousey = Windows.Forms.Cursor.Position.Y - Me.Top 'Sets variable mousey
End Sub
Private Sub pbAppHeader_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseMove
    'If drag is set to true then move the form accordingly.
    If drag Then
        Me.Top = Windows.Forms.Cursor.Position.Y - mousey
        Me.Left = Windows.Forms.Cursor.Position.X - mousex
    End If
End Sub
Private Sub pbAppHeader_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseUp
    drag = False 'Sets drag to false, so the form does not move according to the code in MouseMove
End Sub

如果有人遇到类似的情况,这效果很好。

Public Const WM_NCLBUTTONDOWN As Integer = &HA1
Public Const HT_CAPTION As Integer = &H2
Private Sub pbAppHeader_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseDown
    If e.Button = MouseButtons.Left Then
        NativeMethods.ReleaseCapture()
        NativeMethods.SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0)
    End If
End Sub
<ComVisible(True)> Friend Class NativeMethods
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function
    <DllImportAttribute("user32.dll")> _
    Public Shared Function ReleaseCapture() As Boolean
    End Function
End Class

最新更新