Bitmap in Edit
-
Wie kann ich einem Edit einen Hintergrund verpassen?
Mit Ownerdraw allein gehts net. Dann wird der Text immer übermalt.Wie macht man das?
cu para
-
Mach dir doch ein eigenes Control.
-
Naja, das hört sich so an als sei es ne Menge Arbeit, aber wenn du mir evtl. was hast, womit ich voran komm, nur her damit...
cu para
-
-
Ich weiß zwar nicht seit wann ein Edit-Control Ownerdraw unterstüzt (wahrscheinlich gehts bei dir deshalb nicht
), aber mit der Message WM_CTLCOLOREDIT sollte das kein Problem sein.
-
Ich mein es geht ja. Ich kann ein Bitmap in ein Edit malen. Nur wird halt leider Text immer übermalt!
Was kann ich machen?
cu para
-
Also habs jetzt so, aber der Text wird halt übermalt
// edit case WM_CTLCOLOREDIT: if((HWND)lParam==GetDlgItem(hDlg, TXT_TEXT)){ // get item dis = (DRAWITEMSTRUCT*)&lParam; hDC = BeginPaint(hDlg, &ps); // create compatible dc hMemDC = CreateCompatibleDC((HDC)wParam); // select bitmap into memory SelectObject(hMemDC, hPanelBmp); // blit it to main dc BitBlt((HDC)wParam, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); // cleanup DeleteDC(hMemDC); EndPaint(hDlg, &ps); //return (LRESULT)GetStockObject(NULL_BRUSH); }else{ SetTextColor((HDC)wParam,RGB(255,255,255)); SetBkMode((HDC)wParam,TRANSPARENT); return (long)CreateSolidBrush(RGB(0,0,0)); } return 0;
-
Hmm, dann ist der Text wohl schon reingezeichnet.
Speicher doch vor dem Bild reinmalen den aktuellen Inhalt des DCs und blitte ihn dann nachdem du das Bild reingezeichnet hast mit transparentem Hintergrund wieder rein...
-
Original erstellt von geeky:
Hmm, dann ist der Text wohl schon reingezeichnet.
Speicher doch vor dem Bild reinmalen den aktuellen Inhalt des DCs und blitte ihn dann nachdem du das Bild reingezeichnet hast mit transparentem Hintergrund wieder rein...Hört sich gut an, Ich probiers mal
-
Also irgentwie funktioniert es nicht. Ich dachte ich mach erst mal so, dass halt nach dem Zeichnen wieder alles so aussieht wie am Anfang. Also erst mal ohne transparenz. Es funktioniert aber nicht. Wie kann ich den den alten DC speichern und nach dem Zeichnen des Bildes den alten wieder reinmalen?
So schauts aus:
if((HWND)lParam==GetDlgItem(hDlg, TXT_TEXT)){ // get item dis = (DRAWITEMSTRUCT*)&lParam; hDC = BeginPaint(hDlg, &ps); // save old hOldDC = (HDC)wParam; // create compatible dc hMemDC = CreateCompatibleDC((HDC)wParam); // select bitmap into memory SelectObject(hMemDC, hPanelBmp); // blit it to main dc BitBlt((HDC)wParam, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); // blit old back BitBlt((HDC)wParam, 0, 0, 100, 100, hOldDC, 0, 0, SRCCOPY); // cleanup DeleteDC(hMemDC); EndPaint(hDlg, &ps); //return (LRESULT)GetStockObject(NULL_BRUSH); }
-
Ich denke mal, du musst das so anstellen:
- Handle auf den DC holen (DC1)
- Kompatiblen DC zu DC1 erstellen (DC2)
- Kompatibles Bitmap von DC1 erstellen (BMP1)
- BMP1 in DC2 selektieren
- DC1 auf DC2 blitten (jetzt hast du eine Kopie des bisherigen Inhalts)- Kompatiblen DC zu DC1 erstellen (DC3)
- Dein Bitmap hineinselektieren
- DC3 auf DC1 blitten (jetzt siehst du das Bitmap)- Jetzt DC2 wieder auf DC1 blitten (mit geeignetem ROP-Code)
PS: Du speicherst bisher nur ein Handle, des DC, das bringt dir natürlich nichts, du musst ihn schon richtig kopieren
[ Dieser Beitrag wurde am 16.02.2003 um 15:53 Uhr von flenders editiert. ]
-
Also danke flenders,
Hört sich logisch an, aber ich raffs net.
Habs so:if((HWND)lParam==GetDlgItem(hDlg, TXT_PROFILE)){ hDC = BeginPaint(hDlg, &ps); // save old hOldDC = CreateCompatibleDC(hDC); HBITMAP hBmp = CreateCompatibleBitmap((HDC)wParam, 50, 30); SelectObject(hOldDC, hBmp); BitBlt(hOldDC, 0, 0, 50, 30, hDC, 0, 0, SRCCOPY); // create compatible dc //hMemDC = CreateCompatibleDC((HDC)wParam); // select bitmap into memory //SelectObject(hMemDC, hPanelBmp); // blit it to main dc //BitBlt((HDC)wParam, 0, 0, 50, 30, hMemDC, 0, 0, SRCCOPY); // blit old back BitBlt((HDC)wParam, 0, 0, 50, 30, hOldDC, 0, 0, SRCCOPY ); // cleanup DeleteDC(hMemDC); EndPaint(hDlg, &ps); //SetBkMode((HDC)wParam,TRANSPARENT); //return (long)CreateSolidBrush(RGB(218, 218, 255)); }
Wenn ich es so mache müsste doch rein optisch garnichts passieren oder?
Ich speichere das alte und blitte es dann sofort wieder rein?!
-
Eigentlich schon
BTW, warum nimmst du nicht einfach CreateCompatibleBitmap(hDC);
-
Original erstellt von flenders:
Eigentlich schon
BTW, warum nimmst du nicht einfach CreateCompatibleBitmap(hDC);Hä? CreateCompatibleBitmap verlangt bei mir 3 Parameter, oder hab ich dich falsch verstanden?
-
Du kannst auch nur den ersten angeben: http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1cxc.asp
-
Also es ist jetzt so.
Zeichne ich den vorher gespeicherten DC nicht wieder zurück dann wird das Bitmap angezeigt. Nur komischerweise plötzlich unter dem Edit. Also es schaut nur unten ein kleines Stück heraus.
Zeichen ich aber das vorher gespeicherte wieder zurück dann ist alles als wäre nichts also scheint es jetzt zu funktionieren.Ich hab halt noch das Problem mit dem Edit:
-------------------- | Hier ist das Edit | -------------------- ******** <= Stück vom Bitmap
Hier mein Quelltext
// edit case WM_CTLCOLOREDIT: // get item dis = (DRAWITEMSTRUCT*)&lParam; if((HWND)lParam==GetDlgItem(hDlg, TXT_PROFILE)){ // save old HGDIOBJ hOldObj1, hOldObj2; HDC hOldDC = CreateCompatibleDC((HDC)wParam); HBITMAP hOldBmp = CreateCompatibleBitmap((HDC)wParam, 50, 50); SelectObject(hOldDC, hOldBmp); BitBlt(hOldDC, 0, 0, 50, 50, (HDC)wParam, 0, 0, SRCCOPY); // blit bitmap HDC hMemDC = CreateCompatibleDC((HDC)wParam); hOldObj2 = SelectObject(hMemDC, hBmpTest); BitBlt((HDC)wParam, 0, 0, 50, 50, hMemDC, 0, 0, SRCCOPY); BitBlt((HDC)wParam, 0, 0, 50, 50, hOldDC, 0, 0, SRCCOPY); // cleanup DeleteObject(SelectObject(hMemDC, hOldObj2)); DeleteDC(hMemDC); DeleteObject(SelectObject(hOldDC, hOldObj1)); DeleteObject(hOldBmp); DeleteDC(hOldDC); // break; return 0; }; // all normal statics SetBkMode((HDC)wParam,TRANSPARENT); return (long)CreateSolidBrush(RGB(218, 218, 255));
Man! Wo ist da der Haken?!?!?!
danke!
cu para
-
dis = (DRAWITEMSTRUCT*)&lParam;
-
CreatePatternBrush();
WM_CTLCOLOREDIT
SetBkMode();
-
Original erstellt von <Gregor>:
dis = (DRAWITEMSTRUCT)&lParam;*
Was willst du damit sagen???
Ich brauch dir struct weiterunten im CodeCreatePatternBrush();
WM_CTLCOLOREDIT
SetBkMode();Wäre evtl. ein wenig Text zusätzlich möglich, weil ich kann mir nichts darunter vorstellen.
Ähem. Das hätte sich dann wohl erledigt.
DANKE DANKE DANKE!
Funktioniert einwandfrei!danke!
cu para
-
Achja. Kann es sein, dass es nicht bei RichEdit funktioniert???