近期需要實現一個功能:MFC對話框中,一項菜單下有五個菜單項,改變菜單項選中狀態,每次只能選擇其中一個打勾。(單選)
然后在網上搜了下資料,稍微總結下,以防后面用到。
1.單選實現:
CMenu* menu = GetMenu()->GetSubMenu(2); //獲得菜單項的第二個子菜單 menu->CheckMenuRadioItem(ID_menuSkin1, ID_menuSkin6, ID_menuSkin3, MF_BYCOMMAND); //設置單選狀態,函數具體詳解如下
CMenu::CheckMenuRadioItem,該函數校核一個指定的菜單項並使其成為一個圓按鈕項。同時不校核相關組里的其他菜單項並清除這些項的圓按鈕的類型標志。
BOOL CheckMenuRadioItem(UINT idFirst,UINT idLast,UINT idCheck,UINT uFlags);
返回值:如果成功,則返回非零值,否則為0。
參數:
nIDFirst 指定(作為一個ID號或位移量,依賴於nFlags的值)單選鈕組中的第一個菜單項的值。
nIDLast 指定(作為一個ID號或位移量,依賴於nFlags的值)單選鈕組中的最后一個菜單項的值。
nIDItem 指定(作為一個ID號或位移量,依賴於nFlags的值)單選鈕組中的被選中的菜單項的值。
nFlags 以下列方式指定nIDFirst, nIDLast或nIDItem的解釋:
- MF_BYCOMMAND 指定參數給出已存在菜單項的命令ID號。若沒有設置MF_BYCOMMAND或MF_BYPOSITION,那么該值為缺省值
- MF_BYPOSITION 指定參數給出已存在菜單項的位置。第一項在位置0
檢測一個指定的菜單項,並將其選中。同時,該函數不檢測關聯組中其它的菜單項,並清除這些項的單選項類型標志。使用單選鈕位圖而非檢測標記位圖,將顯示被檢測的項。
void CXXDlg::Onmenuskin1() { GetMenu()->GetSubMenu(2)->CheckMenuRadioItem(ID_menuSkin1, ID_menuSkin6, ID_menuSkin2, MF_BYCOMMAND); //改為ID_menuSkin2為選中項
}
2.復選框實現:
這個比較簡單
CMenu* menu = GetMenu()->GetSubMenu(2); menu->CheckMenuItem(ID_menuSkin3, MF_BYCOMMAND | MF_CHECKED);//通過命令ID,選中menuSkin3
CMenu::CheckMenuItem ,在彈出式子菜單中的菜單對象中添加或刪除復選標記.
UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );
返回值:
返回菜單項以前的狀態:MF_CHECKED或MF_UNCHECKED。如果該菜單項不存在,那么將返回0xFFFFFFFF。
參數:
nIDCheckItem 指定由nCheck確定的將要檢測的菜單項。
nCheck 指定如何檢測菜單項,並如何決定菜單中菜單的位置。參數nCheck可以是MF_CHECKED或MF_UNCHECKED與 MF_BYPOSITION或MF_BYCOM MAND的組合。這些標志可通過使用位與操作進行組合。它們有下列含義:
- MF_BYCOMMAND 指定參數給出已存在菜單項的命令ID號。它為缺省值。
- MF_BYPOSITION 指定參數給出已存在菜單項的位置。第一項位於的位置是0。
- MF_CHECKED 與MF_UNCHECKED一起用作開關,在菜單項之前放置缺省的檢測標記。
- MF_UNCHECKED 與MF_CHECKED用作開關,刪除菜單項之前的檢測標記。
說明:
在彈出菜單中為菜單項增添或刪除檢測標記。參數nIDCheckItem指定了將要修改的菜單項。
參數nIDCheckItem既可以標識彈出菜單項,也可以標識菜單項。在檢測彈出菜單項的時候不需特別的步驟。不能檢測頂層菜單。彈出菜單必須通過位置來檢測,其原因在於它沒有與之相關聯的菜單項標識符。