菜单
来源:互联网 发布:b站遇到淘宝广告弹幕 编辑:程序博客网 时间:2024/04/29 08:10
”菜单栏、工具栏和状态栏是组成Windows程序图形界面的三个主要元素“,这节我们主要谈谈菜单栏的使用。
实现一个菜单响应函数
首先,做一个最简单的示例,单击菜单栏上的某一个菜单选项,对其进行响应。
1.利用资源管理器,在菜单栏上添加Test选项
2.将菜单项设置为”非弹出式“菜单,即将Pop-up属性勾选掉,在windows中菜单分为两种,一种是弹出式菜单,即:顶级菜单,这种类型的菜单不能进行响应命令。另一种是非弹出式菜单,可以响应命令。我们选择弹出式菜单,让该菜单项支持命令响应。
3.使用Class Wizard添加相应响应处理函数,当然,你也可以手动添加。
4.编写响应函数代码。
void CMainFrame::OnTest(){MessageBox(_T("MainFrame Clicked"));}按照以上流程操作之后,我们就添加了一个菜单项,单击运行,得到如下结果:
以上是最简单的菜单响应,我们应该熟知,接下来,我们将逐步讨论菜单的基本操作。
获取菜单
要想对菜单操作,我们首先要获取菜单,MFC的CWnd类提供了GetMenu成员函数方便得到菜单栏指针,进一步通过GetSubMenu选项得到子菜单进行操作。
CMenu* GetMenu( ) const;CMenu* GetSubMenu( int nPos ) const;
标记菜单
标记菜单为菜单选项带有对号的菜单项,我们使用CheckMenuItem函数进行标记,该函数有两个参数。第一个参数取决于第二参数,如果菜单是通过位置标记的即:第二个参数为MF_BYPOSITION,则第一个参数为数字。如果是MF_BYCOMMAND,则第一个参数为ID标识符。
GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_SAVE_AS, MF_BYCOMMAND | MF_CHECKED);默认菜单
在一个应用程序中,有若干个子菜单,每个子菜单最多可以有一个以粗体形式显示的默认菜单项,在MFC中,这个菜单项是通过SetDefaultItem函数进行设置的。
<span style="font-size:18px;">GetMenu()->GetSubMenu(0)->SetDefaultItem(5, true);GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_PRINT, false);</span>图形标记菜单
在菜单项前带有图形的菜单项为图形标记菜单,具体请查看SetMenuItemBitmaps函数:
m_bitmap.LoadBitmapW(IDB_BITMAP1);GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(2, MF_BYPOSITION, &m_bitmap, &m_bitmap);当然,我们使用的位图大小可能不符合windows标准,为了得到菜单项的标准位图大小我们可以使用GetSystemMetrics(SM_CXMENUCHECK)和GetSystemMetrics(SM_CYMENUCHECK)两个函数获得,之后调节成标准大小就可以了。
禁用菜单项
当windows禁用某个菜单项也就屏蔽了该菜单响应函数,我们使用EnableMenuItem函数:
GetMenu()->GetSubMenu(0)->EnableMenuItem(2, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);当然,如果你只做了以上操作,是不会起作用的。因为,MFC为菜单提供了一种命令更新机制,如果我们想更改菜单项的状态就首先需要将CMainFrame的成员变量m_bAutoMenuEnable设置为false,这样我们对菜单的更新才会起作用,即:我们不在通过命令更新机制去判断哪个菜单项可用。利用MFC编程时,菜单项的状态依赖于CN_UPDATE_COMMAND_UI消息,我们可以在这个消息的响应函数对其进行状态设置。
void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI){pCmdUI->Enable(false);}
MFC命令更新机制:当我们单击某个菜单项时,系统会自动将CCmdUI对象与第一个菜单项相关联,如果存在一个ON_UPDATE_COMMAND_UI宏,那么就使用这样一个宏,去调用相应的消息响应函数去处理,进而改变他们的菜单状态,接着依次将CCmdUI绑定第二、第三个菜单项处理。
快捷菜单在windows程序中,一般通过点击右键弹出快捷菜单,这种操作最主要的是实现是TrackPopupMenu函数。首先,我们在资源管理器中创建一个菜单资源。其次,在CView的实现类中添加WM_RBUTTONDOWN消息。最后,处理响应函数。实现代码如下:
CMenu menu;menu.LoadMenuW(IDR_MENU1); CMenu *pPopup = menu.GetSubMenu(0); ClientToScreen(&point); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);以上是静态菜单有关菜单项的操作,接下来我们讨论动态菜单。
添加菜单项
在菜单末尾添加一个指定菜单项
CMenu menu;menu.CreateMenu();GetMenu()->AppendMenuW(MF_POPUP, (UINT)menu.m_hMenu, _T("Test2"));menu.Detach();其中,Detach函数将菜单句柄与菜单对象之间的关系断开。
在菜单中插入一个菜单项
GetMenu()->GetSubMenu(0)->InsertMenuW(ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING | MF_ENABLED, 115, _T("windows程序设计"));删除菜单项
MFC提供了DeleteMenu函数,可以删除一个菜单项目
GetMenu()->GetSubMenu(0)->DeleteMenu(2, MF_BYPOSITION);动态添加菜单项的响应
首先,为新菜单项定义一个ID号
#define IDM_INSERT 121第二,用AppendMenu函数将新菜单项追加到菜单末尾
GetMenu()->GetSubMenu(0)->AppendMenuW(MF_STRING, IDM_INSERT, _T("新增"));第三,在头文件中添加相应函数原型
afx_msg void OnInsert();第四,在消息映射表中,添加消息映射
ON_COMMAND(IDM_INSERT, OnInsert)最后,实现响应函数
void CMainFrame::OnTest(){MessageBox(_T("MainFrame Clicked"));}好了,这样我们就动态添加了一个响应菜单项了。
关于菜单的操作我们就讨论到这里了,在本节中,我们主要讨论了两种菜单,包括:静态菜单操作和动态菜单操作,静态菜单操作包括标记菜单、默认菜单、图形菜单及快捷菜单等。动态菜单操作主要是动态地添加、删除菜单项及响应函数。应该说有关菜单的操作并不难,相信通过稍加训练我们就可以很熟练地掌握。
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- 菜单
- html5图表
- ubuntu下ns2的安装及GDB调试过程
- IAR中 C语言位定义
- 黑马程序员_java基础_面向对象_02
- 记录
- 菜单
- servlet生成动态图片
- windows 下mongodb 的安装
- android NDK jni下的c文件 Unresolved inclusion
- 桥梁(bridge)模式
- Python多进程(multiprocessing)学习总结
- 设计模式 迭代器模式
- Jquery UI effect 扩展效果: slideFade - 滑动同时淡入/淡出
- 关于费曼技巧的应用