WM_CTLCOLORSTATIC und ListView
-
Hallo,
ich habe gerade ein kleines Problem.Hier ist mein code:
case WM_CTLCOLORSTATIC: case WM_CTLCOLORBTN: { HDC hdc = (HDC)wParam; RECT rc; GetWindowRect((HWND)lParam,&rc); POINT p0 = {rc.left,rc.top}; POINT p1 = {rc.right,rc.bottom}; ScreenToClient(hWnd, &p0); ScreenToClient(hWnd, &p1); rc.left = p0.x; rc.right = p1.x; rc.top = p0.y; rc.bottom = p1.y; Graphics graphics(hdc); graphics.DrawImage(&Bitmap(hbmMem,NULL), 0, 0, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, UnitPixel); return (LRESULT)GetStockObject(NULL_BRUSH); }
Ich habe auch noch eine Listview, und wenn ich die Größe einer Spalte ändere, dann sieht man darunter irgendwie meinen hintergrund so:
http://image-upload.de/image/UuSDWq/a4ce097bd0.jpgWenn ich aber WM_CTLCOLORSTATIC auskommentire dann funktioniert alles perfekt, nur das meine radiobuttons keinen durchsichtigen Hintergrund mehr haben.
Vielen Dank
Johannes
-
Zeichnen sollte man immer in WM_PAINT oder in WM_ERASEBKGND; ob das so funktioniert, was Du da vorhast, mag ich bezweifeln... verschieb mal ein anderes Fenster über dieses und schau mal was passiert
Warum verwendest Du nicht "LVM_SETBKIMAGE"?
http://msdn.microsoft.com/en-us/library/windows/desktop/bb761155
-
beachte auch die Kommentare zu den Messages WM_ERASEBKGND und WM_PAINT:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774734
-
Hallo, ich glaube das ihr mich falsch verstanden habt. Das Hintergrundbild ist vom Parent, und die Listview soll eigentlich ganz normal ausschauen, nur meine Radiobuttons die auch childs vom gleichen Parent sind, sollen durchsichtig sein.
-
Warum zeichnest Du in WM_CTLCOLORSTATIC??? Da gehört das nicht hin!
-
Das mache ich damit die Radiobuttons einen durchsichtigen Hintergrund haben, bzw den gleichen Hintergrund wie das Parent. Wenn nicht so, wie soll ich das dann machen?
-
Das mit dem durchsichtigen Hintergrund hab ich kapiert. Aber: WARUM zeichnest Du da??????
-
Ich zeichne das Bitmap das auch auf dem Parent ist in den Radiobutton, damit es aussieht als würde er durchsichtig sein!!! Wo sollte ich es den deiner Meinung nach zeichnen ohne das ich ein Full Ownerdraw Button machen muss? Oder gibt es irgendeinen anderen Weg das zu machen ohne zu zeichnen, wenn ja, welchen?
-
Warum zeichnest Du nicht im "Window"?
Schau Dir mal das hier an:
http://www.codeproject.com/Articles/18967/Bitmap-Backgrounds-For-Dialog-Boxes
-
Das bitmap zeichne ich ja auf das parent in WM_PAINT, und hbmMem ist dan das bitmap das bei dem WM_PAINT rauskommt. Ich mache doch so wie der codeproject link, oder nicht? Und die radiobuttons sind ja auch durchsichtig, ich habe nur das Problem mit der Listview!
-
In dem Beispiel
1. wird in OnEreaseBackground gezeichnet
2. wird in CtrlColor den DC auf Transparent gesetzt und der HOLLOW_BRUSH zurückgegeben und *nichts* gezeichnet...Quote:
HBRUSH CMyDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_STATIC_MESSAGE) { CRect rect; pWnd->GetClientRect(&rect); pDC->FillSolidRect(&rect, RGB(255,255,255)); hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0,0,0)); } return hbr; }
-
Das heist ich muss alle subclassen und wm_erasebkgnd abfangen?
-
Nur im Dialog (Hauptfenster)... ladt Dir doch mal das Codeproject Beispiel runter...
-
Ich habs mir schon heruntergeladen, aber die radiobuttons werden nicht durchsichtig.
so sieht jetzt mein WM_ERASEBKGND aus:case WM_ERASEBKGND: { HDC hdc = CreateCompatibleDC((HDC)wParam); RECT rc; GetWindowRect(hWnd,&rc); HBITMAP hbmOld = (HBITMAP)SelectObject(hdc, hbmMem); BitBlt((HDC)wParam, 0, 0, rc.right, rc.bottom, hdc, 0, 0, SRCCOPY); SelectObject(hdc, hbmOld); return 1; }