ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
2320
2320
EMPFEHLEN
-
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: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.Code :1 2
HDC hDC=GetDC(hwndTrack); SetBkColor(hDC,RGB(0,0,0));
mfg
nitgunGeändert von nitgun (07.02.08 um 08:07 Uhr)
-
07.02.08 20:57 #2
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
-
Kann mir das mit dem Subclassing bzw der Callback-Funktion der Trackbar niemand erklären?
-
20.02.08 06:12 #5
Servus,
Ganz einfach....
Nach dem du dein Control erstellt hast, erstellst du eine stdcall Funktion die folgendermassen ausschaut.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[FONT=monospace]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; }[/FONT]
Dann ermittelst du das Original-Callback und schreibst dessen Handle in ein Window-Prop das du mit deinem Fenster assoziierst.
Code :1 2
oldproc = GetWindowLong (hWnd , GWL_WNDPROC); SetProp (hWnd , "oldproc" , oldproc);
Anschliessend weisst du dem Control die neue Funktion als Callback-Funktion zu.
Code :1
SetWindowLong (hWnd , GWL_WNDPROC , (long)[FONT=monospace]WndProc[/FONT]);
Eine globale Variable sollte ein Handle zu einem Brush mit deiner gewünschten Farbe enthalten.
Code :1
[FONT=monospace]hBrush_TrackbackColor = CreateSolidBrush (0xFF00FF); //rosa[/FONT]
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 :1
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
-
06.03.08 14:23 #8
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
-
na das werden wir doch bei Gelegenheit gleich mal ausprobieren. Vielen Dank.
-
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
Ähnliche Themen
-
Hintergrundfarbe/Attribute einer gekauften .fla Datei ändern?
Von julchen im Forum Flash PlattformAntworten: 1Letzter Beitrag: 25.08.08, 10:38 -
Hintergrundfarbe einer Zelle in einer dataGridView ändern
Von Tonelli im Forum VisualStudio & MFCAntworten: 0Letzter Beitrag: 03.03.08, 09:00 -
Hintergrundfarbe einer TextArea beim FF ändern
Von Eiszwerg im Forum CSSAntworten: 4Letzter Beitrag: 09.04.07, 21:42 -
Hintergrundfarbe einer Zelle per Formel ändern
Von Nikon the Third im Forum Office-AnwendungenAntworten: 2Letzter Beitrag: 01.05.06, 15:42 -
Hintergrundfarbe bei Texten in WINAPI ändern
Von Xebov im Forum C/C++Antworten: 3Letzter Beitrag: 22.07.05, 11:59





Zitieren
Login






