FillRect mit Transparenten Brush füllen?
-
Hallo, bei meiner Selbstgezeichneten ListView fang ich die CDIS_HOT ab und zeichne ein Blaues Rechteck mit FillRect. Leider bleibt das Blaue Rechteck wenn ich die Maus auf ein anderes Item bewege. Jetzt wollt ich mit FillRect(lplvcd->nmcd.hdc,&lplvcd->nmcd.rc,(HBRUSH)GetStockObject(HOLLOW_BRUSH)); das Blaue Rechteck überzeichnen. Allerdings passiert nichts. Wenn ich InvalidateRect benutze flimmert es nur die ganze Zeit. Wie kann ich das nicht mehr makierte Item wieder entmakieren. Ich muss dazu sagen das ich einen Gradient Background habe, weshalb ich nicht einfach mit einem anderen Brush drüber gehen kann? Danke für eure Hilfe!!!
-
Was sollte da auch passieren, mit einem transparenten Füllmuster ?
Wenn das Flag CDIS_HOT nicht gesetzt, bzw. CDIS_DEFAULT gesetzt ist, dann zeichnest Du doch einfach mit dem Standard-Brush ?!LG
Greenhorn
-
Ja aber der Hintergrund ist ja ein Farbverlauf. Wenn ich bei CDIS_HOT einen Blauen Balken zeichne, kann ich bei CDIS_DEFAULT nicht mit einem Schwarzen Balken drüber Pinseln. Dann sieht man den Gradient Hintergrund nicht mehr. Und bei InvalidateRect geht's zwar, aber es flickert die ganze Zeit.?
-
In einer OWNERDRAW/CUSTOMDRAW Prozedur
InvalidateRect
aufzufen ist eine schlechte Idee. Das kann zu einer Endlosschleife des Zeichenprozesses führen. Daher das geflacker.
Wenn Du als Hintergrund einen Farbveraluf hast, und Du möchtest nur einen Teilausschnitt zeichnen, dann siehe Dir SetBrushOrgEx an.LG
Greenhorn
-
Danke.
-
Ein kleines Beispiel.
Das Parent-Fenster ist mit einem horizontalen Farbverlauf gefüllt.
Das Child-Fenster soll das selbe Füllmuster benutzen und somit "unsichtbar" erscheinen.Hier die WM_PAINT des Child-Fensters:
;////////////////////////////////////////////////////////////////////////// ;// ;// Handle WM_PAINT message ;// OnPaint _PROC FRAME uses rdi, lpcs:LPCOOLSPLITBAR, hwnd:HWND, wParam:WPARAM, lParam:LPARAM LOCAL hdc: HDC LOCAL hBrush: HBRUSH LOCAL pt: POINT LOCAL rcSplit: RECT LOCAL rcParent: RECT LOCAL ps: PAINTSTRUCT mov rdi, rcx mov hdc, BeginPaint (hwnd, &ps) ;// ;// Paint the background of the splitter window ;// ;// Calculate the splitter window position relative to ;// the parent window and adjust the brush origins GetWindowRect ((COOLSPLITBAR ptr [rdi]).hwnd, &rcSplit) GetWindowRect ((COOLSPLITBAR ptr [rdi]).hwndParent, &rcParent) mov edx, INT_ ptr rcParent.right sub edx, INT_ ptr rcSplit.left SetBrushOrgEx (hdc, edx, 0, &pt) ;// Fill the client area using the background brush FillRect (hdc, &ps.rcPaint, g_hbrThemeBkGrnd) ;// Restore the brush origins SetBrushOrgEx (hdc, pt.x, pt.y, NULL) EndPaint (hwnd, &ps) xor rax, rax OnPaint _ENDP
LG
Greenhorn