MFC 高级控件

上传人:油条 文档编号:26857212 上传时间:2018-01-02 格式:PPT 页数:57 大小:1.19MB
返回 下载 相关 举报
MFC 高级控件_第1页
第1页 / 共57页
MFC 高级控件_第2页
第2页 / 共57页
MFC 高级控件_第3页
第3页 / 共57页
MFC 高级控件_第4页
第4页 / 共57页
MFC 高级控件_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《MFC 高级控件》由会员分享,可在线阅读,更多相关《MFC 高级控件(57页珍藏版)》请在金锄头文库上搜索。

1、高级控件,第六章,2,回顾,对话框类介绍对话框控件及资源创建模式对话框创建非模式对话框数据交换及数据验证,本章目标,设计应用程序菜单为应用程序添加快捷键弹出式菜单的设计工具栏编程状态栏编程TabCtrl控件的使用树控件及列表控件的使用,4,菜单的类型,菜单是作为一种资源定义的,常见的类型有三种:下拉层叠式菜单:在应用程序主窗口或最上层窗口的菜单,按类别排列,每一个类别对应一个下拉式菜单层叠式菜单:选择主菜单或一个菜单项时弹出的子菜单。用户可以定义多重嵌套的弹出式菜单。可以通过放置分隔线对逻辑或功能上紧密相关的菜单项分组弹出式菜单(上下文菜单):当右击某个界面对象时,通常会弹出快捷菜单,它出现在

2、鼠标箭头的位置,快速展示当前对象可用的命令功能,免除在菜单中一一查找的麻烦,5,快捷键和热键,键盘快捷键(加速键)是一些特定的键的组合,通常使用“Ctrl”键与另一个键组合,或者使用功能键。热键是指菜单项中带有下划线的字母。用户按下“Atl”键+带下划线的字母,就可以选择相应的菜单项,6,菜单设计的一般原则,若点击某菜单项会弹出一对话框,那么在该菜单项文本后有“”。若某项菜单有子菜单,那么在该菜单项文本后有“ ”。菜单项需要助记符,用括号将带下划线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。若某项菜单需要快捷键的支持,则一般将其列

3、在相应菜单项文本之后。任何时候按下快捷键,相应的菜单命令都会被执行。,7,编辑菜单,使用菜单编辑器来编辑菜单资源。双击ResourceView视图中的Menu菜单资源,即可打开菜单编辑器插入新菜单:在当前空白菜单项位置插入,则选定窗口中的空白菜单项后按回车键(或双击空白菜单项)要在某菜单项前插入,选中该菜单项并按Ins键,菜单编辑器将在该菜单项前插入一个空白菜单项,然后双击该空白菜单项进行编辑。,8,菜单的属性,在菜单的空位置上双击鼠标左键,则出现它的属性对话框,9,菜单命令的消息映射2-1,WM_COMMAND是最常用的菜单消息,它对应的消息映射宏是ON_COMMAND,消息映射为:ON_C

4、OMMAND(id, idFun)id为某一菜单项的ID,idFun为相应菜单命令的消息处理函数。,10,菜单命令的消息映射2-2,应该将菜单命令映射到哪个类中,需要由该命令的功能决定。如果一个命令同视图的显示有关,就应该将其映射到视图类;如果同文档的读写有关,就映射到文档类中;如果命令完成通用功能,一般映射到窗口框架类。有时无法对功能进行准确分类,则可以将菜单命令映射到任意一个类,看看是否能够完成指定的功能。,11,代码演示,菜单编程,12,为菜单添加快捷键2-1,在工作区的资源视图中展开Accelerator节点,然后双击IDR_MAINFRAME标识符,显示组合键资源编辑器,13,为菜单

5、添加快捷键2-2,双击ID最下面的空白条,打开“属性”对话框如下图所示。在ID中选择或添加菜单命令的ID号(如ID_FILE_SAVE,通常与菜单一致),在Modifiers中选择组合键是否使用Ctrl、Alt、Shift键,在Key中选择或添加组合键的主键值(如S),这样就添加了一个组合键Ctrl+S。,14,菜单的有效控制,一般情况下,菜单项都不止一种状态,我们经常需要根据应用的内部状态来对菜单项作相应的改变。MFC通过消息映射机制和CCmdUI类更新菜单项的显示。 UPDATE_COMMAND_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新,15,菜单的有效控制,BEG

6、IN_MESSAGE_MAP(CFileDoc, CDocument) / Many ON_* macrosremoved. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)END_MESSAGE_MAP() . . . void CFileDoc:OnUpdateFileSave(CCmdUI* pCmdUI) / Enable the menu item if the file has been modified. pCmdUI-SetCheck(m_fModified); pCmdUI-Enable(m_fModified); ,1

7、6,菜单的编程控制4-1,创建菜单:CMenu类的CreateMenu和CreatePopupMenu用来创建一个菜单或子菜单框架,原型如下:BOOL CreateMenu( );/ 产生一个空菜单BOOL CreatePopupMenu( );/ 产生一个空的弹出式子菜单装入菜单:将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。BOOL LoadMenu( LPCTSTR lpszResourceName );BOOL LoadMenu( UINT nIDResource );,17,菜单的编程控制4-2,添加菜单项:菜单

8、创建后,可调用AppendMenu或InsertMenu函数添加一些菜单项。AppendMenu是将菜单项添加在菜单的末尾处,InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL );BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT

9、nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );需要注意的是:nFlags指定加入菜单项的风格,值MF_STRING表示菜单项是一个字符串;nIDNewItem指定要加入菜单项的ID;lpszNewItem指定菜单项的显示文本nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。,18,菜

10、单的编程控制4-3,当菜单项增加后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。,19,菜单的编程控制4-4,调用DeleteMenu函数可将指定的菜单项删除,调用该函数后,应调用CWnd:DrawMenuBar使菜单更新。函数原型如下:BOOL DeleteMenu( UINT nPosition, UINT nFlags );nPosition表示要删除的菜单项位置,它由nFlags进行说明。若当nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID号,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位

11、置(第一个菜单项位置为0)用来获得菜单的菜单项数,调用失败后返回-1: UINT GetMenuItemCount() const;获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR,则返回-1: UINT GetMenuItemID( int nPos ) const;获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针:CMenu* GetSubMenu( int nPos ) const;,20,动态添加菜单,int CMainFrame:OnCreate(LPCREATES

12、TRUCT lpCreateStruct).CMenu* pSysMenu = GetMenu();/ 获得主菜单句柄CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/ 获得第二个子菜单的句柄CString StrMenuItem(新的菜单项);pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔线pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/ 允许使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜单项m_bAutoMenuEnabl

13、e = FALSE; / 使添加的菜单处于允许状态,默认为灰显pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);DrawMenuBar();/ 更新菜单return 0;/使用ClassWizard处理OnCommand消息并检测用户菜单的nID参数。BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字节表示菜单、控件、加速键的命令IDif (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你

14、选中了新的菜单项);return CFrameWnd:OnCommand(wParam, lParam);,21,上下文菜单3-1,当用户单击鼠标右键,上下文菜单出现在光标所在位置。上下文菜单是通过利用CMenu类和其成员函数,在程序运行过程中动态建立的。一般而言,上下文菜单是利用现有的菜单项来进行创建,但也可以为上下文菜单专门建立一个菜单资源,然后通过调用函数CMenu:LoadMenu()装入所创建的菜单资源。当右击鼠标并释放后,WM_CONTEXTMENU消息将发给应用程序。在程序中可通过为WM_CONTEXTMENU添加消息处理函数来实现弹出式菜单。WM_CONTEXTMENU消息是在

15、收到WM_ RBUTTONUP消息后,由Windows产生的。但如果在WM_RBUTTONUP的消息处理函数中没有调用基类的处理函数,那么应用程序将不会收到WM_CONTEXTMENU消息。,22,上下文菜单3-2,函数TrackPopupMenu()用于在指定位置显示弹出式菜单,并响应用户的菜单项选择。函数原型:BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );函数第1个参数是位置标记,TPM_LEFTALIGN表示以x坐标为标准左对齐显示菜单;第2、3个参数指定弹出式菜单的

16、屏幕坐标;第4个参数指定拥有此弹出式菜单的窗口。,23,上下文菜单3-3,void CMyView:OnRButtonDown(UINT nFlags, CPoint point) CView:OnRButtonDown(nFlags, point);CMenu* menu_bar = AfxGetMainWnd()-GetMenu();CMenu* file_menu = menu_bar-GetSubMenu(0);ASSERT(file_menu);file_menu-TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, poin

17、t.y, this);void CMyView:OnContextMenu(CWnd* pWnd, CPoint point) CMenu menuPopup; / 声明菜单对象if (menuPopup.CreatePopupMenu() / 创建弹出式菜单menuPopup.AppendMenu(MF_STRING,ID_COIN_ADD, 增加硬币tCtrl+A);menuPopup.AppendMenu(MF_STRING, ID_COIN_SUB, 减少硬币tCtrl+B);menuPopup.TrackPopupMenu(TPM_LEFTALIGN,point.x, point.y, this);,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号