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); //bool为false则UINT为ID表示,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、屏蔽菜单项