Edit Control leicht Transparent machen
-
Ich habe ein Edit-Control in meinem Programm, welches einen weißen Hintergrund hat. Ich möchte ihn aber leicht transparent haben, sodass man die weiße Hintergrundfarbe noch schwach sieht. Wenn man draufklickt (der FOCUS also drauf ist), soll er wieder komplett weiß werden. Wie?
-
Ich fürchte, das geht nicht oder wird schwer. Das ist eine feste Systemfarbe für alle momentan laufende Anwendungen. Du müsstest schlimmstenfalls eine eigene Control-Fensterklasse "editex" statt "edit" schaffen. Du kannst aber versuchen, dem Edit mit suclassing eine eigene CALLBACK-Funktion zu verpassen und dort unter WM_PAINT und WM_SETFOCUS mit DrawBitmap verschiedene Hintergrundbilder draufzusetzen. Das könnte gehen, habe ich allerdings noch nicht probiert.
-
Geht das nicht mit Layer? Das Ganze Fenster kriege ich ja mit:
// Set WS_EX_LAYERED on this window SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); // Make this window 70% alpha SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);transparent.
-
noch einmal nachgelesen:
WM_CTLCOLOREDIT wird gesendet, wenn das Editfenster gezeichnet werden soll. Dort kann man die Vorder- und Hintergrundfarbe dann explizit setzen. Jetzt müsste unter WM_SETFOCUS und WM_KILLFOCUS das Neuzeichnen erzwungen werden.
-
skullyan schrieb:
Geht das nicht mit Layer? Das Ganze Fenster kriege ich ja mit:
// Set WS_EX_LAYERED on this window SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); // Make this window 70% alpha SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);transparent.
Wenn beim Window (hier dein Edit-Control) das Flag WS_CHILD gesetzt ist, gehts nicht.
Mit anderen Worten funktioniert das SetLayeredWindowAttributes nur bei Top Level Windows.Hier noch zwei Links:
What is a top-level window?
Layered Windows
-
berniebutt schrieb:
noch einmal nachgelesen:
WM_CTLCOLOREDIT wird gesendet, wenn das Editfenster gezeichnet werden soll. Dort kann man die Vorder- und Hintergrundfarbe dann explizit setzen. Jetzt müsste unter WM_SETFOCUS und WM_KILLFOCUS das Neuzeichnen erzwungen werden.case WM_CTLCOLOREDIT: SendMessage(hwndEdit2, EM_SETBKGNDCOLOR, 0, RGB(52, 22, 255)); break;Ich habe es so gelöst. Allerdings funktioniert es nicht.
Wie mache ich das?
-
Bei der Bearbeitung von WM_CTLCOLOREDIT soll ein Handle auf einen Brush zurückgegeben werden, sonst behält DefWindowProc die Systemeinstellungen. Bei mir sehe ich allerdings nicht einmal WM_CTLCOLOREDIT, wenn ich eine ältere Dialogklasse von "BorDlg" einsetze.
-
Vergiss das mit der Transparenz.
Bau dir ein eigenes, hübsches GUI Framework samt Editor. Dann wirste Spaß haben