modulo Animazione ridimensionare in VB.NET
Domanda
Ho una forma posizionato leggermente al di sopra della barra barra delle applicazioni / applicazioni nell'angolo in basso a destra della mia finestra del desktop. E 'un po' come una notifica pop-up. La notifica in sé sembra grande, ma c'è un pulsante su di esso che ridimensiona la forma up, animando il dimensionamento con incrementi di 5px pur mantenendo la sua posizione rispetto al nell'angolo in basso a destra dello schermo.
Il problema di questo è che non sembra molto liscia. Regolazione Me.Width ridimensiona da sinistra in modo da avere per poi spostare il modulo a sinistra con Me.Left per compensare. Me.SetBounds sembra solo essere un wrapper per impostare tali proprietà in ogni caso.
C'è qualcosa che posso fare per avere la forma senza problemi (o almeno sembra) ridimensionare verso l'esterno alla sinistra del modulo?
Soluzione
ETA: Si può effettivamente farlo usando SetBounds
, come SetBounds
delegherà a SetBoundsCore
, che, a sua volta richiamare SetWindowPos
. Così SetBounds
sarà internamente davvero impostare tutti i limiti in una volta e il window manager ridisegna la finestra unica dopo tutte le proprietà sono impostate.
Un'altra opzione sarebbe quella di importare la MoveWindow
funzione e l'uso che, invece. Produce un'animazione fluida qui, come si può impostare la dimensione e la posizione contemporaneamente prima dice il window manager per ridisegnare la finestra.
Il mio codice di prova si presentava così (convertito da C # tramite IL a VB con l'aiuto di 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
Altri suggerimenti
Non ho mai provato a farlo, ma hai provato impostando la proprietà DoubleBuffer del form su true? Questo dovrebbe lisciare il disegno.
Si potrebbe provare a ridurre le fasi di pixel è incrementali fino al 1-2 e, 5px sembra molto a regolare le dimensioni, ho potuto vedere come questo potrebbe apparire instabile.