2009-08-06 6 views
0

J'ai un formulaire positionné légèrement au-dessus de la barre des tâches/barre d'état système dans le coin inférieur droit de la fenêtre de mon bureau. C'est un peu comme une notification pop-up. La notification en elle-même est superbe, mais il y a un bouton qui redimensionne le formulaire, en animant le calibrage par incréments de 5px tout en gardant sa position par rapport au coin en bas à droite de l'écran.Redimensionnement du formulaire d'animation dans VB.NET

Le problème avec ceci est qu'il ne semble pas très lisse. Ajustement Me.Width redimensionne à partir de la gauche de sorte que vous devez ensuite déplacer le formulaire vers la gauche avec Me.Left pour compenser. Me.SetBounds semble juste être un wrapper pour définir ces propriétés de toute façon.

Y a-t-il quelque chose que je peux faire pour que la forme soit (ou semble au moins) redimensionner à partir de la gauche du formulaire?

Répondre

4

ETA: Vous pouvez réellement faire en utilisant SetBounds, comme SetBounds déléguera à SetBoundsCore qui, à son tour invoquer SetWindowPos. Donc, SetBounds définira réellement toutes les limites en même temps et le gestionnaire de fenêtres redessinera la fenêtre seulement après toutes les propriétés sont définies.


Une autre option serait d'importer le MoveWindow function et utiliser à la place. Il produit une animation fluide ici, car il peut définir la taille et la position simultanément avant indiquant au gestionnaire de fenêtres de 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 
+0

Désolé, il m'a fallu si longtemps pour marquer cette réponse, je viens juste de le remarquer depuis que vous l'avez édité. La fonction MoveWindow fonctionne parfaitement. –

+0

Notez également que vous pouvez utiliser 'SetBounds', car il appelle' MoveWindow' en-dessous et devrait donc fonctionner correctement. – Joey

0

Je n'ai jamais essayé cela, mais avez-vous essayé de définir la propriété DoubleBuffer du formulaire sur True? Cela devrait lisser le dessin.

+0

Je pense que le clapotis de l'OP se réfère vient du fait que vous devez définir la largeur et les propriétés gauche l'une après l'autre et entre le formulaire est déplacé/redimensionné déjà. La double mise en mémoire tampon peut fonctionner correctement pour les objets _sur le formulaire, mais pas pour le formulaire lui-même, car le déplacer et le redimensionner est d'abord un travail pour le gestionnaire de fenêtres. – Joey

+0

Ouais, je suis très intéressé de voir si c'est possible de s'en tirer. Redimensionner un formulaire de sorte que la largeur se développe par la gauche et la droite en même temps. Ce serait plutôt cool. – jgallant

0

Vous pourriez essayer de réduire les étapes de pixel, il est incrémenté jusqu'à 1-2, 5px semble être beaucoup à ajuster la taille, je pourrais voir comment cela pourrait apparaître saccadé.

Questions connexes