【问题标题】:Animating form resize in VB.NET在 VB.NET 中动画形式调整大小
【发布时间】:2009-08-06 13:14:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: vb.net forms resize setbounds


    【解决方案1】:

    ETA:您实际上可以使用SetBounds 来执行此操作,因为SetBounds 将委托给SetBoundsCore,而SetBoundsCore 又将调用SetWindowPos。所以SetBounds 将在内部真正一次设置所有边界,并且窗口管理器将仅在 设置所有属性后重绘窗口。


    另一种选择是导入MoveWindow function 并改用它。它在这里产生了一个平滑的动画,因为它可以同时设置大小和位置之前告诉窗口管理器重绘窗口。

    我的测试代码如下所示(在 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
    

    【讨论】:

    • 对不起,我花了这么长时间才标记这个答案,我只是在你编辑它之后才注意到它。 MoveWindow 功能完美运行。
    • 还请注意,您可以使用SetBounds,因为它确实在下面调用MoveWindow,因此应该可以正常工作。
    【解决方案2】:

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

    【讨论】:

    • 我认为 OP 所指的不稳定来自这样一个事实,即您必须一个接一个地设置 Width 和 Left 属性,并且在表单之间已经移动/调整了大小。双缓冲可能适用于 表单上的内容,但不适用于表单本身,因为移动和调整它的大小首先是窗口管理器的工作。
    • 是的,我很想看看这是否有可能真正实现。调整窗体的大小,使宽度同时向左和向右增长。这会很酷。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 2017-03-25
      相关资源
      最近更新 更多