關於MenuHelp的使用

來源:互聯網
上載者:User

很多程式都是有菜單和狀態列,當用滑鼠點開菜單移動選擇各功能表項目的時候,會在狀態列顯示關於該功能表項目的說明。這個功能MFC是封裝好的,用嚮導產生即可,但用API編程就得自己編寫代碼了,查了一下MSDN,有個MenuHelp函數可以做到,函數原型為:
void MenuHelp(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam,
    HMENU hMainMenu,
    HINSTANCE hInst,
    HWND hwndStatus,
    LPUINT lpwIDs
);
前面的參數好理解,關鍵是最後一個參數lpwIDs,MSDN說明是一個UINT數組指標,數組元素必須是成對的,第一個是字串資源ID,第二個是菜單控制代碼,想想好象比較麻煩,得在程式載入菜單後得到每個功能表項目的控制代碼然後填寫這個數組?不厭其煩寫了代碼一試,卻滿不是那麼回事,根本不起作用。於是看了看MFC的原始碼,暈,居然沒用這個函數,是自己處理的。再找其他SDK寫的常式,發現這個數組只有4個元素,兩對,第二對是0,0,標誌數組結束,第一對中的字串資源ID在資源中根本沒有,第二個菜單控制代碼值為0x1100,代碼中也沒有再對這個數組進行操作了,但卻能正常工作,這下更暈了。仔細研究了這個“神奇”的程式,終於知道了MenuHelp的用法:

UINT wIDs[] = {MH_BASE,0x1100,0,0}

這個MH_BASE可以隨便定義一個數值,不過必須保證該值加上功能表命令ID的數值後不能超過0xFFFF。

然後在資源中加入協助字串,該字串的資源ID必須是MH_BASE加上相應的功能表命令ID。而子功能表的字串的資源ID必須是0x1100加上相應的序號,這個子功能表的協助字串是指:比如菜單上一般都會有“檔案”這個功能表項目,點開“檔案”會彈出下拉式功能表,顯示“開啟”,“關閉”等,滑鼠移到這兩個選項上在狀態列分別顯示“開啟檔案”和“關閉”,而移出這兩個選項並且下拉式功能表未關閉,則會顯示這個子功能表的協助字串“檔案操作”。第二個子功能表比如“編輯”的協助字串資源ID就是0x1100+1。

比如菜單中“開啟”和“關閉”的命令ID分別為CM_OPEN和CM_CLOSE,就需要在資源中如下定義字串:
STRINGTABLE DISCARDABLE
BEGIN
    MH_BASE + CM_OPEN       "開啟檔案"
    MH_BASE + CM_CLOSE      "關閉"
    0x1100 + 0      "檔案操作"
END

程式中響應WM_MENUSELECT訊息,在其中調用MenuHelp(WM_MENUSELECT,wParam,lParam,GetMenu(hWnd),hInstance,hStatusWnd,wIDs);就可以了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.