近期需要实现一个功能:MFC对话框中,一项菜单下有五个菜单项,改变菜单项选中状态,每次只能选择其中一个打勾。(单选)

然后在网上搜了下资料,稍微总结下,以防后面用到。

1.单选实现:

CMenu* menu = GetMenu()->GetSubMenu(); //获得菜单项的第二个子菜单
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
说明:
检测一个指定的菜单项,并将其选中。同时,该函数不检测关联组中其它的菜单项,并清除这些项的单选项类型标志。使用单选钮位图而非检测标记位图,将显示被检测的项。
 
注意:引用的是菜单条目的位置(第一个位置0):设为MF_BYPOSITION;引用的是菜单ID,则设为MF_BYCOMMAND。
这个组别既可按位置定义,也可按菜单ID定义。复选的项目会显示一个圆形的样式复选符号(●),而不是一个标准的复选符号(√)
 
 
如果想实现点击改变选择项,还需要在菜单子项的点击事件中,重写选中项,如下:
void CXXDlg::Onmenuskin1()
{
GetMenu()->GetSubMenu()->CheckMenuRadioItem(ID_menuSkin1, ID_menuSkin6, ID_menuSkin2, MF_BYCOMMAND); //改为ID_menuSkin2为选中项
}

2.复选框实现:

这个比较简单

CMenu* menu = GetMenu()->GetSubMenu();
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既可以标识弹出菜单项,也可以标识菜单项。在检测弹出菜单项的时候不需特别的步骤。不能检测顶层菜单。弹出菜单必须通过位置来检测,其原因在于它没有与之相关联的菜单项标识符。

 
 
 
 

[MFC] 对话框菜单项Menu选中打勾(单选,多选)的更多相关文章

  1. 菜单项(Menu)的初步认识 以及 多级菜单(SubMenu)的初步认识

    MainActivity.class public class MainActivity extends AppCompatActivity { private TextView textView; ...

  2. 建立CMenu菜单项,实现选中菜单项点击左键响应事件

    这里我只是根据自己的项目做了一些总结,实现点击右键弹出菜单项,点左键选择菜单项: CMenu menu; VERIFY(menu.CreatePopupMenu());//新建一个cmenu菜单项 m ...

  3. menu菜单项和menubutton菜单按钮的结合使用

    <!--创建需要显示的菜单按钮(munebutton),menu指定的是菜单项--><a href="javascript:void(0)" id="m ...

  4. GUI tkinter (Menu)菜单项篇

    """添加顶层菜单:1.我们可以使用Menu类来新建一个菜单,Menu和其他的组件一样,第一个是parent,这里通常可以为窗口2.然后我们可以用add_command方 ...

  5. MFC对话框编程详细学习笔记

    因最近研究工作要用到MFC,故再次重温了孙鑫老师的MFC对话框编程,因所用的编译软件为VS2008,与视频中孙老师使用的VC++6.0有很大出入,造成很大不便,我通过各方查找,实现了VS2008相对应 ...

  6. MFC 对话框添加菜单

    1.在Resource View 里右击菜单里选择Add Resource,选择menu,添加一个IDR_MENU1的菜单.在编辑器编辑菜单,添加菜单项,命名各个菜单项的ID. 2.在所要添加菜单的对 ...

  7. VS2010/MFC对话框一:创建对话框模板和修改对话框属性

    创建对话框主要分两大步: 第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件: 第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 创建 ...

  8. Qt Widgets——动作类与小部件菜单项

    本文主要涉及以下三个类: QAction ——QWidgetAction QActionGroup QAction可称为动作类,它一般可当作菜单中的项组成菜单,也可作为工具栏上的按钮,它主要由图标.文 ...

  9. cocos2dx中的菜单项CCMenuItem及其五个子类的使用

    /*CCMenuItem是一个虚基类,因此必须实现它的五个子类之一,再把子类对象赋给父类指针,相当于多态*/ CCMenuItem *fontItem = CCMenuItemFont::create ...

随机推荐

  1. MVC中如何实现本地化的解决方案

    1. Q: 什么是本地化? A: 本地化是指企业在国际化过程中,为了提高市场竞争力,同时降低成本,将产品的生产.销售等环节按特定国家/地区或语言市场的需要进行组织,使之符合特定区域市场的组织变革过程. ...

  2. java中的log

    slf4j slf4j的全称是:  Simple Logging Facade for Java (SLF4J). slf4j的官方网站:http://www.slf4j.org 简介 SLF4J不是 ...

  3. Asp.net MVC4 CodeFirst 使用EFTracingProvider

    一.关于EFTracingProvider EFTracingProvider相关信息见作者博客:关于EFTracingProvider EFTracingProvider Demo下载地址:Trac ...

  4. windows下python的安装

    首先进入python的官方网站:http://www.python.org在下载处,我们找到windows下有两个版本,下载最新版本Python3.4.0

  5. 重拾C

    重拾C,一天一点点_10 来博客园今天刚好两年了,两年前开始学编程. 忙碌近两个月,项目昨天上线了,真心不容易,也不敢懈怠,接下来的问题会更多.这两天调试服务器,遇到不少麻烦. 刚出去溜达了一下,晚上 ...

  6. Stream使用教程

    现在,计算机CPU运行速度的快速发展已经远远超过了内存的访问速度.越来越多的程序性能被内存带宽所限制,而不是计算机的CPU运行速率. Stream benchmark是一个简单的合成基准测试程序,衡量 ...

  7. python cookbook学习1

    python cookbook学习笔记 第一章 文本(1) 1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t ...

  8. [Android学习笔记4]四大应用组件之一:Service 上

    一.什么是Service 一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面.一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Servic ...

  9. SVN插件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. unix网络io模型

    阻塞I/O(bloking I/O) 阻塞IO的特点就是在IO执行的两个阶段(recvfrom和数据从内核空间转移到用户空间)都被block了 非阻塞I/O(non-bloking I/O)   非阻 ...