高级程序设计语言MFC(资源的应用).ppt
《高级程序设计语言MFC(资源的应用).ppt》由会员分享,可在线阅读,更多相关《高级程序设计语言MFC(资源的应用).ppt(89页珍藏版)》请在三一办公上搜索。
1、高级程序设计语言,MFC(资源的应用),MFC(资源应用),菜单、工具栏和状态栏,5.1.1 文档应用程序的MFC类结构,用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_SDI,将项目工作区窗口切换到“ClassView(类视图)”页面,可以看到构成Ex_SDI 应用程序框架的MFC类结构,如图所示。再创建一个默认的多文档应用程序Ex_MDI,可以看到如图所示的MFC类结构。,5.1.2 项目的文件组织,Visual C+6.0中,项目中所有的源文件都采用文件夹的方式进行管理的,每一个类的源代码均保存同名的h和cpp文件。,.DSP:VC开发环境生成的工程文件。.DSW
2、:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件。.RC:资源定义文件.CLW:ClassWizard生成的用来存放类信息的文件。.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。.pch(Pre-Compiled File)预编译文件,可以加快编译速度。,5.1.2 项目的文件组织,还有相应的Debug(调试)、Res(资源)等子文件夹。程序项目Win32 Release版本,它与Debug的区别在于:Debug版本的运行程序有相应的调试信息码,而Release版本的
3、运行程序没有,但Release版本的运行程序经过代码的优化,其程序的运行效率被最大提升。通过选择”build”“Set Active Configuration”菜单命令,在图所示的对话框中,选择“Ex_SDI-Win32 Release”,然后单击确定按钮,编译后即可。,5.2 菜单,Windows程序都有各自的菜单。为了使Windows程序更容易操作,许多程序员对于菜单的设计都遵循下列一些规则:,若选择某菜单项会弹出一对话框,那么在该菜单项文本后有“”。(2)若某项菜单有子菜单,那么在该菜单项文本后有“”。(3)若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与Alt构成一个组合
4、键,当按住“Alt”键不放,再敲击(4)该字母时,对应的菜单项就会被选中。,(4)若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N,使用时是先按下“Ctrl”健不放,然后再按“N”键。任何时候按下快捷键,相应的菜单命令都会被执行,菜单的执行顺序,当一个菜单项的时候,最先接受到菜单项消息的是CMainFrame框架类。CMainFrame框架类将会把菜单项消息交给它的子窗口View类,由View类首先进行处理;如果View类检测到没对该菜单项消息做响应,则View类把菜单项消息交由文档类Doc类进行处理;如果Doc类检测到Doc类中也没对该
5、菜单项消息做响应,则Doc类又把该菜单项消息交还给View类,由View类再交还给CMainFrame类处理。如果CMainFrame类查看到CMainFrame类中也没对该消息做响应,则最终交给App类进行处理,5.1.1 更改应用程序菜单,通过菜单编辑器直接修改菜单资源IDR_MAINFRAME可以实现添加和修改应用程序菜单,如下示例过程。例Ex_MenuSDI 更改应用程序菜单(1)创建一个默认的单文档应用程序Ex_MenuSDI。(2)在项目工作区窗口中选择ResourceView页面,双击 资“Menu”项中的IDR_MAINFRAME,则菜单编辑器窗口 出现在主界面的右边,项目Ex
6、_MenuSDI相应的菜单资 源在菜单编辑器窗口中显示出来。,(3)按快捷键Ctrl+R,弹出“插入资源”对话框,在资源类型中选定“Menu”,如图,5.1.1 更改应用程序菜单,单击新建按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1,以后依次为IDR_MENU2、IDR_MENU3、.),同时自动打开这个新的菜单资源。,5.1.1 更改应用程序菜单,在Menu资源的ID_MENU1上右击鼠标,从弹出的快捷菜单中选择“Properties”命令,在这里可以重新指定菜单资源ID,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪
7、个环境中,例如当指定条件为_DEBUG,则菜单资源只存在于Debug编译环境中。,5.1.1 更改应用程序菜单,在菜单的空位置上双击鼠标左键,则出现它的属性对话框。通过其属性对话框为菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,需要再次强调的是,符号&用来指定后面的字符是一个助记符。,打开Ex_MenuSDI程序菜单资源IDR_MAINFRAME,在“查看”菜单的最后添加一个子菜单项“显示测试菜单(&M)”,ID设为ID_VIEW_TEST。为CMainFrame类添加一个CMenu类型的成员变量
8、m_NewMenu,CMenu类是用来处理菜单的一个MFC类。,5.1.1 更改应用程序菜单,按快捷键Ctrl+W打开MFC ClassWizard对话框,切换到Message Maps页面,从“Class name”列表中选择CMainFrame,分别为菜单项ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默认的消息映射函数名,并添中下列代码:,void CMainFrame:OnViewTest()m_NewMenu.Detach();/使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);/
9、清除应用程序菜单SetMenu(,5.2.2 使用键盘快捷键,加速键也往往被称为键盘快捷键,加速键也是一种资源,它的显示、编辑过程和菜单相似。例如下面的示例过程是为前面两个菜单ID_VIEW_TEST和ID_TEST_RETURN定义键盘快捷键:先打开上例的项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,出现如图的加速键资源列表。,5.2.2 使用键盘快捷键,建立一新的加速键,双击加速键列表的最下端的空行,弹出如图所示的“Accel Properities”对话框,可设置的属性如表所示。,5.2.2 使用键盘快捷键,在上述对话框中,选择Ex_MenuSDI添加的
10、“显示测试菜单”菜单项ID_VIEW_TEST作为要联用的加速键的ID号,单击下一键按钮,并按下Ctrl+1作为此加速键的键值。按同样的方法,为菜单项ID_TEST_RETURN添加速键Ctrl+2。需要说明的是,为了使其他用户能查看并使用该加速键,还需在相应的菜单项文本后面添加加速键内容。例如,可将ID_VIEW_TEST菜单项的标题改成“显示测试菜(&M)tCtrl+1”,其“t”是将后面的“Ctrl+1”定位到一个表位。编译运行并测试。当程序运行后,按“Ctrl+1”和“Ctrl+2将执行相应的菜单命令。,菜单的编号,一个菜单栏可以有若干个子菜单,一个子菜单又可以有若干个菜单项等。对菜单
11、栏的子菜单由左至右建立从0开始的索引。对特定子菜单的菜单项由上至下建立了从0开始的索引。访问子菜单和菜单项均可以通过其索引或标识(如果有标识的话)进行。,5.2.3 菜单的编程控制,创建菜单 CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下:BOOL CreateMenu();/产生一个空菜单 BOOL CreatePopupMenu();/产生一个空的弹出式子菜单2.装入菜单资源 将菜单资源装入应用程序中,需调用CMenu成员函数LoadMenu,然后用SetMenu对应用程序菜单进行重新设置。BOOL LoadMenu(LP
12、CTSTR lpszResourceName);BOOL LoadMenu(UINT nIDResource);其中,lpszResourceName为菜单资源名称,nIDResource为菜单资 源ID号。,5.2.3 菜单的编程控制,3.添加菜单项 当菜单创建后,用户可以调用AppendMenu或InsertMenu 函数来添加一些菜单项。AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。,BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR pszNewIt
13、em=NULL);BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);,4.删除菜单项 调用DeleteMenu函数可将指定的菜单项删除,需要注意的是:调用该函数后,不管菜单依附的窗口是否改变
14、,都应调用CWnd:DrawMenuBar使菜单更新。,5.2.3 菜单的编程控制,函数DeleteMenu的原型如下:,BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中,参数nPosition表示要删除的菜单项位置,它由nFlags进行说明。若当nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID号,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。,5.获取菜单项 下面的四个CMenu成员函数分别获得菜单的项数、菜单项的ID号、菜单项的文本内容以及弹出式子菜单的句柄
15、。UINT GetMenuItemCount()const;该函数用来获得菜单的菜单项数,调用失败后返回-1。,UINT GetMenuItemID(int nPos)const;该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR,则返回-1。,5.2.3 菜单的编程控制,int GetMenuString(UINT nIDItem,CString 该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。,例Ex_Menu 菜单项的编程控制(1)创建一个默认的单文
16、档应用程序Ex_Menu。,5.2.3 菜单的编程控制,选择“查看”菜单“Resource Symbols”命令,“资源符号”对话框,它能对应用程序中的资源标识符进行管理。程序中添加的菜单项需要一个标识值,最好用一个标识符来代替这个值,因此这里通过“资源符号”对话框来创建一个新的标识符。,5.2.3 菜单的编程控制,(3)单击新建按钮,在名字(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在值(Value)框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。保留默认的ID值101,单击确定按钮。,5.2.3 菜单的编程控制
17、,(4)关闭“资源符号”对话框,在CMainFrame:OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct).CMenu*pSysMenu=GetMenu();/获得程序菜单指针/获得第二个子菜单的指针 CMenu*pSubMenu=pSysMenu-GetSubMenu(1);CString StrMenuItem(新的菜单项);pSubMenu-AppendMenu(MF_SEPARATOR);/增加一水平分隔线/在子菜单中增加一菜单项 pSubMenu-Appen
18、dMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/pSubMenu-InsertMenu(1,MF_BYPOSITION,ID_NEW_MENUITEM,StrMenuItem);/允许没有使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜单项 m_bAutoMenuEnable=FALSE;/关闭系统自动更新菜单状态/激活菜单项 pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);DrawMenuBar();/更新菜单 return 0;,5.2.3 菜
19、单的编程控制,(5)用MFC ClassWizard处理OnCommand消息并检测用户菜单的nID参数。,BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam)/wParam的低字表示菜单、控件、加速键的命令ID if(LOWORD(wParam)=ID_NEW_MENUITEM)MessageBox(你选中了新的菜单项);return CFrameWnd:OnCommand(wParam,lParam),(6)编译运行并测试。这样当选择菜单“编辑”“新的菜单项”命令后,就会弹一个对话框,显示“你选中了新的菜单项”消息。,5.2.4 使用
20、快捷菜单,1.快捷菜单实现函数 用资源编辑器和MFC库的CMenu:TrackPopupMenu函数可以很容易地创建这样的菜单,CMenu:TrackPopupMenu 函数原型如下:,BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT lpRect=NULL);该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志,nFlags的值及其对其他参数的影响,5.2.4 使用快捷菜单,2.示例 本示例是在前面Ex_SDI基础上进行的,当显示主 菜单IDR_MAINFRAME
21、时,右击鼠标弹出“查看”菜 单的子菜单,当显示菜单IDR_MENU1时,右击鼠 标弹出“测试”菜单的子菜单。,续例Ex_MenuSDI 使用快捷菜单(1)打开前面的单文档应用程序Ex_MenuSDI。,(2)用MFC ClassWizard在CMainFrame类添加 WM_CONTEXTMENU消息映射。,(3)编译运行并测试。,void CMainFrame:OnContextMenu(CWnd*pWnd,CPoint point)CMenu*pSysMenu=GetMenu();/获得程序菜单指针 int nCount=pSysMenu-GetMenuItemCount();/获得顶层菜
22、单个数 int nSubMenuPos=-1;for(int i=0;iGetMenuString(i,str,MF_BYPOSITION);/若是菜单标题是“查看”或“测试”,记录下所在位置 if(str.Left(4)=查看)|(str.Left(4)=测试)nSubMenuPos=i;break;pSysMenu-GetSubMenu(nSubMenuPos)-TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);,5.3.1 使用工具栏编辑器,选择菜单“文件”“打开工作区”,将前面的单文档应用程序Ex_
23、MenuSDI调入。在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME则工具栏编辑器出现在主界面的右边。,5.3.1 使用工具栏编辑器,1.创建一个新的工具栏按钮 在新建的工具栏中,最右端总有一个空按钮,双击该按钮弹出其属性对话框,在ID框中输入其标识符名称,其右端又出现一个新的空按钮。,2.移动一个按钮 在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相 应位置即可。如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失。,3.删除一个按钮 将选取中的按钮拖离工具栏,则该按钮就消失了。但若选中按钮后,单击Delete键并不能删除一个按钮,
24、只是将按钮中的图形全部以背景色填充。,5.3.1 使用工具栏编辑器,4.在工具栏中插入空格 在工具栏中插入空格有以下几种情况:,如果按扭前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。,如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。,如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。,5.工具栏按钮属性的设置双击某按钮弹出其属性对话
25、框,如图所示。,5.3.1 使用工具栏编辑器,工具栏按钮属性对话框,属性对话框中的各项说明见表,5.3.2 工具按钮和菜单项相结合,工具按钮和菜单项相结合是指当选择工具按钮或菜单命令时,操作结果是一样的。Ex_MenuSDI基础上进行的,通过两个工具按钮分别显示主菜单IDR_MAINFRAME和菜单IDR_MENU1。,(1)打开前面的单文档应用程序Ex_MenuSDI。(2)利用工具栏编辑器设计两个工具按钮,位置内容如图所示。(3)双击刚才设计的第一个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_TEST_RETURN,在提示框内键入“返回应用程序主菜单n返回主菜单”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 程序设计语言 MFC 资源 应用
链接地址:https://www.31ppt.com/p-2334178.html