在標題欄上繪制菜單。
移除標題欄,將菜單欄用作標題。
這裏簡單描述壹下效果:在應用程序的界面上,標題欄和菜單欄顯示在同壹個區域,用戶點擊菜單區域彈出相應的菜單;點擊其他空白區域就像點擊標題欄壹樣(不清楚,但我想大家都懂)。
第二種方案,其實主要有兩點:去掉標題欄,用菜單欄模擬標題欄。
SetWindowPos
WM_NCHITTEST
。通過這個新聞,我們知道壹個窗口被細分成了20多個區域,其中兩個是我們現在感興趣的,HTMENU和HTCAPTION。現在想法來了。在處理WM_NCHITTEST消息時,如果能把系統返回的部分HTMENU轉換成HTCAPTION,是否能達到模擬標題欄的效果?事實告訴我們,基本達到了。代碼如下:1:uintcls _ onnchittest(hwndhwnd,
intx,
inty)2:{ 3:UINT uNcHitResult = FORWARD _ WM _ NCHITTEST(hwnd,x,y,DefWindowProc);4:5:if(ht menu = = uNcHitResult)6:{ 7:hm enu hm enu = get menu(hwnd);8:intnMenuItemCount = GetMenuItemCount(hMenu);9:10:RECT rcTheLastMenu = { 0,0,0,0 };11:if(GetMenuItemRect(hwnd,hMenu,nMenuItemCount - 1,& ampRCTHELASTMENU))12:{ 13://在菜單空白區域點擊時,模擬為標題欄行為14: if (RCTHELASTMENU。對吧
經過這樣的處理,點擊/雙擊菜單欄的空白區域,拖動都像是在操作標題欄。
寫完這段代碼後,妳會發現幾個問題:
右鍵單擊菜單欄的空白區域以查看系統菜單。
最大化後是全屏,窗口覆蓋任務欄。
所以這種模擬方法只是基本實現了功能,還沒有完全達到要求。現在讓我們壹步壹步地解決這些問題。先看系統菜單。
intx,
(同Internationalorganizations)國際組織
y,UINT code hittest)2:{ 3:if(ht caption = = code hittest)4:{ 5:HMENU hsys menu = get system menu(hwnd,
假);6:intnMenuAlign = GetSystemMetrics(SM _ MENUDROPALIGNMENT);7:8://請特別註意TPM_RETURNCMD。我們需要知道用戶點擊了哪個系統菜單項:bool bres = trackpupmenuex(hsysmenu,nmenuualign | TPM _ returncmd,x,y,hwnd,null);10:return forward _ WM _ sys command(hwnd,bRes,x,y,DefWindowProc);11:} 12:13:FORWARD _ WM _ NCRBUTTONUP(hwnd,x,y,codeHitTest,DefWindowProc);14:}
到目前為止,我們似乎已經解決了所有的菜單問題。但其實問題還是有點。系統菜單項的狀態似乎有問題。為了解決這個問題,我們需要使用WM_INITMENU消息,通過最大化或最小化當前窗口狀態來挑戰相應的菜單項狀態。看代碼:1:void cls _ on init menu(hwnd hwnd,hmenu hmenu)2:{ 3:if(get system menu(hwnd,
FALSE)= = hMenu)4:{ 5:UINT uSysCmds[]= { SC _ SIZE,SC_MOVE,SC_MINIMIZE,SC_MAXIMIZE,SC_CLOSE,SC _ RESTORE };6:if(isi conic(hwnd))7:{ 8:for(inti = 0;我& lt_ count of(uSysCmds);++ I)9:{ 10:switch(uSysCmds[i])11:{ 12:caseSC _ MAXIMIZE:13:caseSC _ RESTORE:14:caseSC _ CLOSE:15:EnableMenuItem(hMenu,uSysCmds[I],MF _ ENABLED);16:破;17:18:默認值:19:EnableMenuItem(hMenu,uSysCmds[i],MF _ DISABLED | MF _ GRAYED);20:破;21:} 22:} 23:} 24:else if(iszolled(hwnd))25:{ 26:for(inti = 0;我& lt_ count of(uSysCmds);++ I)27:{ 28:switch(uSysCmds[i])29:{ 30:caseSC _ RESTORE:31:caseSC _ MINIMIZE:32:caseSC _ CLOSE:33:EnableMenuItem(hMenu,uSysCmds[I],MF _ ENABLED);34:破;35:36:默認值:37:EnableMenuItem(hMenu,uSysCmds[i],MF _ DISABLED | MF _ GRAYED);38:破;39:} 40:} 41:} 42:else 43:{ 44:for(inti = 0;我& lt_ count of(uSysCmds);++ I)45:{ 46:switch(uSysCmds[i])47:{ 48:caseSC _ RESTORE:49:enable menuitem(hMenu,uSysCmds[I],MF _ DISABLED | MF _ GRAYED);50:破;51:52:默認值:53:EnableMenuItem(hMenu,uSysCmds[i],MF _ ENABLED);54:破;55:} 56:} 57:} 58:} 59:else 60:{ 61:FORWARD _ WM _ init menu(hwnd,hMenu,DefWindowProc);62:}63:}
妳完了。唉,好像有點不對勁。第壹次彈出的系統菜單狀態好像有問題。如果再彈出來,好像是對的。發生了什麽事?這要怪GetSystemMenu。要解決這個問題,只需在顯示系統菜單之前調用GetSystemMenu進行復制即可。
至此,系統菜單的問題應該都解決了。下面是解決全面屏的問題。