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???
-
The
wParam
ofWM_NCPAINT
message sometimes returns 1 instead of a handle to a region (HRGN
). In that caseHRGN
must be created usingCreateRectRgn
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.