cambiar el tamaño de forma que anima en VB.NET
Pregunta
Tengo un formulario situado ligeramente por encima de la barra de tareas / sistema en la esquina inferior derecha de la ventana de mi escritorio. Es algo así como una notificación emergente. La propia notificación se ve muy bien, pero hay un botón en el que se cambia el tamaño de la forma arriba, animando el tamaño en incrementos de 5px, mientras que mantener su posición relativa a la esquina inferior derecha de la pantalla.
El problema con esto es que no se ve muy suave. Ajuste de Me.Width cambia el tamaño de la izquierda, por lo que tiene a continuación, mover el formulario a la izquierda con Me.Left para compensar. Me.SetBounds sólo parece ser un contenedor para el establecimiento de las propiedades de todos modos.
¿Hay algo que pueda hacer para tener la forma sin problemas (o al menos parecen) cambiar el tamaño hacia el exterior desde la izquierda de la forma?
Solución
ETA: En realidad se puede hacer esto utilizando SetBounds
, como SetBounds
delegará en SetBoundsCore
el cual, a su vez, se invocará SetWindowPos
. Así se SetBounds
internamente que realmente hace que todos los límites a la vez y el gestor de ventanas se volverá a dibujar la ventana sólo después todas las propiedades se establecen.
Otra opción sería la de importar el href="http://msdn.microsoft.com/en-us/library/ms633534(VS.85).aspx" rel="nofollow noreferrer"> MoveWindow
función y utilice en su lugar. Produce una animación suave aquí, ya que puede establecer el tamaño y la posición de forma simultánea antes decirle al gestor de ventanas para volver a dibujar la ventana.
Mi código de prueba parecía esto (conversión de C # a través de IL a VB con la ayuda de 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
Otros consejos
Nunca he intentado esto, pero ¿ha intentado establecer la propiedad DoubleBuffer del formulario en true? Esto debería suavizar el dibujo.
Usted puede tratar de reducir los pasos de píxeles de incremento se reduce a 1-2, así, 5px parece mucho a estar ajustando el tamaño, pude ver cómo esto podría aparecer entrecortada.