是否有可能在給定HMENU的情況下檢測它是彈出式菜單還是下拉式菜單?檢測HMENU是否爲彈出式菜單或下拉式菜單
我想創建一個現有菜單的(深度,修改)副本,並且根據此屬性,我需要分別使用CreatePopupMenu
或CreateMenu
。
是否有可能在給定HMENU的情況下檢測它是彈出式菜單還是下拉式菜單?檢測HMENU是否爲彈出式菜單或下拉式菜單
我想創建一個現有菜單的(深度,修改)副本,並且根據此屬性,我需要分別使用CreatePopupMenu
或CreateMenu
。
由於雷蒙德陳says here(我的重點):
CreateMenu
創建水平菜單欄,適合於連接到 頂層窗口。這是「文件,編輯」和 等等的菜單。CreatePopupMenu
創建一個垂直彈出式菜單,適用於 作爲另一個菜單(水平菜單欄或 另一個彈出式菜單)的子菜單或作爲上下文菜單的根。如果你弄糊塗了,你可以得到奇怪的菜單行爲。 在極少數情況下,Windows會檢測到您已將兩者和 轉換爲適當的混淆,但我不會指望Windows成功地讀取您的想法 。
沒有辦法採取一個菜單,並詢問它是否是水平的或垂直 。你只需要知道。
不與HMENU明確:
1)如果你談論HMENU,對應於現有的窗口(類#32768),就足以驗證(通過GetGUIThreadInfo)GUITHREADINFO.flags:可用性GUI_INMENUMODE不帶GUI_SYSTEMMENUMODE的GUI_POPUPMENUMODE表示這個菜單 - 下拉菜單。 2)如果你談論存在於內存中的hmenu,我們必須找到這個hmenu的根父(順便說一句,對於菜單可能有不止一個,與根父窗口不同)。 然後調用TrackPopupMenu找到根父節點,並在WM_ENTERIDLE上獲取hwnd相應的窗口(class#32768)並調用GetClientRect:如果Rect = 0,則根父級=菜單欄(可通過LoadMenu(間接)或通過CreateMenu創建)這意味着原始的hmenu - 下拉菜單(不僅可以通過CreatePopupMenu創建,也可以通過CreateMenu創建)。
至於R.Chen的鏈接。在現實中,系統始終記得在內存中如何創建hmenu。但是這種機制(與菜單上的其他許多事情一樣)沒有記錄,雷蒙德顯然不認爲有必要揭露它...