Bitmap hinter Editbox
-
Hallo zusammen,
ich erstelle eine Editbox und habe eine Bitmap, die ich gerne hinter der Editbox hätte. Die Editbox erstelle ich bei WM_CREATE mit CreateWindow.
Wenn ich jetzt bei WM_PAINT das BITMAP (ein aufwändiger Rahmen um die Editbox) ins Hauptfenster kopiere, kann ich zwar noch in die Editbox tippen, diese wird aber natürlich vom Bitmap überlagert, statt dahinter zu liegen.
[code]
WM_CREATE:
CreateWindow(L"editbox", ....) // Edit Box erstellenWM_PAINT:
hdcButtonImage1 = GetDC(hwnd_main);
hdcButtonImage2 = CreateCompatibleDC(hdcButtonImage1);
SelectObject(hdcButtonImage2, TextFieldBitmap);
BitBlt(hdcButtonImage1, 1200, 70, 58, 28, hdcButtonImage2, 0, 0, SRCCOPY); // this have to be the same values like at the button window creation
DeleteObject(hdcButtonImage2);
ReleaseDC(hwnd_main, hdcButtonImage1);
[code]Weiss jemand, wie ich das Bitmap hinter die Editbox bringe (das Bitmap soll aber nicht in der Editbox sein, da der Rahmen grösser ist als die Editbox). Kann ich bei WM_PAINT irgendwie die Editbox nochmal zeichnen lassen? Oder kann ich der Editbox irgendeine Eigenschaft mitgeben, so dass sie immer am weitesten vorne ist?
Viele Grüße,
Manfred
-
Ich habe es selber nicht ausprobiert, aber hast _du_ mal probiert, das Bild nach Empfangen von WM_ERASEBKGND zu zeichnen (in den DC des Fensters, der im WPARAM geliefert wird) ?
Sollte eigentlich klappen...
Im Übrigen solltest du dir den DC im WM_PAINT-Zweig mittels BeginPaint besorgen und dann den Zeichenvorgang mit EndPaint abschließen. Der Vorteil hierbei ist, dass rcPaint aus dem übergebenen PAINTSTRUCT ausgewertet werden und wirklich nur das Nötige gezeichnet werden kann.
Außerdem kannst du Variablen auch in den einzelnen case-Zweigen deklarieren:
case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // hier irgendwelche Zeichenperationen EndPaint(hwnd, &ps); break; } case WM_ERASEBKGND: { HDC hdc = reinterpret_cast<HDC>(wParam); // hier das Bild blitten break; }
-
Hallo,
zu WM_PAINT:
Das übliche Konstrukt mit BeginPaint, Variableninitalisierung etc. ist alles da, sorry, hab vergessen im Beispielcode ... als Platzhalter zu setzen.Zu WM_ERASEBKGND:
Leider wird auch wenn ich das Bild in dem case zeichne, das Bild über der Editbox gezeichnet.Gibt es eine Möglichkeit, die Editbox in WM_PAINT nochmal per "manuellem" Aufruf zu zeichnen?
Danke & Viele Grüße,
Manfred
-
So, ich habs mal ausprobiert:
case WM_PAINT: { PAINTSTRUCT ps; hdcButtonImage1 = BeginPaint(hwnd_main, &ps); hdcButtonImage2 = CreateCompatibleDC(hdcButtonImage1); SelectObject(hdcButtonImage2, TextFieldBitmap); BitBlt(hdcButtonImage1, 1200, 70, 58, 28, hdcButtonImage2, 0, 0, SRCCOPY); // this have to be the same values like at the button window creation DeleteObject(hdcButtonImage2); EndPaint(hwnd_main, &ps); } break;Edit: Wenn man es falsch macht, dann sind die Edit-Felder tatsächlich überlagert. Aber macht man es korrekt, dann ist die Bitmap hinter der Edit-Box.
-
Hallo Don Carlo,
vielen Dank, jetzt funktionierts!

Viele Grüße,
Manfred
-
Was passiert wenn du scrollst? Gehts dann immer noch?