• Keine Ergebnisse gefunden

Die Trackbar

Im Dokument Win32API-Tutorials für Delphi (Seite 101-104)

4. CommonControls

4.6. Die Trackbar

4.6.1. Das Trackbar-Control erzeugen

Erzeugt wird die Trackbar wie jedes andere Fenster mit der Funktion "CreateWindowEx", wobei die Fensterklasse msctls_trackbar32 heißt (oder alternativ TRACKBAR_CLASS):

hredTB := CreateWindowEx(0, 'msctls_trackbar32', '', WS_VISIBLE or WS_CHILD or WS_TABSTOP or TBS_TOP or TBS_AUTOTICKS or TBS_TOOLTIPS,

10, 15, 275, 35, hWnd, 0, hInstance, nil);

InitCommonControlsEx

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

4.6.2. Fensterstile der Trackbar

Ich stelle hier gleich noch die Fensterstile vor, die ich auch in meinem Programm verwendet habe. Weitere lassen sich im MSDN oder im PSDK nachschlagen:

Wert Beschreibung

TBS_TOP Die Teilstriche werden oberhalb angezeigt.

TBS_BOTH Die Teilstriche werden oberhalb und unterhalb angezeigt.

TBS_AUTOPTICKS Der Abstand der Teilstriche wird automatisch gesetzt. Der Abstand kann mit der Nachricht

"TBM_SETTICFREQ" bestimmt werden.

TBS_TOOLTIPS Beim Bewegen des Sliders wird der aktuelle Wert als Tooltip angezeigt.

4.6.3. Trackbar-Nachrichten

Mit den im Beispielprogramm verwendeten folgenden Nachrichten wird das Verhalten der Trackbar noch weiter definiert bzw. beeinflusst:

Wert Beschreibung

TBM_SETRANGE Mit dieser Nachricht wird der Wertebereich der Trackbar bestimmt, sprich: der minimale und maximale Wert, der eingestellt werden kann.

TBM_SETTICFREQ Verwendet man beim Erstellen der Trackbar den Fensterstil "TBS_AUTOTICKS", kann man mit dieser Nachricht den Abstand der Teilstriche festlegen.

TBM_SETLINESIZE Der Slider der Trackbar kann auch mit den Pfeiltasten bewegt werden. Mit dieser Nachricht legt man fest, um wie viele Einheiten der Slider bewegt werden soll.

TBM_SETPAGESIZE Entsprechende Nachricht für die "Bild auf"- und "Bild ab"-Tasten.

Auch hier habe ich nur die wichtigsten aufgeführt. Weitere Nachrichten sind im MSDN oder PSDK zu finden.

Die Nachricht "TBM_SETRANGE" braucht wohl noch eine Erläuterung wegen des zweiten Parameters. Schauen wir uns das mal im Code an:

SendMessage(hredTB, TBM_SETRANGE, Integer(TRUE), MAKELONG(0,255));

In C ist "MAKELONG" ein Makro, das aus zwei Integerwerten einen 32-Bit-Wert generiert. Bei lParam handelt es sich nämlich um einen 32-Bit-Wert, während wParam früher auf 16-Bit-Systemen ein 16-Bit-Wert war. Heutzutage handelt es sich aber auch bei wParam um einen 32-Bit-Wert.

Aus dieser Tatsache lässt sich auch das "w" vor wParam und das "l" vor lParam erklären: "w" stand wohl für WORD und

"l" für LONGWORD.

Das heißt für uns konkret: das niederwertige Wort legt die untere Grenze des Wertebereichs fest und das höherwertige Wort die obere Grenze.

4.6.4. Funktionsweise des Programms

Hier nun noch ein paar Anmerkungen zur Funktionsweise des Programms: Verändert man die Position des Schiebereglers einer Trackbar, wird von Windows die Fensternachricht "WM_HSCROLL" an das Fenster gesendet.

Hinweis

Wenn Sie einen vertikalen Regler erzeugen (dazu benutzen Sie das Stilattribut TBS_VERT), dann müssen Sie stattdessen die Nachricht "WM_VSCROLL" bearbeiten. "WM_HSCROLL" wird nur bei den normalen, horizontalen Reglern gesendet. Abgesehen davon sind aber alle nachfolgenden Informationen identisch. Zur Anschauung finden Sie im Ordner mit den Beispielprogrammen eine zweite Variante namens "Vertical.dpr".

Im niederwertigen Wort von wParam steckt der Benachrichtigungscode, der Auskunft gibt, wie der Benutzer die Position des Schiebereglers verändert hat (ob mit der Maus, den Pfeiltasten, oder ob er mit der Maus links oder rechts neben den Schieberegler geklickt hat ... wie auch immer ...). Auf alle Möglichkeiten habe ich im Programm reagiert.

WM_HSCROLL:

begin

case LoWord(wParam) of

TB_THUMBTRACK, // ziehen des "Sliders"

TB_TOP, // Pos1 TB_BOTTOM, // Ende

TB_LINEUP, // Pfeiltasten links/rechts TB_LINEDOWN, // Pfeiltasten oben/unten

TB_PAGEDOWN, // Bild runter & in die Leiste geklickt TB_PAGEUP: // Bild auf & in die Leiste geklickt begin

// entsprechende Aktion auslösen end;

end;

end;

Bleibt noch das höherwertige Wort von wParam: hier steht die aktuelle Position des Schiebereglers.

Benötigt man eine Identifikation, welcher Schieberegler die Nachricht gesendet hat, so braucht man nur den lParam auszulesen, in dem das Handle der entsprechenden Trackbar übergeben wird. Ich habe darauf verzichtet und es mir einfach gemacht:

Muss ein Fenster neu gezeichnet werden (weil der Fensterinhalt ungültig geworden ist, weil es verdeckt oder verschoben wurde ...), bekommt es eine "WM_PAINT"-Nachricht. Hier kann man entsprechende Zeichenoperationen durchführen. Ich lese z.B. an dieser Stelle im Programm die Positionen der Schieberegler aus, erzeuge mit "CreateSolidBrush" einen Pinsel mit Hilfe dieser Werte, und fülle damit ein, mit einem TRect-Record festgelegtes Rechteck:

WM_PAINT:

begin

dc := BeginPaint(hWnd, ps);

red := Sendmessage(hredTB, TBM_GETPOS, 0, 0);

green := Sendmessage(hgreenTB, TBM_GETPOS, 0, 0);

blue := Sendmessage(hblueTB, TBM_GETPOS, 0, 0);

rect.Top := 160;

rect.Left := 0;

rect.Bottom := WindowHeight;

rect.Right := WindowWidth;

brush := CreateSolidBrush(RGB(red, green, blue));

FillRect(dc, rect, brush);

end;

Des Weiteren gebe ich die aktuellen Farbwerte als invertierten Text aus. Invertiert deshalb, damit man sie auch noch lesen kann. Dazu setze ich den Hintergrundfarbmodus mit "SetBkMode" auf transparent, bastle mir den jeweiligen String zusammen und gebe ihn mit "TextOut" direkt auf dem Fenster aus.

Für diese Aktionen ist ein "DeviceContext", (ein Handle auf die Zeichenfläche) nötig, den man mit "BeginPaint"

bekommt. Der Parameter, ein TPaintStruct-Record, interessiert uns dabei aber nicht - wir brauchen nur den Rückgabewert: unseren "DeviceContext".

Wichtig ist, dass wir unsere Zeichenaktionen mit "EndPaint" wieder abschließen und Windows so mitteilen, das wir mit dem Aktualisieren unseres Fensters fertig sind. Tun wir dies nicht, bekäme unser Programm laufend weiter

"WM_PAINT"-Nachrichten. Schlimmstenfalls reagiert unser Programm dann gar nicht mehr.

Und da ich nicht warten will, bis das Fenster neu gezeichnet werden muss, erzwinge ich das Neuzeichen mit Hilfe von

"InvalidateRect". Aber das passiert in der o.g. Bearbeitung der "WM_HSCROLL"-Nachricht:

InvalidateRect(hWnd, nil, TRUE);

Hinweis

Mit Zeichen- und Textausgabeoperationen werde ich mich in einem anderen Tutorial noch mal ausführlicher befassen.

Im Dokument Win32API-Tutorials für Delphi (Seite 101-104)