nc repaint nach minimized



  • Hallo an alle WinAPI Fans 😉
    Ich möchte meinen eigenen Fensterrahmen zeichnen und hab auch schon konkrete Vorstellungen bei der Umsetzung. Allerdings harpert es gerade an einer ziemlich blöden Sache. Das Fenster wird, nachdem es minimiert wurde und anschließend wieder in den Vordergrund kommt, nicht neugezeichnet. So wird der komplette Rahmen mit der Hintergrundfarbe der Client Area überzeichnet. Im wParam sollte eigentlich eine HRGN stecken, allerdings ist der Wert des wParam immer 1.

    case WM_NCPAINT:
    		{
    			//if(wParam == 1)
    				//return DefWindowProc(hWnd, msg, wParam, lParam);
    			MessageBeep(MB_ICONERROR);
    			HDC hDC = GetDCEx(hWnd, (HRGN)wParam, DCX_WINDOW | DCX_INTERSECTRGN | 0x10000);
    			RECT rect; 
    			GetWindowRect(hWnd, &rect);
    
    			HBRUSH hBrush = CreateSolidBrush(RGB(0,180,180)); 
    			SelectObject(hDC, hBrush);
    			HPEN hPen = CreatePen(PS_SOLID, 1, RGB(90, 90, 90)); 
    			SelectObject(hDC, hPen);
    			Rectangle(hDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top);
    			DeleteObject(hBrush);
    			DeleteObject(hPen);
    
    			ReleaseDC(hWnd,hDC);
    			RedrawWindow(hWnd, &rect, (HRGN)wParam, RDW_UPDATENOW);
    			return 0;
    		}
    

    Und auf WM_NCACTIVATE, was ja gesendet wird wenn das Fenster wieder in den Vordergrund kommt, möchte ich gerne, dass wider der Cyanfarbene Non-Client Bereich gezeichnet wird. Daran haperts jetzt leider

    case WM_NCACTIVATE:
    		{
    			RedrawWindow(hWnd, NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW);
    			return 0;
    		}
    

    Könnt ihr mir vielleicht weiterhelfen 😉 ?
    Mfg ted;


  • Mod

    wParam==1 bedeutet, das die gesamte Client-Area neu gezeichnet werden muss!

    BTW: Du erzeugst massenweise Handleleaks.
    Jeweils ein Pen und ein Brush. Du musst die Werte die SelectObject zurückgibt sichern und am Ende wieder setzen. Sonst werden Deine GDI Objekte nie freigegeben.



  • Ah Vielen Dank, das war echt hilfreich 🙂
    Wenn wParam jetzt 1 ist erzeuge ich mir jetzt mit CreateRectRgnIndirect und fülle diese dann mit einem SolidBrush. Aus dem HDC schließe ich vorher mit ExcludeClipRect die ClientArea aus.

    PS: Wenn ich jetzt den Brush und den Pen in das HDC lade speicher ich nun die Werte, die vorher im HDC verankert waren. Wenn ich mit dem Zeichnen fertig bin lade ich diese wieder zurück und rufe erst danach DeleteObject auf den Brush und den Pen auf. Ist das die richtige Vorgehensweise?


Anmelden zum Antworten