我有一個自定義UserControl,它有一個StatusStrip。所以,當用戶拖動這個狀態條的角落時,我調整了這個控件的大小。但是,調整大小不是很好:在調整大小期間可以在父控件上觀察到臨時白色區域,有時如果調整大小太快,則用戶「失去」控件(停止調整大小)。優化控件大小調整
Option Infer On
Public Class FloattingGrid
Inherits System.Windows.Forms.UserControl
Dim mouseDownLocation As Nullable(Of Point)
Private Sub StatusStrip1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles StatusStrip1.MouseMove
If mouseDownLocation.HasValue Then
Dim newPosition = Cursor.Position
Dim dx = newPosition.X - mouseDownLocation.Value.X
Dim dy = newPosition.Y - mouseDownLocation.Value.Y
'Dim oldRect = New Rectangle(Me.Location, Me.Size)'
Me.Size = New Size(Me.Width + dx, Me.Height + dy)
mouseDownLocation = newPosition
If Me.Parent IsNot Nothing Then
'Me.Parent.Invalidate(oldRect) '
Me.Parent.Refresh()
End If
Else
If e.X > Me.Width - 20 Then
If Cursor <> Cursors.SizeNWSE Then Cursor = Cursors.SizeNWSE
Else
If Cursor = Cursors.SizeNWSE Then Cursor = Cursors.Default
End If
End If
End Sub
Private Sub StatusStrip1_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusStrip1.MouseLeave
Cursor = Cursors.Default
mouseDownLocation = Nothing
'Me.ResumeLayout() '
End Sub
Private Sub StatusStrip1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles StatusStrip1.MouseDown
If Cursor = Cursors.SizeNWSE Then
'Me.SuspendLayout() '
mouseDownLocation = Cursor.Position
End If
End Sub
Private Sub StatusStrip1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles StatusStrip1.MouseUp
mouseDownLocation = Nothing
'Me.ResumeLayout()'
End Sub
' Private Sub FloattingGrid_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove '
' End Sub '
Private Sub FloattingGrid_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ResizeRedraw = True
End Sub
End Class
我認爲這種行爲可以通過父母的的Invalidate引起的。有沒有辦法只是BeginInvalidate,而不是等到父節點全部失效?
有效地,在調用parent.Refresh()而不是parent.Invalidate(oldRect)之後,白色區域消失。但是,當移動速度更快時,我總是失去控制。我不調整StatusStrip的大小,我直接調整UserControl的大小(statusStrip停靠在底部) – serhio 2011-05-17 10:24:04
@serhio:是的,調用'Refresh'會立即*重繪*。這就是白色區域消失的原因。它們只是白色的,因爲Windows還沒有繪製任何東西。這樣做的副作用是計算機開始滯後,因爲它無法一下子跟上所有這一切。這就是爲什麼它通常不會畫這些區域,爲什麼當你強迫它,當你開始快速移動時,它似乎失去了控制。這是一個折中,你必須選擇哪一個更容易被你接受,或者使用雙緩衝等替代策略(這只是一個竅門,而不是真正的修復)。 – 2011-05-17 10:26:20
一個原因可能是我僅在StatusStrip_MouseMove上跟隨移動,並且如果調整大小比鼠標移動慢,那麼鼠標離開StatusStip區域並且不再調用任何移動......另一件事是Refresh()似乎重畫所有的父母,而不僅僅是控制古代地區 - 它也需要時間... – serhio 2011-05-17 10:31:52