1、Visual C+ for Windows Programming,Guo yan -fang,第五章,菜单,工具栏和状态栏,菜单在程序中的位置:,菜单,菜单的作用:,菜单是一个Windows程序中的命令的集合,程序功能的体现.菜单项可以发布命令消息。,菜单术语:,菜单主菜单子菜单菜单项分隔条浮动菜单菜单项的ID号,与菜单项相关的命令消息:,1. 更新命令消息:UPDATE_COMMAND_UI2. 命令消息:COMMAND,菜单项的命令消息的执行顺序:,执行每个菜单项命令会依次触发下两种消息:1. 先引发菜单项的更新命令消息:UPDATE_COMMAND_UI2. 在引发菜单项的命令消息:C
2、OMMAND所以菜单的初始化内容常放在更新命令消息的消息处理函数中,菜单的命令功能放在命令消息的消息处理函数中.,菜单项的命令消息的处理顺序是:,因为SDI结构项目中的四个类都是 CCmdTarget的子类,所以他们都能接收命令 消息,因此对于命令消息WM_COMMAND的处 理顺序是:(1) 视窗类;(2) 文档类;(3) 窗口类;(4) 应用类.,菜单项的种类及其它:,有主,子菜单 左边带v的菜单-带检查标志的菜单 右边带的菜单-有对话框的菜单 右边带的菜单-有子菜单的菜单 字母带下划线的菜单(F) -该菜单的快捷键 带功能键的菜单(如:Ctrl+M)-该菜单的加速键 分隔线 灰化的菜单
3、浮动式的菜单 子菜单可有功能提示(在状态条中),快捷键的生成方法:,在菜单编辑器中,打开菜单属性表,在Caption内,找到你欲定义为快捷键的字母,在此字母前加上字符“&”,此快捷键即生成.使用快捷键的方法: 先亮出的菜单,然后按“Alt+快捷键”.,加速键的生成方法:,在菜单编辑器中,打开菜单属性表,在Caption内的名串後,加上字符串“tCtrl+字母”,然后修改加速表资源Accelerator,设置加速键,此时加速键即生成.使用加速键的方法: 加速键与快捷键不同,不必亮开菜单,在任何时候都可使用加速键.,菜单项灰化的方法:,在更新命令消息的消息处理函数中:void C类名:OnUpda
4、te函数名(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-Enable(TRUE);/不灰化pCmdUI-Enable(FALSE);/灰化 ,菜单项设置的方法:,在更新命令消息的消息处理函数中:void C类名:OnUpdate函数名(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-SetCheck(1);/设置pCmdUI-SetCheck(0);/不设置 ,浮动菜单的实现方法:,1.
5、生成一新菜单IDR_MENU1; 2. 通过ClassWizard建立消息WM_CONTEXTMENU的映射 3.为WM_CONTEXTMENU消息的消息处理函数编程: void CEx7View:OnContextMenu(CWnd* pWnd, CPoint point) / TODO: Add your message handler code here/弹出IDR_MENU1菜单的第一个主菜单项的子菜单帘CMenu m;m.LoadMenu(IDR_MENU1);CMenu* p=m.GetSubMenu(0);p- TrackPopupMenu(TPM_LEFTALIGN|TPM_R
6、IGHTBUTTON,point.x,point.y,this); ,介绍TrackPopupMenu函数:,CMenu:TrackPopupMenu BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 其中: nFlags : TPM_CENTERALIGN:2 (相对于X坐标而言)TPM_LEFTALIGN :1 (相对于X坐标而言)TPM_RIGHTALIGN :3 (相对于X坐标而言)TPM_LEFTBUTTON : 浮动菜单在x,y点的左边弹出;TPM_RIGHTBU
7、TTON:浮动菜单在点x,y的右边弹出.x, y:鼠标的坐标;pWnd: 当前窗口;lpRect: NULL.,menuItem1 menuItem2 menuItem3,1,2,3,总结,关于菜单我们学习了: 1. 菜单项的种类 2. 与菜单相关的命令消息COMMANDUPDATE_COMMAND_UI3. 普通菜单的建立和使用4. 浮动菜单的生成和使用,工具栏,工具栏、状态栏、对话框栏都属于控制栏。它们都是从CControlBar派生出来的。,工具栏,工具栏是CToolBar类的一个对象,状态栏是CStatusBar类的一个对象。它们都是从CControlBar类派生出来的。 在典型的SD
8、I应用程序中,CToolBar对象占用CMainFrame客户区的顶部, CStatusBar对象占用CMainFrame客户区的底部,视图占用框架的其余部分(CMainFrame客户区的中间部分)。 多数情况下,工具栏按钮对应于一个菜单项,所以工具栏按钮会产生与菜单一样的命令消息。,工具栏的实现:,创建自己的工具栏 创建新的工具栏资源(将在OnCreate()中使用) 在主框架窗口类中增加CToolBar成员变量。 在OnCreate()中增加创建工具栏的相应代码,包括实现Docking(停靠)或Floating(浮动)技术。m_wndToolBar.CreateEx(this, TBSTY
9、LE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME),Docking工具栏的三个必须步骤: 使框架窗口支持Docking操作 CFrameWnd:EnableDocking () 使工具栏支持Docking操作 CControlBar:EnableDocking () 将工具栏Docking到框架窗口的指定边框上。 CFrameWnd:DockControl
10、Bar() 使工具栏永久浮动(Floating)的两个步骤: 在CControlBar:EnableDocking中使用参数0 相对应CFrameWnd:DockControlBar使用CFrameWnd:FloatControlBar,状态栏,工具栏、状态栏、对话框栏都属于控制栏。它们都是从CControlBar派生出来的。,1. 状态栏的pane:2. 状态栏数组:(在MaimFrm.cpp中定义) static UINT indicators = ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM
11、,ID_INDICATOR_SCRL, ;pane与数组元素一一对应.,与状态栏相关的名词与概念:,pane0,pane1,pane2,pane3,创建状态栏的三部曲:,1. 设定CStatusBar对象:CStatusBar sb;2. 调用Create()函数 或 CreateEx()函数;3. 调用SetIndicators()函数使数组元素和pane对应起来.,函数CWnd:SetWindowText()可修改pane0;函数CStatusBar:SetPaneText()可修 改任何pane;函数CCmdUI:SetText可修改pane;,修改状态栏的pane的方法:,函数CStatusBar:SetPaneInfo()可修 改任何pane宽度等信息; 函数CStatusBar:SetPaneStyle()可修 改任何pane的风格;,状态栏的 其他函数:,