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


Log in to reply