2009-08-06 17 views
0

Ich habe ein Formular, das etwas über der Taskleiste/Taskleiste in der unteren rechten Ecke meines Desktop-Fensters positioniert ist. Es ist wie eine Popup-Benachrichtigung. Die Benachrichtigung selbst sieht gut aus, aber es gibt eine Schaltfläche, die die Größe des Formulars ändert und die Größe in Schritten von 5 Pixeln animiert, während die Position relativ zur unteren rechten Ecke des Bildschirms beibehalten wird.Animieren der Formulargröße in VB.NET

Das Problem dabei ist, dass es nicht sehr glatt aussieht. Anpassung Me.Width Größe von links, so dass Sie dann das Formular nach links mit Me.Left verschieben müssen, um zu kompensieren. Me.SetBounds scheint nur ein Wrapper für die Einstellung dieser Eigenschaften zu sein.

Gibt es etwas, was ich tun kann, um das Formular reibungslos von der linken Seite des Formulars nach außen zu ändern (oder zumindest zu erscheinen)?

Antwort

4

ETA: Sie können tatsächlich tun SetBounds verwenden, wie SetBounds-SetBoundsCore delegieren SetWindowPos, die wird wiederum aufrufen. So wird SetBounds intern wirklich alle Grenzen auf einmal setzen und der Fenstermanager wird das Fenster nur neu zeichnen , nachdem alle Eigenschaften festgelegt sind.


Ein andere Möglichkeit wäre, die MoveWindow function und verwendet, die statt zu importieren. Es erzeugt hier eine glatte Animation, da es Größe und Position gleichzeitig vor festlegen kann, die dem Fenstermanager mitteilt, das Fenster neu zu zeichnen.

Mein Testcode sah dies wie (umgerechnet von C# über IL mit Hilfe VB von 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 
+0

Es hat so lange gedauert, bis ich diese Antwort markiert habe, ich habe es erst bemerkt, seit du es bearbeitet hast. Die MoveWindow-Funktion funktioniert einwandfrei. –

+0

Beachten Sie auch, dass Sie 'SetBounds' verwenden können, da' MoveWindow' darunter steht und daher gut funktionieren sollte. – Joey

0

Ich habe das nie versucht, aber haben Sie versucht, die DoubleBuffer-Eigenschaft des Formulars auf True zu setzen? Dies sollte die Zeichnung glätten.

+0

Ich denke, die choppiness die OP bezieht kommt von der Tatsache, dass Sie die Breite setzen haben und Left-Eigenschaften nacheinander und dazwischen wird das Formular bereits verschoben/skaliert. Double-Buffering funktioniert möglicherweise gut für Dinge _on_ the_, aber nicht das Formular selbst, da Verschieben und Ändern der Größe es zuerst ein Auftrag für den Fenstermanager ist. – Joey

+0

Ja, ich bin sehr interessiert zu sehen, ob das tatsächlich möglich ist. Ändern der Größe eines Formulars, sodass die Breite gleichzeitig um Links und Rechts zunimmt. Das wäre ziemlich cool. – jgallant

0

Sie könnten versuchen, die Pixelschritte zu reduzieren, die es in 1-2 erhöht auch, 5px scheint wie viel zu justieren Größe, ich könnte sehen, wie dies abgehackt erscheinen könnte.