0

我在桌面窗口右下角的任务栏/系统托盘上方有一个表格。这有点像弹出通知。通知本身看起来很棒,但上面有一个按钮,可以调整表单的大小,以 5px 的增量为大小设置动画,同时保持它相对于屏幕右下角的位置。

这样做的问题是它看起来不是很平滑。调整Me.Width从左侧调整大小,因此您必须使用Me.Left将表单向左移动以进行补偿。Me.SetBounds 似乎只是设置这些属性的包装器。

我可以做些什么来使表单从表单的左侧顺利(或至少看起来)向外调整大小?

4

3 回答 3

4

ETA:您实际上可以使用 来执行此操作SetBoundsSetBounds委托给SetBoundsCorewhich 将调用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
于 2009-08-06T13:43:36.457 回答
0

我从未尝试过,但是您是否尝试过将表单的 DoubleBuffer 属性设置为 True?这应该使绘图平滑。

于 2009-08-06T13:19:22.743 回答
0

您也可以尝试将其递增到 1-2 的像素步长减小,5px 似乎需要调整大小,我可以看到这会显得波涛汹涌。

于 2009-08-06T13:21:24.347 回答