很多程式都是有菜單和狀態列,當用滑鼠點開菜單移動選擇各功能表項目的時候,會在狀態列顯示關於該功能表項目的說明。這個功能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);就可以了。