近期需要实现一个功能: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既可以标识弹出菜单项,也可以标识菜单项。在检测弹出菜单项的时候不需特别的步骤。不能检测顶层菜单。弹出菜单必须通过位置来检测,其原因在于它没有与之相关联的菜单项标识符。