• Keine Ergebnisse gefunden

Fortschrittsanzeige

Im Dokument Win32API-Tutorials für Delphi (Seite 76-79)

4. CommonControls

4.1. Fortschrittsanzeige

4.1.1. Die Fortschrittsanzeige erzeugen

Die Fortschrittsanzeige wird allgemein zum Überbrücken gewisser Wartezeiten benutzt. Das kann das Laden einer Datei sein, das Kopieren der selben, der Download ... usw. usw. Das Control wird mit der Funktion "CreateWindowEx"

erzeugt. Bei den Stilattributen verweise ich Sie wieder auf das MSDN und die Hilfe; lediglich auf dieses Attribut möchte ich näher eingehen:

Wert Bedeutung

PBS_SMOOTH Mit Windows 95 kam die neue Form der Fortschrittsanzeige, die den Status mit Blöcken darstellt.

Standardmäßig verwendet das Control natürlich diese Anzeigeform. Mit dem links gezeigten Stilattribut können Sie allerdings die alte Form des Fortschrittsbalkens verwenden.

Im Beispielprogramm sieht der Aufruf so aus:

hwndProgress := CreateWindowEx(0, 'msctls_progress32', nil, WS_CHILD or WS_VISIBLE or PBS_SMOOTH, 10, 30, 270, 15, hWnd, 0, hInstance, nil);

InitCommonControlsEx

Wenn Sie den Befehl "InitCommonControlsEx" verwenden, müssen Sie für die dwICC-Membervariable die Klasse ICC_PROGRESS_CLASS benutzen.

4.1.2. Laufweite und Schritte einstellen

Standardmäßig beträgt der minimale Wert Null und der maximale Wert 100. Das sollte in den meisten Fällen ausreichend sein (zumal Sie mit "MulDiv" elegant um die evtl. lästige Prozentrechnung herumkommen ... ;o)), aber natürlich haben Sie die Möglichkeit den Arbeitsbereich der Fortschrittsanzeige selbst festzulegen. Dazu benutzen Sie die Nachricht

"PBM_SETRANGE", der Sie den minimalen und maximalen Wert im zweiten Parameter übergeben. Das hört sich evtl.

komplizierter aus als es in Wirklichkeit ist. Um z.B. die Laufweite auf die Werte 1 und 20 einzugrenzen, genügt dieser Befehl:

SendMessage(hwndProgress,PBM_SETRANGE,0,MAKELPARAM(1,20));

Für die Änderung der Schrittanzahl verwenden wir "PBM_SETSTEP". Standardmäßig ist die Anzahl 10, d.h. bei jedem Aufruf von "PBM_STEPIT" wird der Fortschrittsbalken um diese Anzahl erhöht. Die neue Schrittanzahl geben wir dabei im ersten Parameter an:

SendMessage(hwndProgress,PBM_SETSTEP,5,0);

4.1.3. Den Progress-Status ändern

Zum Ändern des Status der Fortschrittsanzeige stehen Ihnen zwei Nachrichten zur Verfügung. Das Beispielprogramm nutzt "PBM_STEPIT" zur schrittweisen Erhöhung der Anzeige. Hier sind keine Parameter nötig, da die Schrittanzahl ja bereits festgelegt worden ist. Die Anweisung lautet also ganz einfach nur:

SendMessage(hwndProgress, PBM_STEPIT, 0, 0);

Die zweite Variante wäre "PBM_SETPOS", wobei Sie hier die neue Position angeben. Die zuvor eingestellte Anzahl der Schritte spielt dabei keine Rolle. Die Nachricht erwartet im ersten Parameter die neue Position. Im Beispielprogramm wird auf diese Weise - beim Erreichen der höchsten Position - die Fortschrittsanzeige auf Null zurückgesetzt:

SendMessage(hwndProgress, PBM_SETPOS, {neue Position ->} 0, 0);

4.1.4. Die Farbe des Controls ändern

Eine beliebte Frage in diversen Foren ist: Wie kann ich die Farbe der Fortschrittsanzeige ändern? Der Objektinspektor von Delphi enthält bisher keine Möglichkeit, diesen Wunsch zu erfüllen. Dafür bietet das API aber die beiden Nachrichten

"PBM_SETBARCOLOR" und "PBM_SETBKCOLOR".

Diese Nachrichten erwarten im lparam den neuen Farbwert, den man am einfachsten als RGB-Wert übergeben kann.

Für ein dunkles Rot als Balken ist so z.B. diese Anweisung erforderlich:

SendMessage(hwndProgress,PBM_SETBARCOLOR,0,RGB($90,0,0));

Und einen schwarzen Hintergrund erhält man mit der Zeile:

SendMessage(hwndProgress,PBM_SETBKCOLOR,0,RGB(0,0,0));

Im Beispielprogramm wird dies mit Hilfe des Compilerschalter CHANGECOLOR demonstriert.

Hinweise

Bei der VCL kann, dem ersten Anschein nach, nur die Vordergrundfarbe verändert werden. Tests mit einer anderen Hintergrundfarbe verliefen leider ergebnislos. Der o.g. Codeausriss verursacht bei API-Programmen allerdings keinerlei Probleme.

Außerdem sind solche "Farbenspiele" nicht in jedem Fall empfehlenswert. Der Anwender wird sicher seine eigenen Vorstellungen bezüglich der Farben seines Systems haben, und diese sollten Sie nicht ignorieren. Es macht keinen besonders guten Eindruck, wenn sich Ihr Programm über die Einstellungen des Anwenders hinwegsetzt und eigene Farben nutzt, die u.U. im Gegensatz zu denen stehen, die der Anwender bevorzugt.

4.1.5. Der „Marquee“-Stil unter Windows XP

Unter Windows XP kennt die Fortschrittsanzeige einen neuen zusätzlichen Stil, den Sie benutzen können wenn Sie die Dauer einer Aktion nicht abschätzen können. Dabei wird die Fortschrittsanzeige nicht schrittweise erhöht, sondern eine festgelegte Anzahl an "Blöcken" bewegt sich von links nach rechts.

Um diesen Effekt zu erreichen sind allerdings die Common Controls 6.0 erforderlich. Das bedeutet, dass Sie Ihrer Anwendung eine Manifestdatei beilegen müssen. Damit ist auch klar, warum dieser Stil min. Windows XP voraussetzt.

Sie erzeugen die Fortschrittsanzeige wie am Anfang dieses Tutorials gezeigt, benutzen aber das neue Stilattribut PBS_MARQUEE:

hwndXP := CreateWindowEx(0,PROGRESS_CLASS,nil, WS_CHILD or WS_VISIBLE or PBS_MARQUEE,10,60, 270,15,wnd,IDC_XPPROGRESS,hInstance,nil);

Auf die Verwendung des PBS_SMOOTH-Attributes sollten Sie aber verzichten. Der Fortschrittsbalken würde zwar ebenfalls in der neuen Form animiert werden, allerdings ist er viel zu klein:

Wenn die Themes von Windows XP aktiv sind, dann spielt die Gestaltung (ob PBS_SMOOTH oder nicht) keine Rolle, weil in dem Fall ohnehin die jeweiligen Theme-Grafiken verwendet werden. Da Sie allerdings nicht voraussetzen können, dass jeder Windows XP-Benutzer auch die Themes aktiviert hat, sollten Sie besser bei der normalen Blockansicht bleiben:

Die Animation starten und stoppen

Zum Starten der Animation steht Ihnen die neue Progressbar-Nachricht "PBM_SETMARQUEE" zur Verfügung, die als wparam den Status (true, false) und als lparam die Anzahl der Millisekunden für die Animation erwartet. Um den Fortschrittsbalken bspw. mit einer Geschwindigkeit von 40 Millisekunden zu bewegen, schreiben Sie:

SendMessage(hwndXP,PBM_SETMARQUEE,WPARAM(true),40);

Wenn Sie die Animation stoppen wollen, ist die Zeitangabe irrelevant. Hier ist nur wichtig, dass Sie false im wparam benutzen:

SendMessage(hwndXP,PBM_SETMARQUEE,WPARAM(false),0);

Das Beispielprogramm erzeugt eine zusätzliche Fortschrittsanzeige in diesem Stil. Voraussetzung ist, dass min. Windows XP aktiv ist, andernfalls sehen Sie lediglich eine Hinweismeldung ... :o)

Im Dokument Win32API-Tutorials für Delphi (Seite 76-79)