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);就可以了。