Анимационная форма изменяет размер в VB.NET - PullRequest
0 голосов
/ 06 августа 2009

У меня есть форма, расположенная чуть выше панели задач / панели задач в правом нижнем углу окна рабочего стола. Это как всплывающее уведомление. Само уведомление выглядит великолепно, но на нем есть кнопка, которая изменяет размеры формы вверх, анимируя размер с шагом 5 пикселей, сохраняя при этом свою позицию относительно правого нижнего угла экрана.

Проблема в том, что это выглядит не очень гладко. Регулировка Me.Width изменяет размеры слева, поэтому вам нужно переместить форму влево с помощью Me.Left для компенсации. Me.SetBounds кажется, в любом случае, оболочкой для установки этих свойств.

Могу ли я что-нибудь сделать, чтобы форма плавно (или, по крайней мере, выглядела так) изменила размеры слева от формы?

Ответы [ 3 ]

4 голосов
/ 06 августа 2009

ETA: Вы можете сделать это, используя SetBounds, так как SetBounds делегирует SetBoundsCore, что, в свою очередь, вызывает SetWindowPos. Таким образом, SetBounds внутренне действительно установит все границы сразу, а диспетчер окон будет перерисовывать окно только после . Все свойства установлены.


Другой вариант - импортировать функцию MoveWindow и использовать ее вместо этого. Здесь он производит плавную анимацию, поскольку он может одновременно задавать размер и положение перед , сообщая диспетчеру окон перерисовать окно.

Мой тестовый код выглядел так (преобразован из C # через IL в VB с помощью Reflector):

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
0 голосов
/ 06 августа 2009

Вы можете попытаться уменьшить шаг пикселя, который увеличивается с 1 до 1-2, 5px кажется слишком большим для настройки размера, я мог видеть, как это может выглядеть прерывисто.

0 голосов
/ 06 августа 2009

Я никогда не пробовал этого, но вы пытались установить для свойства DoubleBuffer формы значение True? Это должно сгладить рисунок.

...