我在桌面窗口右下角的任务栏/系统托盘上方有一个表格。这有点像弹出通知。通知本身看起来很棒,但上面有一个按钮,可以调整表单的大小,以 5px 的增量为大小设置动画,同时保持它相对于屏幕右下角的位置。
这样做的问题是它看起来不是很平滑。调整Me.Width从左侧调整大小,因此您必须使用Me.Left将表单向左移动以进行补偿。Me.SetBounds 似乎只是设置这些属性的包装器。
我可以做些什么来使表单从表单的左侧顺利(或至少看起来)向外调整大小?
ETA:您实际上可以使用 来执行此操作SetBounds
,SetBounds
委托给SetBoundsCore
which 将调用SetWindowPos
. 所以SetBounds
将在内部真正一次设置所有边界,并且窗口管理器仅在设置所有属性后才会重绘窗口。
另一种选择是导入该MoveWindow
函数并使用它。它在这里产生了一个平滑的动画,因为它可以在告诉窗口管理器重绘窗口之前同时设置大小和位置。
我的测试代码看起来像这样(在 Reflector 的帮助下从 C# 通过 IL 转换为 VB):
Private button1 As Button
Private components As IContainer = Nothing
Private tm As Timer = New Timer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
MyBase.Left = (Screen.PrimaryScreen.WorkingArea.Width - MyBase.Width)
MyBase.Top = (Screen.PrimaryScreen.WorkingArea.Height - MyBase.Height)
Me.tm.Enabled = False
Me.tm.Interval = 20
AddHandler Me.tm.Tick, Function
If (MyBase.Width < 500) Then
Form1.MoveWindow(MyBase.Handle, (MyBase.Left - 5), (MyBase.Top - 5), (MyBase.Width + 5), (MyBase.Height + 5), True)
Else
Me.tm.Enabled = False
End If
End Function
End Sub
<DllImport("user32.dll", SetLastError:=True)> _
Friend Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
End Function
我从未尝试过,但是您是否尝试过将表单的 DoubleBuffer 属性设置为 True?这应该使绘图平滑。
您也可以尝试将其递增到 1-2 的像素步长减小,5px 似乎需要调整大小,我可以看到这会显得波涛汹涌。