2016-02-06 2 views
-2

У меня есть приложение 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 
+4

Вы собираетесь об этом в обратном направлении: сделать длительные интенсивные задачи на фоне рабочего, чтобы оставить пользовательский интерфейс нитку отзывчивый – Plutonix

+0

Да, это была моя первая мысль, но дело в том, что это приложение делает только одну задачу. .. и он либо выполняет одну задачу, либо полностью бездействует. Поэтому я мог бы перемещать ВСЕ в другую нить (что было бы чрезвычайно сложно) или найти способ переместить вышеперечисленные субмастеры в другой поток. – Dan

+0

Вы абсолютно * не можете * просто пойти не так. Существует только один поток пользовательского интерфейса, и все события пользовательского интерфейса должны запускаться в этом потоке. Вы не можете выполнять пользовательский интерфейс в фоновом потоке. И блокировка вашего * основного потока пользовательского интерфейса при выполнении некоторой вычислительно-интенсивной задачи - это ужасная идея, даже если вы найдете способ ее взломать (как вы, по-видимому, есть). Операционная система решит, что ваше приложение перестало отвечать на запросы, поскольку оно не отвечает на сообщения пользовательского интерфейса. Здесь очень нужна редизайн. Сделайте так, как предложил Плутоникс, и переместите долговременную задачу в BackgroundWorker. –

ответ

0

В случае, если кто-либо сталкивается с подобной ситуацией, это работает очень хорошо.

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 
Смежные вопросы