Radiobutton Hintergrundfarbe ändern
-
Und wie kann ich dann , wenn ich in der nachricht WM_CTLCOLORBTN bin, die hintergrundfarbe von einem button ändern? Mit welcher Anweisung geht des?
BtW: Isn ganz normaler radiobutton, nix spezielles.
-
If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the background of the button.
-
gut, jetz hab ich des mal so gmacht:
case WM_CTLCOLORBTN: HBRUSH hbrush; hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH); return hbrush;fehlermeldung:
error C2440: 'return' : 'struct HBRUSH__' kann nicht in 'long' konvertiert werden
was muss ich tun, bin ratlos
-
Caste während dem return noch zu 'LRESULT'. Außerdem sei noch gesagt, dass du dich um die Destruktion des Brushes kümmern musst.
-
hm, mit LRESULT zeigt er zwar keinen fehler mehr an, aber der verdammte hintergrund bleibt so grau. Was is da falsch?
PS: Wie kann ich Destruktion machen? Müsste ich dann doch hinter return; machen, aber das wird doch nicht mehr aufgerufen, oder?
-
Ist es wirklich grau? Das ist irgendwie merkwürdig finde ich, zumal du ja ein WHITE_BRUSH zurückgibst. Am besten machst du eine statische Variable für den Brush, initialisierst ihn (am besten in WM_CREATE), und gibst ihn mit DeleteObject wieder frei (z.b. in WM_DESTROY).
EDIT: Wenn du willst, dass der Hintergrund transparent ist, dann verwende dafür den HOLLOW_BRUSH (+GetStockObject). Ich bin mir allerdings nicht absolut sicher ob das funktionieren würde

-
ja, das Problem ist, dass ich irgendeinen BRUSH übergeben kann, da passiert einfach gar nichts, auch wenn ich BLACK_BRUSH oder so was lade. So ein Mist.
Hab jetz folgendes:static HBRUSH hbrush;
WM_CREATE:
hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);WM_CTLCOLORBTN:
return (LRESULT)hbrush;WM_DESTROY:
DeleteObject(hbrush);Müsste das jetz nich gehn?
Ich verzweifel langsam.
-
So ist's eigentlich ganz gut. Wo steht dieser Code jetzt eigentlich? Hast du den Radiobutton gesubclassed, oder steht der Code in der WindowProc des Elternfensters?
-
steht in der wndproc des parentwindow
WM_CREATE:
rbnormal = CreateWindow("BUTTON", "normal", WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON, 150, 10, 100, 20, hwnd, (HMENU)ID_RBNORMAL,((LPCREATESTRUCT)lParam)->hInstance,NULL);
-
Das scheint auch ganz ok zu sein. Schau mal mit dem Debugger nach ob die WindowProc diese Nachricht überhaupt erhält.
Achja, du könntest folgendes noch verbessern:
WM_CTLCOLORBTN: if( (HWND)lParam == rbnormal ) //verhindert, dass alle buttons diesen Brush bekommen return (LRESULT)hbrush; break;
-
So langt es eigentlich schon:
case WM_CTLCOLORBTN: return (LRESULT)GetStockObject(HOLLOW_BRUSH);Die zurückgegebenen Handles von GetStockObject() darfst du sogar gar nicht freigeben

[edit]das if darfst du natürlich reinmachen, wenn irgendein Button grau sein soll[/edit]
-
However, only owner-drawn buttons respond to the parent window processing this message.
It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject.
-
toll, was soll des jetz mit owner-drawn, heißt des das mein radiobutton garkeine andre Farbe annehmen kann? Oder brauch ich ne andre Message?
-
Don't Panik! Ich wußte doch, dass irgend so eine Nachricht kommt. Es ist aber WM_CTLCOLORSTATIC.
It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject.
Unter Window 3 durfte man die glaub noch nicht freigeben. (Hab ich letztens in nem alten Buch gelesen)
-
DANKEEEEEEEEE!!!
Das Ding is weiß!
Yippie!
einfach messages austauscht und es funzt. Na endlich
-
Herzlichen Glückwunsch
