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.
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);
Mit Zeichen- und Textausgabeoperationen werde ich mich in einem anderen Tutorial noch mal ausführlicher befassen.