Rubrik: Grafik und Font · Grafische Effekte | VB-Versionen: VB4, VB5, VB6 | 11.07.03 |
Grafische Fortschrittsleiste Hier wird an einem Beispiel beschrieben, wie Sie eine grafische Fortschrittsleiste erstellen, bei der der Umriss einer Figur langsam ausgefüllt wird. | ||
Autor: Dartrax | Bewertung: | Views: 16.819 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
"Wie kann man so eine Fortschrittsleist erstellen?"
Genau diese Frage wurde vor kurzem im Forum gestellt.
Für die Lösung musste ich das Bild oben etwas bearbeiten und ein Maskenbild,
ein Sprite,
und ein Hintergrundbild mit der eigendlichen Laufleiste erstellen:
Alle Bilder werden in Pictureboxen eingefügt, wobei die Picturebox mit dem Hintergrundbild die Einstellung BorderStyle=0 zugewiesen bekommt und wiederum in eine Picturebox eingefügt wird. Die anderen beiden Pictureboxen werden mit der Eigenschaft Visible=False zur Laufzeit unsichtbar.
Jetzt ist noch wichtig, dass bei ALLEN Pictureboxen AutoRedraw auf True geschaltet wird!
Damit wir das Ganze auch testen können, setzen wir noch einen Timer (Interval=100, Enabled=False) und einen Button auf die Form.
Doch vorher noch der Code. Zunächst die benötigte API-Deklaration und die dazugehörigen Konstanten:
Private Declare Function BitBlt Lib "gdi32" ( _ ByVal hDestDC As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As Long) As Long ' (DWORD) dest = source AND dest Private Const SRCAND = &H8800C6 ' (DWORD) dest = source XOR dest Private Const SRCINVERT = &H660046
Jetzt programmieren wir mit dieser API eine Funktion Draw, die uns den Inhalt der beiden unsichtbaren Pictureboxen zu einem teiltransparenten Bild zusammenfügt und auf den Hintergrund zeichnet. Mit dem Parameter "Fortschritt" übergeben wir die Angabe in Pixeln, wie weit die Leiste schon vorgerückt sein soll:
Private Function Draw(Fortschritt As Integer) ' Erstellen eines Transparenten Bildes im Speicher With PicMask BitBlt PicLeiste.hDC, 0, 0, .Width, .Height, _ .hDC, 0, 0, SRCAND BitBlt PicLeiste.hDC, 0, 0, .Width, .Height, _ PicSprite.hDC, 0, 0, SRCINVERT ' Das vorherige Bild in der Leiste löschen PicLeiste.Cls ' Die Leiste an die gewünschte Position bringen PicLeiste.Left = -237 + Fortschritt ' Das Bild aus dem Speicher auf die Leiste zeichnen BitBlt PicLeiste.hDC, 237 - Fortschritt, 0, _ .Width, .Height, .hDC, 0, 0, SRCAND BitBlt PicLeiste.hDC, 237 - Fortschritt, 0, _ .Width, .Height, PicSprite.hDC, 0, 0, SRCINVERT End With End Function
Diese Draw-Funktion wird in unserem Beispiel durch den Timer aufgerufen:
Private Sub Timer1_Timer() Static Fortschritt As Integer If Fortschritt < 237 Then Fortschritt = Fortschritt + 1 Else Fortschritt = 0 Timer1.Enabled = False End If Draw Fortschritt End Sub
Starten kann man den Timer mit dem Button:
Private Sub Command1_Click() Timer1.Enabled = True End Sub
Und damit schon beim Start der Hintergrund angezeigt wird, führen wir auch beim Form_Load-Ereignis die Draw-Funktion aus, allerdings mit 0 Fortschritt!
Private Sub Form_Load() Draw 0 End Sub