windows的選單是怎麼實現的

2021-06-18 15:35:19 字數 436 閱讀 2559

本質上選單也是乙個視窗.

建立選單的函式createmenu建立了乙個選單物件,hmenu儲存了選單的內容。

彈出選單的函式trackpopupmenu建立實際顯示的視窗, 視窗的style是popup。

我比較感興趣的是當彈出選單時,選單視窗雖然沒有焦點但是還能相應鍵盤事件,在qt中建立選單視窗之後就把keyinput給grab,在windows中是如何實現的呢? windowsapi並沒有實現grabkey的功能(setcapture只能grab滑鼠),經過跟蹤發現trackpopupmenu建立了乙個訊息迴圈,類似主迴圈,在迴圈中getmessage獲取訊息之後把鍵盤訊息截獲,然後把msg中的hwnd替換為選單視窗,直到選單視窗關閉,訊息迴圈結束,trackpopupmenu函式結束。

本質上qt的grab函式也是這樣實現的,不過qt在主訊息迴圈中就做了這個工作。

**:

Windows選單的建立

1.建立乙個win32的空工程,然後新增乙個主檔案source.cpp include windows.h include header.h include tchar.h hmenu hmenu,haddmenu 定義選單控制代碼 lresult callback wndproc hwnd,uin...

實現動態選單的技巧

我的小軟體想實現這樣乙個功能 登陸前,我希望只有 帳戶 幫助 這兩個選單項,帳戶選單有註冊和登陸兩個彈出選單 登陸以後,其他選單才全部出來。但是這樣生成的選單並沒有命令處理機制,解決的辦法是過載oncmdmsg函式 然後根據選單id用switch方式選擇執行函式。總是感覺這種方法很別拗。當然可以一開...

側滑選單的實現

一般的側滑的實現 viewgroup menu content ontouchevent move viewgroup的 leftmargin up 根據現實選單的寬度,決定將其隱藏或者現實 1 scroller 2 leftmargin thread 今天,繼承 horizontalscrollv...