关于菜单的学习(VS2010)

本文介绍了VS2010中MFC菜单的使用,包括菜单消息分类(标准消息、命令消息、通告消息),如何添加响应,创建标记菜单和缺省菜单项,图形标记菜单的创建,屏蔽菜单项,取消及重新加载菜单,命令更新机制,PopupMenu菜单的添加,动态创建和管理菜单,以及如何为动态创建的菜单项添加消息响应。此外,还讨论了在CMainFrame类中截获和处理消息的方法。
摘要由CSDN通过智能技术生成

1、菜单消息的分类

    菜单消息一般分3类:

    1.1标准消息

    除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接收这类消息。

    1.2命令消息

    都是来自菜单、加速键或工具栏按钮的消息,这类消息以WM_COMMAND形式呈现。在MFC中通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wPara参数识别。从CCmdTarget派生的类,都可以接收到这类额消息。

    1.3通告消息

    是由控件产生的消息,例如按钮的单机、列表框中选项的选择都会产生这类消息,目的是向父窗口(通常是对话框)通知事件的发生。这类消息会以WM_COMMAND形式呈现。从CCmdTarget派生的类,都会接收这类的消息。


2、菜单添加响应

     2.1操作

    资源视图中打开菜单,在需要添加的菜单项右击属性将Popup改为false,邮件添加响应函数,选择响应的类即可,编辑响应函数;

    2.2菜单消息响应顺序

     4个类的消息响应优先次序分别是:1.View;2.CDOC;3.CMainFrame.4.CWinAPP.

3、创建标记菜单

CMainFrame::OnCreate函数下:

GetMenu();  CWnd的成员函数,返回整个菜单栏的指针。

GetMenu()->GetSubMenu(0);        获取子菜单,参数为子菜单索引,从0开始

GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED); /通过位置索引设置标记

GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);     //通过菜单项的ID进行索引设置标记


<注意>

VS2010中,由于CMainFrame继承至CFrameWndEx会导致无法像VC6.0一样使用GetMenu()等函数,所以这时在建立工程的时候就应该选择为:第一步:项目标准: MFC标准视觉样式和颜色:windows 本机/默认第五步:命令栏:使用经典菜单这样就和VC6.0中的菜单一样了

4、创建缺省菜单项

CMenu::SetDefaultItem(UINT ,BOOL);   //boolfalseUINTID表示,true为地址索引表示。

GetMenu()->GetSubMenu(0)->SetDefaultItem(1,true);将文件-打开设置为缺省项。

<注意>

确定菜单的索引号,注意从0开始,分隔符也算数。

一个子菜单只能有一个缺省菜单。

5、创建图形标记菜单

CMenu::SetMenuItemBitmaps(UINT nposition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked);

nFlags:  MF_BYPOSITION MF_BYCOMMAND位置索引和ID索引。

pBmpUnchecked 没有选中时的位图

pBmpChecked 选中时的位图

<具体操作>

先通过GetSystemMetrics()函数获取菜单图标大小,按这个大小制作位图:

CString str;

      str.Format(_T("x=%d,y=%d"),GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));

       MessageBox(str);        //显示出来宽高,13*13的,然后制作13*13的位图

 

然后CMainFrame中添加成员变量:m_bitmap

m_bitmap.LoadBitmapW (IDB_BITMAP1);

GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);

6、屏蔽菜单项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值