《《菜单工具栏》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《菜单工具栏》PPT课件.ppt(29页珍藏版)》请在三一办公上搜索。
1、1,用户交互对象菜单、工具栏和状态栏,教学要点 本章内容主要包括菜单资源和工具栏资源的建立,菜单和工具栏按钮对象对WM_COMMAND,UPDATE_COMMAND_UI消息的响应,状态栏牵涉的字符串资源的编辑和对UPDATE _COMMAND _UI消息的响应,在框架类中如何管理工具栏和状态栏。,2,本章内容,1 菜单 2 工具栏3 状态栏 习题,3,1菜单,本节内容 1.1 一个菜单的综合实例 1.2 菜单的组成与分类 1.3 创建菜单资源 1.4 菜单消息 1.5 菜单消息的响应,4,例【1】一个菜单的综合实例,利用应用程序向导MFC AppWizard(exe)创建一个单文档的应用程序
2、,实现菜单资源的建立与消息的响应。,5,消息的分类,标准消息 除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接收到这类消息。命令消息 来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。通告消息 由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可
3、以接收到这类消息。,http:/,6,2.1.2菜单的组成与分类,1菜单的组成 菜单是一种资源,它在资源脚本中经常被存作一个模板,用户通常从菜单栏中选择命令来操作应用程序。菜单主要由下列部分组成:(1)菜单栏(2)菜单(3)菜单项(4)子菜单(5)分隔条(separator)2菜单的分类 Windows 系统支持三种类型的菜单,它们分别是菜单栏(主菜单)、弹出式子菜单和上下文菜单。,7,1.3 创建菜单资源,VC应用程序的资源是由应用程序使用,但却是在程序之外定义的只读数据。菜单是一种资源,可以利用文本编辑器来创建和修改资源,它操作麻烦,不具有可视化的效果。现在的VC程序中的资源编辑都是通过可
4、视化的资源编辑器来进行的。对于SDI的应用程序,应用程序向导生成一个菜单资源IDR_MAINFRAM,对于一般的程序,我们就直接在上面添加自己所需要的菜单资源,方法为:1打开缺省菜单资源 在Workspace窗口中选择ResourceView选项卡,打开MenuExam工程的资源列表,选中“Menu”资源项目下的“IDR_MAINFRAME”,可以看到应用程序缺省定义的菜单资源形式,它包含如图10.2所示的菜单中的“文件”、“编辑”、“查看”、“帮助”四个菜单项。,8,2增加一个主菜单项“图形”选择“帮助”菜单,然后按“Insert”键将会在“查看”与“帮助”菜单项之间加入一个空菜单项。双击该
5、菜单项,弹出图10.3所示的主菜单属性对话框,并在其中的“Caption”编辑框中输入主菜单的标题为“图形”。这样在应用程序的主框架中就增加了一个主菜单项“图形”。3、增加主菜单“图形”的子菜单项 用鼠标双击“图形”菜单下的空白菜单项,弹出图10.4所示的子菜单属性设置对话框,在ID组合框中输入菜单的资源ID为ID_GRAPH_PIE,在“Caption”编辑框中输入“饼图”,在“Prompt”编辑框中输入菜单项提示信息为“在客户区画一个饼图n画饼图”。用同样的方法再添加一个菜单项,其中菜单资源ID为ID_GRAPH_CHORD,“Caption”的内容为“弦图”,“Prompt”中的内容为“
6、在客户区画一个弦图n画弦图”。,9,图10.2 单文档程序的缺省菜单,10,图10.3 主菜单属性对话框,图10.4 子菜单的属性对话框,11,4增加上下文菜单 上下文菜单必须要有自己的资源ID,在Workspace窗口中选择ResourceView选项卡,打开MenuExam工程的资源列表,鼠标右键单击“Menu”项,在弹出菜单中选择“Insert Menu”,完后将该菜单资源的ID修改为IDR_POPUP_MENU。用同步骤3的方法在IDR_POPUP_MENU资源中添加主菜单“上下文菜单”。,12,1.4 菜单消息,菜单被选中时发送消息给Windows,再由Windows传送给应用程序的
7、消息映射。在MFC消息映映射中,有三个菜单消息:WM_COMMAND、ON_UPDATE_COMMAND_UI和WM_CONTEXTMENU。1WM_COMMAND消息 当用户选中了菜单项,激活了相关键加速器或者是选中了与此菜单项相对应的工具栏按钮,Windows发送WM_COMMAND消息,该消息又叫命令消息。命令消息的消息映射采用以下形式:ON_COMMAND(MenuId,ClassMethod)2UPDATE_COMMAND_UI消息 UPDATE_COMMAND_UI是MFC所特有的,如果你想根据应用程序的当前状态激活或者使菜单项无效,或者在程序运行的某一时刻反映菜单项的可用性,该条
8、消息就要处理。消息映射采用以下形式:ON_UPDATE_COMMAND_UI(MenuID,ClassMethod),13,3上下文菜单消息WM_CONTEXTMENU 在Windows系统下,随处可见上下文菜单,只要你是在不同程序的不同操作区域内,按下鼠标右键,都会出来一个与当前操作上下文有关的菜单,它就是上下文菜单。当用户按下鼠标右键时,就会发出上下文菜单消息WM_CONTEXTMENU。该消息的消息映射宏为:ON_WM_CONTEXTMENU(),14,1.5 菜单消息的响应,Windows是通过消息传递机制运行的。菜单项对命令的激发、调用是通过发送WM_COMMAND消息来实现的。在单
9、文档和多文档的应用程序中,要考虑消息的路由问题。命令消息WM_COMMAND可以映射到不同的类中,可以根据菜单的不同作用进行不同的映射。对于通用的菜单,则在框架中映射。About对话框的显示菜单最好在应用程序类中映射。在使用类向导为菜单的命令消息进行映射后,ClassWizard自动向程序中插入菜单命令消息映射入口、消息处理函数的原型说明和空的消息映射函数体。,15,1添加WM_COMMAND菜单命令消息响应函数(1)打开前面创建的MenuExam工程,选择View|ClassWizard命令打开类向导对话框。(2)在图10.5所示的对话中,单击“ClassName”列表框中的下拉按钮,在其中
10、选择“CMenuExamView”项,在“Object IDs”列表框中选择“ID_GRAPH_PIE”,在“Message”列表中选择“Command”项,然后单击“Add Fucntion”按钮弹出“Add Member Function”对话框,采用默认的函数名,单击“OK”按钮。(3)用同样的方法为视图类CmenuExamView中添加了“弦图”菜单项的命令消息函数 OnGraphChord()。(4)消息映射函数的实现 点击代码,16,2添加UPDATE_COMMAND_UI更新菜单命令用户接口的消息响应函数(1)打开MenuExam工程,选择View|ClassWizard命令打开
11、类向导对话框,单击“ClassName”列表框中的下拉按钮,在其中选择“CMenuExamView”项,在“Object IDs”列表框中选择“ID_GRAPH_PIE”,在“Message”列表中选择“UPDATE_COMMAND_UI”项,然后单击“Add Fucntion”按钮弹出“Add Member Function”对话框,采用默认的函数名OnUpdateGraphPie,单击“OK”按钮。(2)用同样的方法,在视图类CmenuExamView中添加了“弦图”菜单项的更新命令用户接口的消息函数OnUpdateGraphChord()。(3)消息映射函数的实现“饼图”菜单项的更新命令
12、用户接口消息函数OnUpdateGraphPie的代码,17,void CMenuExamView:OnUpdateGraphPie(CCmdUI*pCmdUI)pCmdUI-Enable(!m_IsPie);“弦图”菜单项的更新命令用户接口消息函数OnUpdateGraphChord的代码 void CMenuExamView:OnUpdateGraphChord(CCmdUI*pCmdUI)pCmdUI-Enable(m_IsPie);3添加WM_CONTEXTMENU上下文菜单消息响应函数(1)打开MenuExam工程,选择View|ClassWizard命令打开类向导对话框,单击“Cl
13、assName”列表框中的下拉按钮,在其中选择“CMenuExamView”项,在“Object IDs”列表框中选择“CMenuExamView”,在“Message”列表中选择“WM_CONTEXTMENU”项,然后单击“Add Fucntion”按钮弹出“Add Member Function”对话框,采用默认函数名OnContextMenu,单击“OK”按钮。,18,(2)鼠标右键单击响应函数OnContextMenu()的实现,void CMenuExamView:OnContextMenu(CWnd*pWnd,CPoint point)CMenu PopupMenu;/定义菜单对象
14、PopupMenu.LoadMenu(IDR_POPUP_MENU);PopupMenu.GetSubMenu(0)-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);/弹出上下文菜单,19,2工具栏,本节内容 2.1 工具栏简介 2.2 一个使用工具栏的应用程序 2.3 创建工具栏资源模板 2.4 工具栏类CToolBar 2.5 在应用程序框架中创建工具栏对象 2.6 工具栏的消息处理机制,20,3.2.1工具栏简介,工具栏为用户提供了程序命令的直接访问方式,工具栏中包含有一些水平排放的图形按钮,当用一次鼠
15、标单击它们时就发送相应的命令消息。从编程角度看,工具栏就是一个子窗口,它显示一系列位图按钮。由于工具栏按钮一般对应着某个菜单选项,因此工具栏的某个按钮和菜单的某个选项除了创建的方式和在界面的显示方式不一样外,对于消息的响应都是一样的。工具栏和状态栏对象一般作为框架窗口类的成员变量声明,在创建框架窗口时自动创建它们,在销毁框架窗口时自动销毁所创建的控件栏对象。使用AppWizard创建了应用程序的基本框架后,也就建立了初始的工具栏和状态栏对象。,21,例【3-2】一个使用工具栏的应用程序,22,1Create()函数 Create()函数用于创建一个Windows工具栏,并将其连接到CToolB
16、ar对象上,同时设置工具条的默认高度。该函数的原型如下:BOOL Create(CWnd*pParentWnd,DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UINT nID=AFX_IDW_TOOLBAR);2LoadToolBar()函数 该函数装载指定的工具栏资源,它的原型为:BOOLLoadToolBar(LPCTSTR lpszResourceName);BOOL LoadToolBar(UINT nIDResource);,23,语句CToolBar m_wndToolBar;代表在框架类中有一个从CToolBar派生的对象_wndToolB
17、ar;语句CStatusBar m_wndStatusBar代表在框架类中有一个从状态栏类CStatusBar实例化一个状态栏对象m_wndStatusBar。2在框架类CMainFrame类的实现文件中初始化工具栏对象 打开上一节所生成的应用程序。在WorkSpace窗口中选择ClasseView选项卡,用鼠标单击类视图中的CMainFrame类,将该类展开,双击框架类的OnCreate成员函数,程序将自动定位到该类对应的实现文件MainFrm.cpp中的OnCreate的实现处。下面为该类的消息响应函数OnCreate的主要内容(WM_CREATE的响应函数),所有代码都是自动生成的。点击
18、代码,24,3.2.6 工具栏的消息处理机制,若一个工具栏按钮的资源ID与菜单选项的资源ID一样时,单击工具栏按钮与选择该菜单发出的消息都一样。该命令消息可以像菜单消息一样进行消息的传递,因此在菜单一章中讲的命令消息的传递机制也同样适合于工具栏消息。工具栏要处理的两个主要消息是WM_COMMAND和UPDATE_COMMAND_UI。和菜单一样,应用程序是通过提供消息映射函数来处理单击工具栏按钮所产生的命令,如果工具栏的某个按钮没有消息COMMAND或UPDATE_COMMAND_UI对应的处理函数,那么框架自动使该按钮无效。下面我们在视图类中添加对工具栏按钮ID_QUIT_WINDOWS和I
19、D_CARTOON的消息响应函数,添加的方法和对菜单的单击一样,参见10.1.5节的叙述。点击代码,25,3.3 状态栏,本节内容 3.3.1 状态栏简介 3.3.2 一个使用状态栏的应用程序 3.3.3 状态栏类CStatuslBar 3.3.4 在应用程序框架中创建状态栏对象 3.3.5 创建字符串资源 状态栏的消息处理,26,3.3.1 状态栏简介,状态栏是显示在应用程序主窗口底部的的一个多区域子窗口,用于显示文本信息。状态栏中的子窗口可以分为状态信息行和状态指示器,如图3.10所示。状态信息行显示应用程序动态提供的字符串,例如单击菜单的命令提示信息,状态指示器显示一些状态信息,如键盘某些键的状态如Capslock键的状态。AppWizard创建应用程序时,一般自动添加状态栏,程序员在编程的过程中只需在原有的状态栏的基础上适当修改即可。,27,状态栏,图10.10 Word软件中的状态栏,28,例【3-3】一个使用状态栏的应用程序,29,习题,实验题 1编写一个具有菜单和对应工具栏按钮的应用程序。菜单项有“画红色直线”、“画蓝色正方形”和“画绿色实心圆”。完后上机调试。2在上个题目的基础上,添加对状态栏的支持,要求在状态栏上显示当前Insert键的状态,即是处于插入态还是处于改写态(利用GetKeyState这个API函数可以检测按键的状态)。,
链接地址:https://www.31ppt.com/p-5600022.html