>我有一个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