Изменение размера анимируемой формы в VB.NET
Вопрос
У меня есть форма, расположенная немного выше панели задач / системного трея в правом нижнем углу окна моего рабочего стола.Это что-то вроде всплывающего уведомления.Само уведомление выглядит великолепно, но на нем есть кнопка, которая увеличивает размер формы, анимируя изменение размера с шагом в 5 пикселей, сохраняя при этом его положение относительно нижнего правого угла экрана.
Проблема в том, что это выглядит не очень гладко.Настройка Я.Ширина изменяет размер слева, поэтому затем вам нужно переместить форму влево с помощью Я.Слева чтобы компенсировать это.Me.setBounds в любом случае кажется просто оболочкой для настройки этих свойств.
Могу ли я что-нибудь сделать, чтобы форма плавно (или, по крайней мере, казалось, что она изменяется) изменяла размер слева от формы?
Решение
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
Другие советы
Я никогда не пробовал этого, но вы пробовали устанавливать для свойства DoubleBuffer формы значение True?Это должно сгладить рисунок.
Вы также можете попробовать уменьшить шаги пикселя, которые он увеличивает, до 1-2, 5 пикселей кажутся слишком большими для настройки размера, я мог видеть, как это может выглядеть изменчиво.