簡體   English   中英

鼠標移動事件時表格閃爍過多

[英]Form flickers too much on mouse move event

我編寫了以下過程來移動和停靠無邊界窗口:

Public Class frmNavigation

    Inherits Form

    'Declarations to allow form movement on mouse down
    Private IsFormBeingDragged As Boolean = False
    Private MouseDownX As Integer
    Private MouseDownY As Integer
    Dim Xs As Integer
    Dim Ys As Integer
    Dim DockScale As Integer

Private Sub frmNavigation_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown

        'This procedure allows the user to move the form when the 
        'mouse button is down. The form does not have borders, so it
        'needs to be coded to move.

        If e.Button = MouseButtons.Left Then
            IsFormBeingDragged = True
            MouseDownX = e.X
            MouseDownY = e.Y

        End If
    End Sub

    Private Sub frmNavigation_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseUp

        'This procedure allows the user to move the form when the 
        'mouse button is up. The form does not have borders, so it
        'needs to be coded to move.

        If e.Button = MouseButtons.Left Then
            IsFormBeingDragged = False

        End If
    End Sub

    Private Sub frmNavigation_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove

        'This procedure allows the user to move the form when the 
        'mouse button is dragging the form. The form does not have borders, so it
        'needs to be coded to move.

        Dim curScreen As Screen
        curScreen = Screen.PrimaryScreen 'curScreen = Screen.AllScreens(0)
        Dim height As Integer = curScreen.Bounds.Height
        Dim width As Integer = curScreen.Bounds.Width
        width = curScreen.WorkingArea.Width
        height = curScreen.WorkingArea.Height

        If IsFormBeingDragged Then
            Dim temp As System.Drawing.Point = New System.Drawing.Point()

            Xs = MouseDownX
            Ys = MouseDownY

            temp.X = Me.Location.X + (e.X - MouseDownX)
            temp.Y = Me.Location.Y + (e.Y - MouseDownY)
            Me.Location = temp
            temp = Nothing
        End If

End Sub

End Class

到目前為止,這按設計工作,它可以移動表單而沒有任何問題。 當我添加代碼將表單停靠在鼠標移動事件下時,問題就開始了:

Private Sub frmNavigation_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove

    'This procedure allows the user to move the form when the 
    'mouse button is dragging the form. The form does not have borders, so it
    'needs to be coded to move.

    Dim curScreen As Screen
    curScreen = Screen.PrimaryScreen 'curScreen = Screen.AllScreens(0)
    Dim height As Integer = curScreen.Bounds.Height
    Dim width As Integer = curScreen.Bounds.Width
    width = curScreen.WorkingArea.Width
    height = curScreen.WorkingArea.Height

    If IsFormBeingDragged Then
        Dim temp As System.Drawing.Point = New System.Drawing.Point()

        Xs = MouseDownX
        Ys = MouseDownY

        temp.X = Me.Location.X + (e.X - MouseDownX)
        temp.Y = Me.Location.Y + (e.Y - MouseDownY)
        Me.Location = temp
        temp = Nothing
    End If

    If IsFormBeingDragged = True And e.Button = MouseButtons.Left Then
        'if the drag flag is true and left mouse button is pressed...

        'set Top side docking
        If Me.Top + (MouseDownY - Ys) < DockScale Then
            Me.Top = 0
            Exit Sub
        End If

        'set bottom side docking
        If Me.Top + (MouseDownY - Ys) + Me.Height > (height - DockScale) Then
            Me.Top = height - Me.Height
            Exit Sub
        End If

        'move the form finally
        Me.Left = Me.Left + (MouseDownX - Xs)
        Me.Top = Me.Top + (e.Y - Ys)
    End If


End Sub

當我添加用於停靠的代碼並嘗試移動表單時,它會移動並停靠,但是當按住鼠標並移動時,它會像瘋了似的閃爍。 我不知道為什么會這樣,這是我第一次涉足這種事情,所以我不確定我要去哪里。

從我看來,您應該首先檢查表單是否已對接,然后為其設置適當的位置。 就像這樣,您首先設置位置,然后設置“頂部”,所以表單被移動了兩次並且閃爍...

在帶有停靠檢查的代碼塊中,第一個“ If”塊根據鼠標位置設置到窗體的位置,然后在第二和第3個“ If”塊中根據停靠位置設置位置。 這會導致鼠標每次移動兩次。 您需要某種標志來指示表單處於停靠狀態,然后在設置此標志時完全不移動表單。

我遇到了與此類似的問題,事實證明是由表單的TransparencyKey引起的。

嘗試刪除設置的顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM