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?

¿Fue útil?

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.

scroll top