《Visual C++ NET案例设计教程》-学习情境五  设计菜单学习情境五  设计菜单_第1页
《Visual C++ NET案例设计教程》-学习情境五  设计菜单学习情境五  设计菜单_第2页
《Visual C++ NET案例设计教程》-学习情境五  设计菜单学习情境五  设计菜单_第3页
《Visual C++ NET案例设计教程》-学习情境五  设计菜单学习情境五  设计菜单_第4页
《Visual C++ NET案例设计教程》-学习情境五  设计菜单学习情境五  设计菜单_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习情境五设计菜单任务一创建菜单并编辑菜单资源任务二编写菜单事件代码任务三创建动态菜单返回任务一创建菜单并编辑菜单资源子任务1了解菜单类型知识导读菜单在界面设计中是经常使用的一种元素,包括Windows系统中的窗口、智能终端设备的应用界面等都会经常见到菜单的身影。在对可视化窗口操作时,菜单确实提供了很大方便。在众多应用程序中,最常见的菜单有两种,分为下拉式菜单和弹出式菜单。1.下拉式菜单下拉式菜单一般显示在应用程序窗口的顶部,按照类别排列成一行,与某个类别相关的所有功能均排列在相应类别的下面,所以下拉式菜单通常是由主菜单栏、子菜单及子菜单中的菜单项和分隔条所组成的,如图5-1所示。下一页返回任务一创建菜单并编辑菜单资源2.弹出式菜单弹出式菜单一般可以通过单击鼠标右键等操作显示。它的主菜单不可见,只显示子菜单。由于该菜单的菜单命令依赖于被选中的对象或光标在工作区域内所指的位置,因此该菜单也称为上下文菜单。图5-2所示是选中文字后单击鼠标右键出现的菜单。子任务2掌握菜单编程步骤知识导读在应用程序中创建并使用一个菜单,一般都应该遵循下面四个步骤:(1)在工程中添加一个自定义的菜单资源;(2)用菜单编辑器设计菜单;上一页下一页返回任务一创建菜单并编辑菜单资源(3)将菜单加入应用程序;(4)为每个菜单命令添加消息映射。以上步骤是创建一个自定义菜单的常见步骤,也可以在菜单编辑器或应用程序中修改、控制AppWizard生成的系统菜单及用户自定义菜单。子任务3创建菜单并编辑菜单资源知识导读对于VC++项目,可以使用菜单编辑器进行各种类型的菜单设计。菜单编辑器的功能有:(1)创建菜单及菜单命令;(2)创建菜单快捷键;上一页下一页返回任务一创建菜单并编辑菜单资源(3)定义加速键及快捷菜单;(4)标记菜单;(5)在菜单中加入菜单;(6)启用及禁用菜单;(7)移除与加载菜单;(8)修改和控制系统菜单及用户自定义的菜单。为了使应用程序更容易操作,对于菜单系统的设计还应遵循下列规则:(1)若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“…”。(2)若某项菜单有子菜单,那么在该菜单项文本后有“▶”。上一页下一页返回任务一创建菜单并编辑菜单资源(3)若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与Alt键构成一个组合键,当按住Alt键不放,再敲击该字符时,对应的菜单项就会被选中。(4)若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如“Ctrl+S”组合键(执行保存功能),使用时是先按下Ctrl键不放,然后再按S键。任何时候按下快捷键,相应的菜单命令都会被执行。图5-3所示是一个菜单样例,注意它们的规则含义。需要强调的是,在常见的菜单系统中,最上面的一层水平排列的菜单称为顶层菜单,每一个顶层菜单项可以使用一个简单的菜单命令,也可以使用下拉菜单,在下拉菜单中的每一个菜单项也可以使用菜单命令或下拉菜单。这样一级一级下去可以构造出复杂的菜单系统。上一页下一页返回任务一创建菜单并编辑菜单资源任务实施(1)示例ex05_01:在一个单文档应用程序中创建“贪吃蛇”游戏的下拉式菜单。①分析“贪吃蛇”游戏的需求,得出该游戏的菜单结构如图5-4所示。②启动VisualStudio,选择“文件”→“项目”→“MFC应用程序”,在“名称”编辑框中输入应用程序名“ex05_01”,在“位置”编辑框中输入该程序的存放路径,单击“确定”按钮,如图5-5所示。③进入图5-6所示的“MFC应用程序向导”对话框,单击“下一步”按钮,选中“单个文档”单选按钮,再选择“完成”按钮即可。上一页下一页返回任务一创建菜单并编辑菜单资源④打开资源视图,如图5-7所示,双击menu下的IDR_MAINFRAME进入菜单资源编辑器,也可以通过“新建”菜单进入菜单编辑器。通过菜单编辑器可对菜单进行创建、编辑和删除等。VS2010默认会出现“文件”“视图”和“帮助”3个顶层菜单。⑤图5-7中,在菜单编辑器中,单击“文件”,将之修改为“游戏”,按回车键即可完成。对于多余的菜单项,可以使用“删除”命令进行删除,如图5-8所示。⑥在菜单设计窗口中,可以直接输入菜单标题。双击某菜单标题可浮动显示菜单的其他属性,可以在属性窗口中设置,主要属性见表5-1。上一页下一页返回任务一创建菜单并编辑菜单资源例如,选择“游戏”→“开始”,可看到属性窗口,编辑Caption为“开始”,ID为“ID_GAME_START”,Prompt(提示符)为“游戏开始”,如图5-9所示。⑦如果用户想设计一个级联菜单,可以在菜单项的属性窗口中选中“Pop-up”选项,修改为“True”,这样,在菜单项的右方将显示一个箭头,即可进行子菜单的编辑,如图5-10所示。⑧在设计菜单项信息时,可以为菜单项设置加速键以方便用户操作。在菜单标题的后面加“&+字母”即可实现加速键的设置。程序运行时,用户按下Alt键加上该字母键,便可激活并操作该菜单。例如将菜单标题设置为“中&M”,程序运行时,用户只需按“Alt+M”组合键,便可完成与鼠标单击“中”菜单相同的功能。编辑过程如图5-11所示,按回车键确认即可。上一页下一页返回任务一创建菜单并编辑菜单资源根据项目要求,设计出来的“贪吃蛇”游戏的菜单如图5-12所示。(2)示例ex05_02:在一个单文档应用程序中创建弹出式菜单。①启动VisualStudio,选择“文件”→“项目”→“MFC应用程序”,在“名称”编辑框中输入应用程序名“ex05_02”,在“位置”编辑框中输入该程序的存放路径,单击“确定”按钮,如图5-13所示。②进入“MFC应用程序向导”对话框,单击“下一步”按钮进入图5-14所示界面,选中“单个文档”单选按钮,然后单击“完成”按钮,就可以完成工程的创建。上一页下一页返回任务一创建菜单并编辑菜单资源③在资源视图中,选中Menu,单击鼠标右键,在弹出的菜单中选择“插入Menu”菜单插入菜单,修改插入菜单ID为“IDR_POPMENU”,同时,在IDR_POPMENU菜单中添加新建项“弹出菜单”,如图5-15所示。④在“弹出菜单”下,添加菜单命令“拷贝”“粘贴”“查找”和“测试”,将这些菜单命令的ID修改为“ID_MYCOPY”“ID_MYPASTE”“ID_MYSEARCH”和“ID_MYTEST”,如图5-16所示。⑤修改配置参数,打开头文件Resoure.h,修改以下信息:voidCex05_02App::PreLoadState(){…上一页下一页返回任务一创建菜单并编辑菜单资源GetContextMenuManager()->AddMenu(strName,IDR_POPUP_EDIT);//在这个位置添加下面内容,实现“添加菜单”功能GetContextMenuManager()->AddMenu(strName,IDR_POPMENU);…

}voidCex05_02View::OnContextMenu(CWnd*/*pWnd*/,CPointpoint){#ifndefSHARED_HANDLERS上一页下一页返回任务一创建菜单并编辑菜单资源theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT,point.x,point.y,this,TRUE);//在这个位置添加下面内容,目的是能显示弹出菜单theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPMENU,pointx,point.y,this,TRUE);#endif}⑥编译运行程序,效果如图5-17所示。上一页返回任务二编写菜单事件代码子任务1理解菜单事件知识导读在MFC的框架结构下,“消息映射”是通过巧妙的宏定义,形成一张消息映射表格进行的。这样一旦消息发生,Framework就可以根据消息映射表格进行消息映射和命令传递。在MFC开发的程序中,菜单、工具条按钮等都会产生WM_COMMAND消息。而在MFC的Document/View框架中,有很多类可以响应WM_COMMAND消息,分别是:框架类的CFrameWnd、CMDIChildWnd、CMDIFrameWnd;应用程序类的CWinApp;文档类的CDocu⁃ment;视图类的CView。下一页返回任务二编写菜单事件代码当应用程序主菜单发送一个WM_COMMAND消息时,WM_COMMAND消息将会按一定顺序打开这些类的实例,并调用第一个发现的响应函数。多文档框架中有打开的文档时,WM_COMMAND消息响应顺序为:视图→文档→子框架窗口→应用程序→主框架窗口;多文档框架中没有打开的文档时,应用程序和主框架窗口的顺序不同,即WM_COMMAND消息响应顺序为:主框架窗口→应用程序。在单文档框架应用程序中,因为没有子框架窗口,WM_COMMAND消息响应顺序是:视图→文档→主框架窗口→应用程序。无论有没有打开的文档,主框架窗口都比应用程序类优先。在设计菜单完成功能时,所要编写的菜单事件,就是用来产生WM_COMMAND消息,并根据当前文档状况进行相应的消息响应。上一页下一页返回任务二编写菜单事件代码子任务2编写菜单事件代码任务实施(1)为示例ex05_01所要完成的下拉式菜单编写菜单事件代码。①打开VisualStudio环境,选择“文件”→“打开”→“项目/解决方案”,选择示例ex05_01项目,打开项目。②进入菜单资源视图,如图5-18所示。上一页下一页返回任务二编写菜单事件代码③为菜单添加消息处理函数。选中相应菜单(例如“游戏”→“开始”菜单),单击鼠标右键,在弹出的菜单中选择“添加事件处理函数”,接着弹出窗口“事件处理程序向导”,如图5-19所示。接着,在“类列表”中选中Cex05_01View;在“消息类型”中选中COMMAND(消息类型中有两种类型的消息:COMMAND,用于响应菜单命令;UPDATE_COMMAND_UI,用于更新菜单状态)。单击“添加编辑”,进入代码编辑,代码如下:voidCex05_01View::OnGameStart(){MessageBox(_T("游戏开始了!"));

//弹出对话框显示提示信息}上一页下一页返回任务二编写菜单事件代码③编译运行程序,得到图5-20所示运行结果。(2)为示例ex05_02所要完成的弹出式菜单编写菜单事件代码。①打开VisualStudio环境,选择“文件”→“打开”→“项目/解决方案”,选择示例ex05_02项目,打开项目。②进入菜单资源视图,为菜单添加消息处理函数。选中相应菜单,单击鼠标右键,在弹出的菜单中选择“添加事件处理函数”,如图5-21所示,接着弹出窗口“事件处理程序向导”,如图5-22所示。(3)编译运行程序,效果如图5-23所示。上一页返回任务三创建动态菜单子任务1理解动态菜单知识导读在实际运用中,经常需要根据操作来增减菜单和菜单项。在VC++开发环境下,动态生成菜单的方法有多种。例如:可以利用资源编辑器创建菜单资源,然后在程序运行中动态加入菜单,这种动态生成菜单的方法比较常见,运用比较多。用这种方法动态增加菜单时,首先需要在Resource.h中添加菜单ID。由于是动态生成的菜单选项,所以要实现它的功能就不能在ClassWizard中映射函数了,需要在头文件中手动添加消息函数原型,在代码文件中手动添加消息映射和添加消息响应函数。下一页返回任务三创建动态菜单动态生成菜单的另一种方法,即不能事先对每个菜单ID进行定义,比如从数据库中读出的每条记录内容动态添加为菜单项,菜单项的数量不是固定的,可以在动态添加菜单项时使菜单项的ID顺序递增;对菜单项的消息响应不能事先写出响应代码,而需要根据菜单ID动态响应函数。CMenu类提供了多个方法用于动态设计和修改菜单,其主要方法如下:(1)Attach方法。该方法用于将句柄关联到菜单对象上。语法格式如下:BOOLAttach(HMENUhMenu);说明:hMenu标识菜单句柄。返回值为非零,表示执行成功,否则执行失败。上一页下一页返回任务三创建动态菜单(2)Detach方法。该方法从菜单对象上分离菜单句柄。语法格式如下:HMENUDetach();说明:函数返回分离的菜单句柄。(3)FromHandle方法。该方法根据菜单句柄返回一个菜单对象指针,如果句柄没有关联一个菜单对象,一个临时的菜单对象指针将被创建。语法格式如下:staticCMenu*PASCALFromHandle(HMENUhMenu);说明:hMenu标识菜单句柄。函数返回菜单对象指针。上一页下一页返回任务三创建动态菜单(4)CreateMenu方法。该方法用于创建一个菜单窗口,并将其关联到菜单对象上。语法格式如下:BOOLCreateMenu();说明:执行成功,返回值为非零,否则为零。(5)CreatePopupMenu方法。该方法用于创建一个弹出式菜单窗口,并将其关联到菜单对象上。语法格式如下:BOOLCreatePopupMenu();说明:执行成功,返回值为非零,否则为零。对于弹出式菜单,如果菜单窗口被释放,菜单对象将被自动释放。上一页下一页返回任务三创建动态菜单(6)LoadMenu方法该方法从应用程序的可执行文件中加载一个菜单资源,将其关联到菜单对象上。语法格式如下:BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UINTnIDResource);说明:lpszResourceName标识资源名称。nIDResource标识资源ID。执行成功,返回值为非零,否则为零。(7)DestroyMenu方法。该方法用于释放菜单窗口,在菜单窗口被释放前,它将从菜单对象上分离出来。语法格式如下:上一页下一页返回任务三创建动态菜单BOOLDestroyMenu();说明:当菜单对象的析构函数被调用时,将自动调用DestroyMenu方法释放菜单窗口。(8)DeleteMenu方法。该方法用于从菜单中删除一个菜单项。语法格式如下:BOOLDeleteMenu(UINTnPosition,UINTnFlags);说明:nPosition标识某一个菜单项。nFlags表示如何解释nPosition,可选值如下:①MF_BYCOMMAND根据nPosition标识的菜单ID删除菜单项。②MF_BYPOSITION根据nPosition标识的菜单位置删除菜单项。上一页下一页返回任务三创建动态菜单(9)TrackPopupMenu方法。该方法用于显示一个弹出式菜单。语法格式如下:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);(10)AppendMenu方法。该方法在菜单项的末尾添加一个新菜单。语法格式如下:BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);说明:nFlags标识菜单项的状态信息。nIDNewItem标识菜单项的ID。lpszNewItem标识菜单项的内容。pBmp标识关联菜单项的位图对象指针。上一页下一页返回任务三创建动态菜单(11)GetMenuItemCount方法。该方法用于返回弹出式菜单或顶层菜单的菜单数。语法格式如下:UINTGetMenuItemCount()const;说明:函数返回如果菜单项没有子菜单,函数返回值为-1,否则返回子菜单数。(12)GetMenuItemID方法。该方法根据菜单项的位置返回菜单ID,如果菜单项是一个弹出式菜单,返回值为-1,如果菜单项是一个分隔条,返回值为0。语法格式如下:UINTGetMenuItemID(intnPos)const;说明:nPos标识菜单项的位置。上一页下一页返回任务三创建动态菜单(13)GetMenuString方法。该方法用于获取菜单项的文本。语法格式如下:intGetMenuString(UINTnIDItem,LPTSTRlpString,intnMaxCount,UINTnFlags)const;intGetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const;说明:nIDItem标识菜单项位置或菜单项命令ID,具体含义取决于nFlags参数。lpString标识一个字符缓冲区。nMaxCount标识向字符缓冲区中拷贝的最大字符数。rString标识一个字符串。nflags标识如何解释nIDItem。如果为MF_BYCOMMAND,nIDItem标识菜单项命令ID;如果为MF_BYPOSITION,nIDItem标识菜单项位置。函数返回实际拷贝到缓冲区中的字符数。上一页下一页返回任务三创建动态菜单(14)GetSubMenu方法。该方法用于获取弹出式菜单中的一个菜单项。语法格式如下:CMenu*GetSubMenu(intnPos)const;说明:nPos标识菜单项位置,第一个菜单项对应的位置是0,第二个菜单项对应的位置是1,依此类推。(15)InsertMenu方法。该方法用于向菜单指定位置插入菜单项。语法格式如下:BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);上一页下一页返回任务三创建动态菜单说明:nPosition标识某一个菜单项。nFlags表示如何解释nPosition,可选值如下:①MF_BYCOMMAND根据nPosition标识的菜单ID插入菜单项。②MF_BYPOSITION根据nPosition标识的菜单位置插入菜单项。nIDNewItem标识菜单项的ID。lpszNewItem标识菜单项的内容。pBmp标识关联菜单项的位图对象指针。(16)ModifyMenu方法。该方法用于修改菜单项信息。语法格式如下:BOOLModifyMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);上一页下一页返回任务三创建动态菜单BOOLModifyMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);说明:nPosition标识某一个菜单项。nFlags表示如何解释nPosition,可选值如下:①MF_BYCOMMAND根据nPosition标识的菜单ID修改菜单项。②MF_BYPOSITION根据nPosition标识的菜单位置修改菜单项。nIDNewItem标识菜单项的ID。lpszNewItem标识菜单项的内容。pBmp标识关联菜单项的位图对象指针。(17)RemoveMenu方法。该方法用于移除一个菜单项。语法格式如下:上一页下一页返回任务三创建动态菜单BOOLRemoveMenu(UINTnPosition,UINTnFlags);说明:nPosition标识某一个菜单项。nFlags表示如何解释nPosition,可选值如下:①MF_BYCOMMAND根据nPosition标识的菜单ID删除菜单项。②MF_BYPOSITION根据nPosition标识的菜单位置删除菜单项。(18)DrawItem方法。该方法是一个虚方法,用户可以改写该方法实现菜单的绘制。语法格式如下:virtualvoidDrawItem(LPDRAWITEMSTRUCTpDrawItemStruct);上一页下一页返回任务三创建动态菜单说明:lpDrawItemStruct是一个DRAWITEMSTRUCT结构指针,DRAWITEMSTRUCT结构包含了菜单项的ID、类型、画布、句柄等详细信息。子任务2创建动态菜单任务实施示例ex05_03:创建动态菜单。(1)启动VisualStudio,选择“文件”→“项目”→“MFC应用程序”,在“名称”编辑框中输入应用程序名“ex05_03”,在“位置”编辑框中输入该程序的存放路径,单击“确定”按钮。上一页下一页返回任务三创建动态菜单(2)进入“MFC应用程序向导”对话框,单击“下一步”按钮,选中“单个文档”单选按钮,然后单击“完成”按钮,就可以完成工程的创建。(3)在资源视图中添加一个新的菜单ID为“IDR_MENU1”。(4)在菜单中添加“FIRST动态菜单(&F)”和“SECOND动态菜单(&S)”两项,ID分别为“ID_FIRST”和“ID_SECOND”,如图5-24所示。上一页下一页返回任务三创建动态菜单(5)为“IDR_MENU1”菜单中新添加的菜单项添加消息处理函数。在“事件处理程序向导”对话框的“类列表”中选择CMainFrame,“消息类型”为COMMAND,如图5-25所示,单击“添加编辑”,修改代码如下:voidCMainFrame::OnFirst(){//TODO:在此添加命令处理程序代码MessageBox(_T("你选择了FIRST动态菜单!"),_T("第一个动态菜单消息"),MB_OK|MB_ICONQUESTION);}voidCMainFrame::OnSecond()上一页下一页返回任务三创建动态菜单{//TODO:在此添加命令处理程序代码MessageBox(_T("你选择了SECOND动态菜单!"),_T("第二个动态菜单消息"),MB_OK|MB_ICONQUESTION);}(6)在资源视图中,定位到“IDR_MAINFRAME”主菜单,在“帮助”后边添加新项“动态菜单演示”,在“动态菜单演示”下添加两个新项“添加动态菜单”和“删除动态菜单”,ID分别为“ID_ADD”和“ID_DELETE”,如图5-26所示。上一页下一页返回

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论