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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top