PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text+Hintergrundfarbe von API-Buttons ändern


Kennung Eins
2002-09-25, 23:17:00
Ok, ich bin nun nach langer Zeit malwieder zum Proggen gekommen:

Wenn ich mittels API-Funktionen ein Fenster und einen Button erstelle, wie ändere ich dann die Hintergrundfarbe des Buttons?

Erstellt wurde der Button mit einer kleinen Methode (Code ist in C++ fast 100% gleich):function makeCheckbox(buttonName: PCHAR;x_start,y_start,x_end,y_end,COMMAND_ID:integer;hwnd:HWND):HWND;
begin
result:=CreateWindow('BUTTON', buttonName, WS_CHILD or WS_VISIBLE or BS_AUTOCHECKBOX ,
x_start, y_start, x_end, y_end, hwnd, HMENU(COMMAND_ID),hInstance, nil);
end;So, wenn ich dies nun nutze, sieht das etwa so aus, wie im Anhang.

Ich möchte gern, daß der Hintergrund dieser Checkbox ebenfalls schwarz, und der Text weiß wird. Kann man das irgendwie machen?

aths
2002-09-26, 00:20:34
Hintergrund: Property .Color
Vordergrund: Property .Font ... und dort im Menü die Farbe wählen.

(Geht offenbar nur wenn VCL verwendet wird.)

Kennung Eins
2002-09-26, 00:43:23
sorry das ist leider nicht möglich, da ich keine der "standard-delphi features" dazu nutzen kann, um an diesen Button / Checkbox ranzukommen.

Die Checkbox hat nen HWND handler, aber kA wie ich darüber die Farbe ändern soll... :(

Xmas
2002-09-26, 14:05:44
Ist ein bisschen komplizierter...

http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttonreference/buttonmessages/wm_ctlcolorbtn.asp

Kennung Eins
2002-09-26, 18:03:49
Hmm...ich hab mich dank deines Links mal ein bisschen eingelesen in dieses Thema.

"Here's the problem with WM_CTLCOLORBTN: Only the push buttons and owner-draw buttons send WM_CTLCOLORBTN to their parent windows, and only owner-draw buttons respond to the parent window processing of the message using the brush for coloring the background. This is fairly useless because the parent window is responsible for drawing owner-draw buttons anyway."
http://web.ict.nsc.ru/~cancel/prwin/ch09c.htm

Die Methode scheint echt kompliziert zu sein...
Komme ich da auch irgendwie über SetBkMode, SetBkColor und SetTextColor ran?
Wenn ich mittels SetBkMode TRANSPARENT benutze, sollte doch an und für sich auch der Checkbox-Hintergrund transparent werden, oder?

Hab auch schon versucht, da über eine PAINTSTRUCT ranzukommen, doch irgenwie will das alles nicht so... :(

Xmas, hast du eine Idee, wo man dazu Beispiele finden könnte, oder wen man dazu befragen kann?

Kennung Eins
2002-09-27, 11:30:49
ok, hab was hingbekommen:
WM_INITDIALOG: begin

hBrush := CreateSolidBrush(RGB(255, 0, 0));

end;

WM_CTLCOLORSTATIC:begin
//Damit der Schrifthintergrund nicht stört, machen wir das Editfeld transparent
if (LongWord(lParam) = GetDlgItem(hwnd, ID_CHECKBOX1)) then begin
// SetBkMode (HDC(wParam), TRANSPARENT);
SetBkColor(HDC(wParam),RGB(0,0,0));
SetTextColor(HDC(wParam), RGB(255, 255, 255));
result:=GetStockObject(NULL_BRUSH);
end;
end;
Hier ein vorher-Bild:

Hier ein nachher-Bild:


... hmm wie kriege ich jetzt den kompletten Checkboxhintergrund schwarz?
Wenn ich die oben im Code stehende Brush am Ende des WM_CTLCOLORSTATIC übergebe, passiert gar nichts. (dann würde auch die Textfarbe usw nicht geändert)

Demirug
2002-09-27, 11:57:59
Es gibt eine recht radikale Lösung für das Problem:

Bei der CheckBox einfach den Text weglassen und die grösse so verändern das man nur noch die Checkbox hat. Den Text dann als Statischen Text daneben.

Kennung Eins
2002-09-27, 12:07:37
hmmmmm... :)
mal testen ...

aths hatte die idee, einfach selber "modern aussehende" Checkboxen zu malen und als Bild einzufügen...nun ja... grrr.. alles kompliziert...

Kennung Eins
2002-09-27, 14:18:19
kewl!!! :) Thx Demi, thx XMas für die Hilfe!