Owner Draw Menubar ?



  • Hi, ich zeichne mein Fenster selbst indem ich die WM_NCPAINT und WM_NCCALCSIZE abfange. Das klappt auch ganz gut. Nur wenn ich die Menubar zeichne und das Fenster in die länge ziehe verschwindet die Menubar und kommt nicht wieder??? Was muss ich da machen, gibts da eine art UpdateMenu() funktion???



  • https://stackoverflow.com/questions/50132757/how-to-correctly-draw-simple-non-client-area-4-px-red-border

    The wParam of WM_NCPAINT message sometimes returns 1 instead of a handle to a region (HRGN). In that case HRGN must be created using CreateRectRgn function.



  • Die Region ist groß genug für titlebar und menubar. Es geht aber einfach nicht...?



  • @Mike85Dev
    Passiert das sofort oder erst nach einer Weile? Nicht, dass dir die Handles ausgehen, weil du sie leakst.



  • @Mike85Dev sagte in Owner Draw Menubar ?:

    Die Region ist groß genug für titlebar und menubar. Es geht aber einfach nicht...?

    Aha. Verstehe jetzt nicht den Zusammenhang mit meinem Beitrag.
    Zeig mal den Code.



  • @hustbaer sagte in Owner Draw Menubar ?:

    Zeig mal den Code.

    Bevor er das tut lässt er Threads einfach sterben. Egal wie sehr man sich vorher den Allerwertesten aufgerissen hat. Deshalb antworte ich auf sein Zeugs nichts mehr.



  • Da Menü verschwindet er wenn es neu gezeichnet wird. Beim ändern der Größe des Fensters.
    Ein Leak hab ich nicht. Muss irgendwo anders liegen?



  • @Swordfish Danke für den Hinweis.



  • Das ist ein kleiner ausschnitt... Wenn ich das Programm starte ist die Menubar zu sehen, aber wenn ich die größe ändere verschwindet sie...?

    case WM_NCPAINT: {
    RECT r;
    GetWindowRect(hWnd, &r);
    r.bottom = 25;
    HDC hdc = GetWindowDC(hWnd);
    OffsetRect(&r, -r.left, -r.top);
    RECT rect;
    SetRect(&rect, 0, 0, r.right, 25+25);
    FillRect(hdc, &rect, CreateSolidBrush(RGB(255, 255, 0)));
    ReleaseDC(hWnd, hdc);
    return 0;
    }

    case WM_NCCALCSIZE: {
    if (wParam) {
    NCCALCSIZE_PARAMS nc = (NCCALCSIZE_PARAMS)lParam;

    		nc->rgrc[0].top += 50; // 25 Titlebar + Menubar 25
    		nc->rgrc[0].left += 4;
    		nc->rgrc[0].right -= 4;
    		nc->rgrc[0].bottom -= 4;
    		return false;
    	}
    	break;
    }


  • Zumindest die DrawMenuBar in der WM_SIZE aufrufen. Wenn sich das Füllmuster bei der Größenänderung des Fensters ändern soll, dann natürlich auch SetMenuInfo in die WM_SIZE.

    [EDIT} Du kannst es natürlich auch in der WM_NCPAINT machen ...
    [EDIT] Oder doch besser nicht ? Könnte eine Endlosschleife verursachen, wenn DrawMenuBar eine WM_NCPAINT auslöst ...



  • Ich habe nochmal nachgesehen.

    Die DrawMenuBar definitiv nur in die WM_SIZE.

    	.case WM_SIZE:
    		.if (wParam == 0 || wParam == 2)
    			DrawMenuBarBkGrnd (hwnd)
    			DrawMenuBar (hwnd)
    		.endif
    		xor  rax, rax
    		.endc
    
    	.case WM_NCPAINT:
    		DrawMenuBarBkGrnd (hwnd)
    		.endc
    
    
    
    ;//
    ;//	DrawMenuBarBkGrnd
    ;//
    DrawMenuBarBkGrnd _PROC public FRAME, hWnd:HWND
    
    LOCAL wi:	WINDOWINFO
    LOCAL mi:	MENUINFO
    LOCAL mbi:	MENUBARINFO
    LOCAL hmenu:	HMENU
    
    
    	mov  hmenu, GetMenu (hWnd)
    
    	.return .if (!IsMenu (hmenu))
    
    	.if (g_hbrThemeBkGrnd)
    		DeleteObject (g_hbrThemeBkGrnd)
    	.endif
    
    	mov  wi.cbSize, sizeof(WINDOWINFO)
    
    	GetWindowInfo (hWnd, &wi)
    
    	mov  mbi.cbSize, sizeof(MENUBARINFO)
    
    	GetMenuBarInfo (hWnd, OBJID_MENU, 0, &mbi)
    
    	mov  eax, mbi.rcBar.right
    	sub  eax, mbi.rcBar.left
    	add  eax, wi.cxWindowBorders
    
    	mov g_hbrThemeBkGrnd, CreateGradientBrush (
    					g_cmt.cmb.clrBkGrnd,
    					g_cmt.cmb.clrGradient,
    					eax, FALSE
    					)
    
    	mov  mi.cbSize,  sizeof(MENUINFO)
    	mov  mi.fMask,   MIM_BACKGROUND
    	mov  mi.hbrBack, g_hbrThemeBkGrnd
    
    	SetMenuInfo (hmenu, &mi)
    
    	.return 0
    DrawMenuBarBkGrnd _ENDP
    
    
    
    


  • @Mike85Dev
    Das kann doch so nicht übersetzt werden:

    NCCALCSIZE_PARAMS nc = (NCCALCSIZE_PARAMS)lParam;
    

    LPARAM ist hier ein Zeiger auf eine NCCALCSIZE_PARAMS-Struktur, im Folgenden verwendest du auch richtigerweise operator ->.

    FillRect(hdc, &rect, CreateSolidBrush(RGB(255, 255, 0)));
    

    Da ist dein GDI-Objekt-Leak.

    Zu der generellen Logik kann ich allerdings nichts sagen.


Log in to reply