forme Animating redimensionne en VB.NET
Question
J'ai une forme positionnée légèrement au-dessus de la barre des tâches plateau / système dans le coin en bas à droite de ma fenêtre de bureau. Il est un peu comme une notification pop-up. La notification elle-même ressemble beaucoup, mais il y a un bouton sur ce qui redimensionne la forme en animant le dimensionnement par incréments de 5 pixels tout en conservant sa position par rapport au coin inférieur droit de l'écran.
Le problème est qu'il ne semble pas très lisse. Réglage Me.Width redimensionne de la gauche, donc vous devez déplacer alors la forme vers la gauche avec Me.Left pour compenser. Me.SetBounds semble juste être une enveloppe pour la définition de ces propriétés de toute façon.
Est-ce que je peux faire pour avoir la forme en douceur (ou au moins semblent) redimensionner vers l'extérieur à partir de la gauche du formulaire?
La solution
ETA: Vous pouvez réellement faire en utilisant SetBounds
, comme SetBounds
déléguera à SetBoundsCore
qui, à son tour invoquer SetWindowPos
. Donc SetBounds
sera vraiment mis en interne toutes les limites à la fois et le gestionnaire de fenêtres redessiner la seule fenêtre après toutes les propriétés sont définies.
Une autre option serait d'importer le MoveWindow
fonction et utiliser à la place. Elle produit une animation douce ici, car il peut définir la taille et la position en même temps avant dire le gestionnaire de fenêtres pour redessiner la fenêtre.
Mon code de test ressemblait à ceci (converti de C # via IL à VB avec l'aide de réflecteur):
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
Autres conseils
Je ne ai jamais essayé, mais avez-vous essayé de définir la propriété DoubleBuffer de la forme à vrai? Cela devrait lisser le dessin.
Vous pouvez essayer de réduire les étapes de pixels, il est incrémenter jusqu'à 1-2 ainsi, 5px semble beaucoup à ajuster la taille, je pouvais voir comment cela pourrait apparaître saccadé.