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