菜单响应顺序 : view类 文档类 框架类 应用程序类
消息分类
标准消息
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。
命令消息
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
标记菜单
1.
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);
2.
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
图形标记菜单
m_bitmap.LoadBitmapW(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);
str.Format(L"x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
缺省菜单
1.
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
2.
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_NEW);
*菜单分隔符是占索引 位置的
菜单项禁用
首先在CMainFrame构造函数中设置m_bAutoMenuEnabl=FALSE
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
一般的方法是利用命令更新机制 给菜单选项添加 UPDATE_COMMAND_UI事件
然后用CCmdUI的成员函数Enble来控制
*要注意局部变量生命周期问题
SetMenu(NULL); //删除整个菜单
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME); //添加菜单
SetMenu(&menu);
menu.Detach();
右键菜单添加
建立一个MENU资源IDR_MENU1 ID为IDR_POPMENU
在OnRButtonDown函数下实现
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu*pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,GetParent()); //GetParent()可以让CmainFrame响应
动态添加删除菜单
CMenu menu;
menu.CreatePopupMenu(); //创建弹出菜单
GetMenu()->AppendMenuW(MF_POPUP,(UINT)menu.m_hMenu,L"枫江");
GetMenu()->InsertMenuW(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,L"枫江");
menu.AppendMenuW(MF_STRING,IDM_HELLO,L"hello");
menu.AppendMenuW(MF_STRING,112,L"li");
menu.AppendMenuW(MF_STRING,113,L"wei");
menu.Detach(); //使局部变量menu创建的菜单不随着它被析构而销毁
GetMenu()->GetSubMenu(0)->InsertMenuW(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,L"落月");
GetMenu()->DeleteMenu(1,MF_BYPOSITION); //删除子菜单
GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除菜单项
手动添加 菜单项事件响应
1.在Resource.h中添加菜单项ID
2.在所在类头文件中写响应函数原型
例:afx_msg void onHello();
3.消息映射
对于命令消息 通过ON_COMMAND宏来完成
在
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
中间加入ON_COMMAND(IDM_HELLO,onHello)
然后在下面写响应函数实现
*菜单属于框架类 不属于view类 在view类中GetParent()->GetMenu()->...
GetParent()->DrawMenuBar();是在view类里进行菜单的重绘
*CString::Find() 类似与C语言中strchr
*GetActiveView获取当前view类指针
在CMainFrame中调用view类中的成员用到了这个函数
这时候要在前面include上view类的头文件