VC中操作菜单的方法



.消息分类
1.标准消息
除WM_COMMAND的外所有以WM_开头消息从CWnd派生都可以接收到这类消息
2.命令消息
来自菜单加速建或工具栏按钮消息这类消息都以WM_COMMAND呈现在MFC中通过菜单项标识来区分区别命令消息;从CCmdTarget派生来都可以接收到这类消息
3.通告消息
由Control控件产生消息例如按钮单击列表框选择等均产生此类消息是向其父窗口(通常是对话框)通知事件发生这类消息也是以WM_COMMAND形式呈现
从CCmdTarget派生都可以接收到这类消息

2.菜单操作介绍
对于菜单操作大家比较熟悉平时在使用电脑时经常会使用到菜单其实对于菜单所有基本操作在MFC中都有相应来对应


1.CMenu* GetMenu const,获取当前主框架下菜单栏指针.它是CWnd成员

2.CMenu::GetSubMenu ,CMenu* GetSubMenu( nPos ) const;获取主菜单下子菜单(般是弹出菜单)指针其中nPos指示弹出菜单位置0表示个子菜单1表示第 2个依次类推GetSubMenu是CMenu成员返回值还是指向CMenu类指针
在CMainFrame类成员OnCreate中写如下代码:GetMenu->GetSubMenu(0)->CheckMenuItem(0,MF_CHECKED|MF_BYPOSITION);
需要介绍说明是CheckMenuItem.其原型定义为UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );其中nIDCheckItem保存需要复选菜单项位置nCheck用来决定是否复选菜单项和表示菜单项位置方式MF_CHECKED或者MF_UNCHECKED和MF_BYPOSITION或者MF_BYCOMMAND连用MF_CHECKED表示复选上菜单项MF_UNCHECKED则相反MF_BYPOSITION表示个参数使用01等数字参数表示菜单项位置MF_BYCOMMAND则表示使用菜单项标识符表示菜单项位置
上面是选择主菜单栏下个弹出菜单在弹出菜单下个个菜单项的后对这个菜单项进行复选操作完成复选
这个操作中包含以下类关系:CMainFrame从CWnd派生而来在CMainFrame成员OnCreate中可以使用CWnd成员GetMenu,获取主框架下菜单指针然后使用菜单类成员GetSubMenu获取弹出菜单菜单指针最后使用菜单类成员CheckMenuItem完成菜单项复选操作


3.在知道了如何使用GetMenu和GetSubMenu我们可以开始熟悉些CMenu操作对具体菜单项进行操作
CMenu::SetDefaultItem
BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE )
行表示SetDfaultItem是CMenu类成员第 2行是SetDefaultItem原型介绍说明以后在对讲解时般以这种方式列出这也是微软MSDN介绍说明规范标准中uItem用来标识操作菜单项位置第 2个参数决定第个参数以何种方式标识菜单项位置默认不是以位置方式标识即是以标识符方式标识使用思路方法:
GetMenu->GetSubMenu(0)->SetDfaultItem(0,TRUE);

4.定制自己菜单资源(在window中资源都由句柄唯标识)
首先定义个CMenu对象
CMenu menu; //定义个菜单对象
SetMenu(NULL); //将当前菜单移走
menu.LoadMenu(IDR_MAINFRAME); //加载自己菜单资源把它和菜单对象联系起来
SetMenu(&menu); //设置当前菜单为menu对象并且使window重画以反映菜单 //变化
menu.Detach; //使菜单资源句柄和菜单对象分离以防本地变量menu释放后 //使菜单资源释放

5,菜单项状态维护
对于菜单项状态如可以使用不能使用和变灰等状态可以使用CMenuEnableMenuItem来实现
其实菜单项状态维护是依赖于CN_UPDATE_COMMAND_UI消息谁捕获CN_UPDATE_COMMAND_UI消息MFC就在其中创建个CCmdUI对象我们可以通过手工或利用ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息更新命令UI处理仅应用于弹出式菜单项上项目不能应用于永久显示顶级菜单项目
使用MFC类向导建立菜单中新建、打开、保存消息处理选择其中ON_UPDATE_COMMAND_UI消息就可以编写来控制菜单项状态例如对于菜单项中<剪切>项操作代码如下:void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
(2pCmdUI->m_nIndex)
pCmdUI->Enable;
}
对于每个菜单项所建立ON_UPDATE_COMMAND_UI消息都有个CCmdUI* pCmdUI参数利用pCmdUI可以使用CCmdUI数据成员和成员来对菜单项进行相关操作m_nIndex是菜单项工具栏按钮或者其他用户接口对象索引这些对象由pCmdUI指定对于剪切项位置是2Enable是使剪切项可用还有其他成员和数据成员介绍说明如下:
CCmdUI::SetCheck
virtual void SetCheck( nCheck = 1 );这个用来设定菜单项合适选择状态默认下是1表示选中;0表示不选中;2表示不确定
CCmdUI::SetText
virtual void SetText( LPCTSTR lpszText );
设置用户接口项文本显示内容
CCmdUI::m_nID
菜单项工具栏按钮或者其他用户接口对象ID标识号这些对象由pCmdUI指定
在使用m_nIndex时注意区别对象索引是区别如:
(2pCmdUI->m_nIndex)//这个索引只是对于菜单项有效对于工具栏中剪切按钮无效 //工具栏中索引不是2;
pCmdUI->Enable;
(4pCmdUI->m_nIndex)//这时工具栏中按钮才有效了假定工具栏上按钮索引是4
pCmdUI->Enable;

6.增加右键弹出菜单功能
思路方法:可以在 工程->增加到工程->conponents and controls
在出现文件选择栏中 选择Visual C Components文件夹再选择popmenu资源文件即可这样就建立了弹出菜单
思路方法 2:在CView中增加鼠标右键点击消息处理中加载个弹出菜单即可
可以使用下面代码:


void CMenuView::OnRButtonDown(UINT nFlags, CPo po)
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
menu.LoadMenu(IDR_MENU2);
ClientToScreen(&po);
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, po.x, po.y,
GetParent);
CView::OnRButtonDown(nFlags, po);
}
具体使用可以在msdn中查看

7.手动增加菜单项消息处理(动态加载菜单项)

在主框架下动态增加菜单项:如在CMainFrame::OnCreate中增加如下代码
GetMenu->GetSubMenu(0)->AppendMenu(MF_STRING,113,"WindowsXp");
以上表示在文件下拉菜单项最后追加项菜单项ID号为113名字是WindowsXp但是它并不是静态菜单资源是在运行过程中动态加载不能使用类向导来增加它OnCommand消息处理只能手动增加步骤如下:
1> 先到Resource.h中增加菜单项资源定义
2> # IDM_WNDXP 113
3> 然后到CMainFrame.h中增加afx_msg void OnWindows;声明消息映射;
4> 再到BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND(IDM_WNDXP,OnWindows)
END_MESSAGE_MAP
的间定义消息映射(已经添加好了);
5> 最后定义OnWindows
void CMainFrame::OnWindows()
{
//定义所需各种操作
};
到此手动增加菜单项消息处理过程完成
Tags: 

延伸阅读

最新评论

发表评论