[WinAPI] Hintergrundfarbe einer Trackbar ändern

nitgun

Mitglied
Hallo,

ich habe mich in letzter Zeit mal ein bisschen mit der WinAPI befasst und damit versucht ein kleines Programm zu erstellen. So langsam wird das auch. Aber eine Sache stört mich gewaltig: Ich habe mir halt nach den normalen Tutorials ein Fenster erzeugt, mit dem Hintergrund (HRBUSH) COLOR_BACKGROUND. Und dann habe ich noch zwei Trackbars erzeugt. Dummerweise haben die aber eine andere Farbe, was sehr blöd aussieht. Aus diesem Grund bin ich auf der Suche nach einer Möglichkeit, die Farbe zu ändern. Nach Suche im Internet habe ich das mit:
Code:
    HDC hDC=GetDC(hwndTrack);
    SetBkColor(hDC,RGB(0,0,0));
probiert. Das zeigt aber leider keinen Erfolg (ich habe das mit RGB(0,0,0) probiert, um zu sehen, ob überhaupt irgendeine Änderung eintritt). Es wäre also toll, wenn hier jemand noch einen besseren Weg kennt.

mfg

nitgun
 
Zuletzt bearbeitet:
Servus,

Das kannst du so nicht einfach ändern.
Das klappt nur in dem du die WM_CTLCOLORSTATIC Message im Callback der Trackbar oder per Subclassing abfängst.
Beim Abfangen der Message setzt du den Hintergrund auf OPAQUE per ...
SetBkMode (wParam, TRANSPARENT)
.... und steigst aus der Callback-Funktion mit dem Brush-Handle deiner Hintergrundfarbe aus. (Return hBackGroundBrush;)

Ne andere Methode per API gibts nicht.

MfG

Wolf
 
Vielen Dank für die Antwort. Das klingt so, als wäre das grundsätzlich nicht kompliziert, allerdings stehe ich noch ein bisschen auf dem Schlauch, da ich mich ja noch nicht ganz so lange mit der API befasse.
Die erste Frage: Wie verwende ich die Callback-Funktion der Trackbar? Für meine Fensterklasse lege ich das ja selbst an und weiß, welche ich aufrufen muss. Bei der Trackbar weiß ich das aber nicht. Das wäre sowieso hilfreich, da ich noch ein paar Tastatur-Nachrichten abfangen möchte, auch wenn der Fokus auf der Trackbar liegt.
Vielleicht hilft mir aber auch das Subclassing dabei. Irgendwie klingt das für mich so, als ob es damit möglich wäre, die Nachrichten, die an die Trackbar gehen, mit in der Callback-Funktion meiner Fensterklasse abzuarbeiten (das wäre mir sowieso das Liebste, wenn ich das alles an einer Stelle abarbeiten kann und nicht zig verschiedene Funktionen dafür habe.
Wenn du mir evtl. ein kleines Codebeispiel posten könntest, wäre ich dir sehr dankbar.

mfg

nitgun
 
Servus,

Ganz einfach....
Nach dem du dein Control erstellt hast, erstellst du eine stdcall Funktion die folgendermassen ausschaut.

Code:
LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
{
   int iResult;
   int iOldproc;
   
   iOldproc = GetProp (hWnd , "oldproc");
   If (!iOldproc) Return 0;
   
   iResult = CallWindowProc (iOldproc , hWnd, umsg, wParam, lParam);
   
   switch (umsg)
   {
   Case WM_CTLCOLORSTATIC:
      {      
      Return hBrush_TrackbackColor; // Diese globale Var sollte das Handle deines Farb-Brushes enthalten.
      }
   }   
   Return iResult;
}

Dann ermittelst du das Original-Callback und schreibst dessen Handle in ein Window-Prop das du mit deinem Fenster assoziierst.

Code:
oldproc = GetWindowLong (hWnd , GWL_WNDPROC);
SetProp (hWnd , "oldproc" , oldproc);

Anschliessend weisst du dem Control die neue Funktion als Callback-Funktion zu.

Code:
SetWindowLong (hWnd , GWL_WNDPROC , (long)WndProc);

Eine globale Variable sollte ein Handle zu einem Brush mit deiner gewünschten Farbe enthalten.

Code:
hBrush_TrackbackColor = CreateSolidBrush (0xFF00FF); //rosa

MfG

Wolf
 
Vielen Dank für das Codebeispiel. Das sieht eigentlich ganz verständlich aus. Ich habe aber wie immer noch ein paar Fragen dazu:

Gehe ich recht in der Annahme, dass diese Zeile in Verbindung mit dem Oldproc-Eigenschaften dazu führt, dass die standardmäßige Callback-Funktion der Trackbar auch abgearbeitet wird?
Code:
   iResult = CallWindowProc (iOldproc , hWnd, umsg, wParam, lParam);

Und dann wollte ich noch fragen, ob es möglich ist, meine Standard-Callback-Funktion, die ich ja für das ganze Fenster ist, auch dem Trackbar zuzuweisen und damit in einer Funktion auf alle Ereignisse zu reagieren? Oder führt das zu irgendwelchen Konflikten?

mfg

nitgun
 
Ich habe das obige nachprogrammiert, aber leider lässt sich damit die Trackbar nicht einfärben. Irgendwie wird die Nachricht WM_CTLCOLORSTATIC nie ausgelöst. Die gesamte Callback-Funktion wird aber abgearbeitet. komisch komisch. Ich habe mir jetzt erstmal geholfen, in dem ich meinen Fensterhintergrund an die Trackbar angepasst habe. Das war zwar eigentlich nicht der gesuchte Weg, aber jetzt sieht es erstmal nicht mehr ganz so schauerlich aus. Ich findes es aber sehr interessant, dass keine der Systemfarben zu dem Trackbar-Hintergrund passt. Naja, ich glaube, ich muss mir doch mal den Petzold organisieren, wenn ich bei der WinAPI bleiben will, oder mich doch mit der MFC anfreunden.

mfg

nitgun
 
Ich vergass ein Detail...
Die Message wird nur vom jeweiligen Parent empfangen.
Subclassing des Controls kannst du dir also sparen.
Das findet direkt im Parent-Callback statt. (So wie ich es oben erklärte)

MfG

Wolf
 
Vielen vielen Dank. Wenn ich die WM_CTLCOLORSTATIC-Nachricht in der Nachrichtenprozedur für das Hauptfenster abarbeite klappt es super. Ich habe hier gerade als extremen Test mal einen blauen Hintergrund mit roten Trackbars. Es funktioniert....cool.

Aber der Rest mit der Nachrichtenprozedur für die Trackbars ist auch nicht vergebens gewesen, da ich damit jetzt auch Tastaturevents abfangen kann, wenn der Fokus auf einer Trackbar liegt. Das ist besonders wichtig, wenn man mittels Escape etwas beenden will.

Also nochmal vielen Dank Hroudtwolf.

Aber eine Frage habe ich noch: Woher hast du dein Wissen? Auf lange Sicht hin, will ich es ja auch mal schaffen, selbstständig programmieren zu können, ohne bei jeder Angelegenheit ein Forum aufsuchen zu müssen. Ich dachte eigentlich, dass ich mit dem MSDN weiter komme, aber das ist irgendwie nicht das Gelbe vom Ei, wenn man nicht weiß, wonach man suchen muss. Als Standardreferenz für die WinAPI wird ja meistens der Petzold empfohlen. Ist der wirklich so gut?

mfg

nitgun
 
Zurück