第 5 章 菜单、 工具栏和状态栏

51

Click here to load reader

description

第 5 章 菜单、 工具栏和状态栏. 河北经贸大学信息技术学院. 教学目标. 了解菜单、工具栏和状态栏的概念及相关类的基本操作; 掌握 Windows 编程中资源的使用; 能够在单文档和对话框应用程序中编程实现常用的菜单、工具栏和状态栏。. 5.1 菜单. 菜单概述 用编辑器设计菜单 菜单类 CMenu 快捷菜单的设计与使用 示例. 菜单. 菜单是 Windows 中最常见的界面元素,是一系列命令的列表。 菜单分为两种: 下拉菜单 快捷菜单(上下文菜单) - PowerPoint PPT Presentation

Transcript of 第 5 章 菜单、 工具栏和状态栏

Page 1: 第 5 章 菜单、 工具栏和状态栏

第 5章 菜单、工具栏和状态栏河北经贸大学信息技术学院

Page 2: 第 5 章 菜单、 工具栏和状态栏

2

教学目标 了解菜单、工具栏和状态栏的概念及相关类的基本操作; 掌握 Windows 编程中资源的使用; 能够在单文档和对话框应用程序中编程实现常用的菜单、工具栏和状态栏。

Page 3: 第 5 章 菜单、 工具栏和状态栏

3

5.1 菜单 菜单概述 用编辑器设计菜单 菜单类 CMenu 快捷菜单的设计与使用 示例

Page 4: 第 5 章 菜单、 工具栏和状态栏

4

菜单菜单是 Windows 中最常见的界面元素,是一系列命令的列表。菜单分为两种:

下拉菜单 快捷菜单(上下文菜单)加速键是键盘上的一个键或几个键的组合,它通常对应于某一条菜单命令或工具按钮命令,它为用户提供了一种快速执行菜单命令或其他某种功能的方法。

Page 5: 第 5 章 菜单、 工具栏和状态栏

使用菜单编辑器,可以增加或删除菜单和菜单项,定义菜单标识符 ID ,对菜单进行合理布局,设置菜单的初始状态(正常、灰色、加标记等)设置菜单提示等。

使用 AppWizard 创建基于 SDI 的应用程序框架时,会自动创建一个菜单资源: IDR_MAINFRAME使用 AppWizard 创建基于 MDI 的应用程序框架时,会自动创建两个菜单资源: IDR_MAINFRAME 和 IDR_***TYPE( 星号表示项目名 )在菜单编辑器中,可以对 AppWizard 生成的菜单进行修改,也可以从空白菜单基础上创建需要的菜单

用编辑器设计菜单用编辑器设计菜单

Page 6: 第 5 章 菜单、 工具栏和状态栏

6

创建下拉菜单的步骤:创建下拉菜单的步骤: 创建菜单资源 打开菜单编辑器,编辑菜单:在菜单栏中双击空白方框,弹出 [ Menu Item Properties] 对话框,设置菜单项属性。 为菜单资源选择一个类 ( 视图类或对话框类 ) 建立菜单命令消息处理函数

WM_COMMAND: 选择菜单项或使用快捷键时将产生此消息 UPDATE_COMMAND_UI: 更新命令用户接口消息,当菜单在显示之前,会先通过此消息进行更新,从而得到更新后的菜单。

Page 7: 第 5 章 菜单、 工具栏和状态栏

7

【例【例 5.15.1 】单文档应用程序中菜单的创建和使用】单文档应用程序中菜单的创建和使用 在单文档应用程序的默认菜单资源中添加一个“绘图”菜单,通过“绘图”菜单命令在窗口中绘制出不同的椭圆和矩形,程序的运行效果如图 所示。

Page 8: 第 5 章 菜单、 工具栏和状态栏

8

步骤:步骤:1 、创建一个基于 SDI 的应用程序,项目名为 :EX5_12 、在项目工作区的 [Resource View] 中,双击菜单资源 [IDR_MAINFRAME] ,打开菜单资源编辑器。3 、在 [ 帮助 ] 菜单前插入一个新菜单 [ 绘图 (&D)] ,并为其添加相应的菜单项,如图所示

Alt+D激活该菜单

Page 9: 第 5 章 菜单、 工具栏和状态栏

9

菜单属性设置菜单属性设置Caption ID 提示 (Prompt) 椭圆 Pop-up 矩形 Pop-up清除 (&C) ID_DRAW_CLEAR 清除窗口中的图形100*100 ID_DRAW_ELLIPSE1 绘制一个外接矩形为 100*100的椭圆100*200 ID_DRAW_ELLIPSE2 绘制一个外接矩形为 100*200的椭圆100*100 ID_DRAW_RECT1 绘制一个 100*100的矩形100*200 ID_DRAW_RECT2 绘制一个 100*200的矩形

Page 10: 第 5 章 菜单、 工具栏和状态栏

10

4、为菜单资源选择一个类 CEX5_1View5 、使用 [MFC ClassWizard] ,为视图类 CEX5_1View 添加菜单消息处理函数 .Object Ids 消息 消息处理函数ID_DRAW_CLEAR COMMAND OnDrawClear()ID_DRAW_ELLIPSE1 COMMAND OnDrawEllipse1()ID_DRAW_ELLIPSE2 COMMAND OnDrawEllipse2()ID_DRAW_RECT1 COMMAND OnDrawRect1() ID_DRAW_RECT2 COMMAND OnDrawRect2()

Page 11: 第 5 章 菜单、 工具栏和状态栏

11

66 、为消息处理函数添加代码、为消息处理函数添加代码绘制一个外接矩形为 100*100的椭圆void CEX5_1View::OnDrawEllipse1() { // TODO: Add your command handler code hereCDC *pDC=GetDC(); // 获取窗口设备环境CRect r, rect; // 定义矩形类对象GetClientRect(&r); // 获取客户区窗口坐标范围rect.bottom=r.bottom/2+50; // 设置 rect 的范围rect.top=r.bottom/2-50;rect.right=r.right/2+50;rect.left=r.right/2-50;pDC->Ellipse(rect); // 在 rect指定的范围内画椭圆}

r.bottom50

50

Page 12: 第 5 章 菜单、 工具栏和状态栏

12

绘制一个 100*100的矩形void CEX5_1View::OnDrawRect1() { // TODO: Add your command handler code hereCDC *pDC=GetDC(); // 获取窗口设备CRect r, rect; // 定义矩形类对象GetClientRect(&r); // 获取客户区窗口坐标范围rect.bottom=r.bottom/2+50; // 设置 rect 的范围rect.top=r.bottom/2-50;rect.right=r.right/2+50;rect.left=r.right/2-50;pDC->Rectangle(rect); // 在 rect指定的范围内画矩形}

Page 13: 第 5 章 菜单、 工具栏和状态栏

13

清除菜单项的消息处理函数:void CEX5_1View::OnDrawClear() { // TODO: Add your command handler code hereInvalidate(); // 刷新窗口}该函数用来使当前视图失效,强制程序重新执行 OnDraw ()函数以刷新窗口

Page 14: 第 5 章 菜单、 工具栏和状态栏

14

使用键盘快捷键 打开项目工作区窗口中的 Accelerator 的资源项,双击 IDR_MAINFRAME ,出现如图 5.8的加速键资源列表 建立新的加速键,双击加速键列表的最下端的空行,弹出如图 5.9所示的“ Accel Properities” 对话框,其中可设置的属性见表 5-4。 选择添加的“椭圆 100*100” 菜单项的 ID 号 ID_DRAW_ELLIPSE1 ,选择“ Ctrl”, 输入键值“ E” 。

加速键也称为键盘快捷键,是一个按键或几个按键的组合,用于激活特定的命令。加速键也是一种资源,它的显示、编辑过程和菜单相似。为一个菜单项定义快捷键的步骤如下:

Page 15: 第 5 章 菜单、 工具栏和状态栏

15

技术要点:技术要点: CRect 类:是 MFC封装矩形区域操作的一个专用类,其结构与 Windows 中的 RECT结构类似。 类型 RECT 的定义: typedef struct _RECT{ LONG left; LONG top; LONG right; LONG bottom; } RECT; 成员函数(略)

右下角坐标左上角坐标

Page 16: 第 5 章 菜单、 工具栏和状态栏

16

绘制椭圆函数: CDC 类的成员函数 BOOL Ellipse (int x1, int y1, int x2, int y2); BOOL Ellipse ( LPCRECT lpRect ); 绘制矩形函数: CDC 类的成员函数 BOOL Rectangle(int x1, int y1, int x2, int y2); BOOL Rectangle( LPCRECT lpRect ); 参数: x1 , y1 :表示矩形左上角的坐标 x2 , y2 :表示矩形右下角的坐标, lpRect :是一个 RECT结构或 CRect 类对象

Page 17: 第 5 章 菜单、 工具栏和状态栏

17

5.1.3 CMenu5.1.3 CMenu 类类 如果想在程序中使用上下文菜单,或者在程序运行中对菜单项进行动态修改,就必须使用 MFC 的菜单类 CMenu

使用 CMenu 类可以完成大量复杂的菜单操作:创建、追踪、更新、销毁菜单

Page 18: 第 5 章 菜单、 工具栏和状态栏

表5-5 CMenu的成员方法 说明Attach() 把一个标准的Windows菜单句柄附加到CMenu对象上CreateMenu() 创建一个空菜单并把它附加到CMenu对象上CreatePopupMenu() 创建一个弹出式菜单并把它附加到CMenu对象上DeleteTempMap() 删除由FromHandle()构造函数创建的任何临时CMenu对象DestroyMenu() 去掉附加到CMenu对象上的菜单并释放该菜单占有的任何内存Deatch() 从CMenu对象上拆开Windows菜单句柄并返回该句柄FromHandle() 当给定Windows菜单句柄时,返回CMenu对象指针GetSafeHmenu() 返回由CMenu对象封装的菜单句柄成员(m_hMenu)LoadMenu() 从可执行文件装入菜单资源并把它附到Cmenu对象上LoadMenuIndirect() 从内存中的菜单模板中装入菜单并把它附到CMenu对象上

CMenuCMenu 类成员函数类成员函数m_hMenu: 指定附加给 CMenu 类对象的窗口菜单的句柄

函数原型在系统目录的函数原型在系统目录的 AFXWIN.HAFXWIN.H文件中文件中

Page 19: 第 5 章 菜单、 工具栏和状态栏

菜单操作方法中只有两个方法用来处理菜单的顶层操作DeleteMenu()TrackPopupMenu()删除某个特定的菜单项 (包括附属的级连菜单项 )

在一个 POINT结构所指定的位置显示一个快捷菜单菜单项操作函数方法 说明AppendMenu() 把一个新项加到给定的菜单的末端

CheckMenuItem() 在弹出式菜单中,把一个校验标记放到一个菜单项或从一个菜单项中取消一个校验标记CheckMenuRadioItem() 在此组中,把一个单选按钮放到菜单项旁边或从全部其它菜单项里取消一个已存在的单选按钮EnableMenuItem() 去掉(添加)一个菜单项GetMenuContextHelpId() 检索与菜单结合的帮助上下文 IDGetMenuItemCount() 在弹出式或顶层菜单中获得项数GetMenuItemID() 获取指定位置的菜单项的标识GetMenuState() 获得指定菜单项的状态或弹出式菜单中的菜单项数GetMenuString() 获得指定菜单项的标签GetSubMenu() 获得指向弹出式菜单的指针InsertMenu() 在指定位置插入新的菜单项,把其它项向下移ModifyMenu() 在指定位置改变已存在的菜单项RemoveMenu() 从指定菜单删除与弹出式菜单结合的菜单项SetMenuContextHelpID() 设置与菜单有关的帮助上下文 IDSetMenuItemBitmaps() 与菜单项有关的指定校验标记位图

Page 20: 第 5 章 菜单、 工具栏和状态栏

20

5.1.4 5.1.4 上下文菜单上下文菜单 创建一个具体的上下文菜单,通常有两种方法 :

先创建一个菜单资源,再在程序中将编辑好的资源加载进来 利用 CMenu 类的强大功能,在程序中动态地创建上下文菜单

Page 21: 第 5 章 菜单、 工具栏和状态栏

21

示例 为实例示例 为实例 5-15-1 添加上下文菜单添加上下文菜单

Page 22: 第 5 章 菜单、 工具栏和状态栏

22

示例 为实例示例 为实例 5-15-1 添加上下文菜单添加上下文菜单 打开项目 EX5_1 为应用程序添加一个新菜单

在项目工作区的 [Resource View] 中,在 [Menu]上右击鼠标,从弹出菜单中选择 [Insert Menu] 命令添加一个新菜单 ,设置标识 ID 为 IDR_CONTEXTMENU 在菜单资源编辑器中制作上下文菜单 ,使用与绘图菜单相同的 ID 标识 ,以便调用相同的消息处理函数

Page 23: 第 5 章 菜单、 工具栏和状态栏

23

为视图类添加成员变量和消息处理函数为视图类添加成员变量和消息处理函数Object Ids 消息 消息处理函数ID_DRAW_CLEAR COMMAND OnDrawClear()      ID_DRAW_ELLIPSE1 COMMAND OnDrawEllipse1()ID_DRAW_ELLIPSE2 COMMAND OnDrawEllipse2()ID_DRAW_RECT1 COMMAND OnDrawRect1() ID_DRAW_RECT2 COMMAND OnDrawRect2() CEX7_1View WM_RBUTTONDOWN OnRButtonDownCEX7_1View WM_CONTEXMENU OnContextMenu()

变量 类型 说明m_bFlag bool 标记是否使用了上下文菜单m_ConPoint CPoint 记录鼠标右击时相对于窗口的位置

为菜单资源连接一个类 C Ex 5_1 View , 然后为视图类添加成员变量同“绘图”菜单

Page 24: 第 5 章 菜单、 工具栏和状态栏

24

当用户在视图中右击鼠标时 ,系统将产生两条消息 : WM_RBUTTONDOWN WM_CONTEXMENU ( 上下文菜单消息 ): 对此消息进行处理而得到上下文菜单 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

右键单击窗口的句柄 右键单击鼠标时的位置 ,相对于屏幕左上角的位置

右键单击鼠标时的位置 ,相对于当前窗口左上角的位置

Page 25: 第 5 章 菜单、 工具栏和状态栏

25

添加程序代码添加程序代码在视图类构造函数中对成员变量设置初始值CEX7_1View::CEX5_1View(){// TODO: add construction code here

m_bFlag=false; // 上下文菜单未在使用中} 由于主菜单命令和上下文菜单命令具有相同的 ID标识,所以成员变量 m_bFlag 来标识当前命令是来自主菜单还是上下文菜单。 m_bFlag=true ; 表示使用上下文菜单 m_bFlag=false; 表示未使用上下文菜单

Page 26: 第 5 章 菜单、 工具栏和状态栏

26

鼠标右键按下消息:void CEX5_1View::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_ConPoint=point; // 获取鼠标单击时相对于窗口位置的坐标CView::OnRButtonDown(nFlags, point);

}

Page 27: 第 5 章 菜单、 工具栏和状态栏

27

绘制 100*100的内接椭圆:void CEX5_1View::OnDrawEllipse1() { // TODO: Add your command handler code hereCDC *pDC=GetDC(); // 获取窗口设备CRect r, rect; // 定义矩形类对象if (m_bFlag) {rect.bottom=m_ConPoint.y+50; // 设置 rect 的范围rect.top=m_ConPoint.y-50;rect.right=m_ConPoint.x+50;rect.left=m_ConPoint.x-50; m_bFlag=false;}else {GetClientRect(&r); // 获取客户区窗口坐标范围rect.bottom=r.bottom/2+50; // 设置 rect 的范围rect.top=r.bottom/2-50;rect.right=r.right/2+50;rect.left=r.right/2-50;}pDC->Ellipse(rect); // 在 rect指定的范围内画椭圆}

Page 28: 第 5 章 菜单、 工具栏和状态栏

28

WM_CONTEXTMENUWM_CONTEXTMENU 消息处理函数消息处理函数void CEX5_1View::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code hereCMenu Drawmenu; // 创建菜单实例Drawmenu.LoadMenu(IDR_CONTEXTMENU); // 加载菜单资源m_bFlag=true; // 设置标记 ,使用上下文菜单 // 将 Drawmenu 菜单对象中的第一个子菜单载入为弹出菜单 CMenu *pContextmenu=Drawmenu.GetSubMenu(0); // 显示上下文菜单pContextmenu->TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);Drawmenu.DestroyMenu(); // 销毁菜单} 成员函数参考教材 ,不再赘述 .

Page 29: 第 5 章 菜单、 工具栏和状态栏

29

在程序中动态创建上下文菜单在程序中动态创建上下文菜单void CEX5_1View::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code hereCMenu Drawmenu; // 创建菜单实例m_bFlag=true; // 设置标记 ,使用上下文菜单Drawmenu.CreatePopupMenu(); // 创建空弹出菜单// 添加菜单项Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_ELLIPSE1,"椭圆 100*100"); Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_ELLIPSE2,"椭圆 100*200");Drawmenu.AppendMenu(MF_SEPARATOR);Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_RECT1,"矩形 100*100");Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_RECT2,"矩形 100*200");Drawmenu.AppendMenu(MF_SEPARATOR);Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_CLEAR,"清 除 ");// 显示弹出菜单Drawmenu.TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);Drawmenu.DestroyMenu(); // 销毁菜单}

Page 30: 第 5 章 菜单、 工具栏和状态栏

30

运行效果图运行效果图 ::

Page 31: 第 5 章 菜单、 工具栏和状态栏

31

示例 用菜单命令调用模式对话框 创建一个带有“计算”菜单的单文档应用程序 EX5-2 。“计算”菜单中包含“平均成绩”菜单项。当单击该菜单项时,会弹出一个模式对话框,用于计算平均成绩。运行结果如图 5.11 。

Page 32: 第 5 章 菜单、 工具栏和状态栏

32

【例 5.3 】 为对话框添加菜单 ( 1 )添加并定制菜单资源( 2 )菜单与对话框关联:在对话框属性页的 Menu 下拉列表框中选择菜单 ID( 3 )为菜单选择对话框类,之后消息映射,编写消息处理函数代码。

Page 33: 第 5 章 菜单、 工具栏和状态栏

33

5.2 5.2 工具栏工具栏 CToolBarCToolBar 5.2.1 CToolBar 类 5.2.2 工具栏编辑器 5.2.3 工具栏与菜单结合

Page 34: 第 5 章 菜单、 工具栏和状态栏

34

5.2 5.2 工具栏工具栏 CToolBarCToolBar

Visual C++创建工具栏的一般步骤如下: 创建一个工具栏资源; 构造 CToolBar 对象; 调用 Create()( 或 CreateEx()) 函数创建 Windows工具栏并将它与该 CToolBar 对象连接; 调用 LoadToolBar() 函数装入工具栏资源。

工具栏可以看作是图形化的菜单,是一种更快捷、更有效、更直观的命令输入方式。当创建 SDI/MDI 应用程序时, AppWizard不仅创建了缺省菜单,并且创建了缺省的工具栏 IDR_MAINFRAME, 其相应的位图 Toolbar.bmp 。用户可以为缺省工具栏中添加一些按钮,也可以设计和使用自己的工具栏。

Page 35: 第 5 章 菜单、 工具栏和状态栏

CTool Bar的构造方法方法 说明

Create() 创建一个工具条并把它附加到 CTool Bar对象上CreateEx() 创建一个定义了边界的工具条并把它附加到 CTool Bar 对象上SetSi zes() 设置按钮及位图大小SetHei ght() 设置工具条的高度LoadTool Bar() 装载工具条资源LoadBi tmap() 装载包含工具按钮图像的位图SetBi tmap() 设置位图图像SetButtons() 设置按钮并使每个按钮与位图图像相关。

CToolBar 类有几个兄弟类CStatusBar (状态条)COleResizeBar ( OLE控制条)CDialogBar (对话条)

都是用来接收某些命令输入并向用户显示状态消息的类

7.2.1 CToolBar 类

Page 36: 第 5 章 菜单、 工具栏和状态栏

工具条函数简介( 1 ) Create() 函数BOOL Create ( CWnd* pParentWnd, //pParentWnd 为指向工具条所在父窗口的指针 DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP, // dwStyle 为工具条的风格 ( 见下页 ) UINT nID = AFX_IDW_TOOLBAR //nID 表示工具条子窗口的 ID 号) ;

下述代码生成一工具条,工具条风格为“初始可见”,且放置在窗口“顶部”,工具条窗口的 ID 号的 16进制值为 9100:CToolBar m_ToolBar=new CToolBar( );m_ToolBar.Create(this, WS_VISIBLE |CBRS_TOP,0x9100);

Page 37: 第 5 章 菜单、 工具栏和状态栏

( 2 ) LoadToolBar() 函数BOOL LoadToolBar(LPCTSTR lpszResourceName); // 字符串形式定义的资源BOOL LoadToolBar(UINT nIDResource); // 整型形式定义的资源( 3 ) SetBarStyle() 函数

m_wndToolBar.SetBarStyle(CBRS_TOOLTIPS|CBRS_FLYBY| CBRS_SIZE_DYNAMIC);

WS_VISIBLE 使工具条窗口初始可见CBRS_BOTTOM 初始时将工具条放到窗口底部CBRS_FLYBY 在状态栏显示命令描述CBRS_NOALIGN 防止控制条在其父窗口改变大小时被复位CBRS_TOOLTIPS 鼠标光标在按钮上暂停时,显示工具提示CBRS_TOP 初始时将工具条放在窗口顶部CBRS_SIZE_DYNAMIC 工具条的尺寸是可变的

Page 38: 第 5 章 菜单、 工具栏和状态栏

( 4 )工具条的移动默认状况下,CToolBar 工具条只能被应用程序所移动

为使用户能够移动工具条,为此,需向工具条及框架窗口发送消息。这可通过调用 CToolBar::EnableDocking和 CFrame::EnableDocking实现。二函数原型均如下:void EnableDocking( DWORD dwStyle );

工具条停靠风格风格 意义

CBRS_ALI GN_TOP 工具条可在客户区顶端移动CBRS_ALI GN_BOTTOM 工具条可在客户区底端移动CBRS_ALI GN_LEFT 工具条可在客户区左端移动CBRS_ALI GN_RI GHT 工具条可在客户区右端移动CBRS_ALI GN_ANY 工具条可在客户区任意位置移动CBRS_FLOAT_MULTI 允许在一窗口内存在多个可移动控制条

对于 CFrame 不可用

实现工具条移动的常用代码: m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);用户也可以对工具条进行移动或定位。或者在程序控制下,通过调用 CFrameWnd::DockControlBar来移动以及调用CFrameWnd::FloatControlBar来定位一工具条。停靠风格

Page 39: 第 5 章 菜单、 工具栏和状态栏

( 5 )工具条的显隐控制 由于工具条是一个窗口,它的显示或隐藏可以通过其父类 CWnd 的成员函数来实现

显示或隐藏一个工具条void CWnd:: ShowControlBar( CControlBar*pBar , BOOL bShow , BOOL bDelay);在改变工具条状态前要通过函数 CWnd::GetStyle获取当时工具条的状态DWORD GetStyle( ) const;

为 TRUE ,显示;为 FALSE ,隐藏

为 TRUE ,延迟显示工具条;为 FALSE ,立即显示

Page 40: 第 5 章 菜单、 工具栏和状态栏

5.2.2 工具栏编辑器(1) 加入工具条按钮 可以利用 VC 所提供的绘图工具,直接进行按钮的编缉,这主要用来编缉自己的按钮,对于已经存在的图标,如果要把它作为下一个按钮,可以先加入一个 ICON 资源,再通过拷贝和粘贴来放到 Toolbar 上。(2) 删除工具条按钮

删除按钮要把该按钮拖出工具条以外。

(4) 插入空格前插空格 /后插空格 /删除空格

(3)移动工具条按钮是用鼠标将要移动的按钮拖动到工具条上需要的位置。

(5) 工具栏按纽属性设置

Page 41: 第 5 章 菜单、 工具栏和状态栏

41

5.2.3 工具栏与菜单结合 使它们结合的方法是在工具栏按钮的属性对话框中将按钮的 ID 号设置为相关联的菜单项 ID 。

Page 42: 第 5 章 菜单、 工具栏和状态栏

42

5.3 状态栏 5.3.1 CStatusBar 类 5.3.2 CStatusBar 类的使用方法 5.3.3 状态栏的常用操作 5.3.4 示例

Page 43: 第 5 章 菜单、 工具栏和状态栏

43

5.3 状态栏 CStatusBar P222 状态栏可以随时为用户提供当前程序的状态信息,它即不接受输入也不产生命令消息。 状态栏结构:

提示信息窗格 指示器信息窗格

应用程序框架自动生成标准状态栏,状态栏的格式由MainFrm.cpp 文件中的静态数组 indicators 所定义, CStatusBar 类成员函数 SetIndicators 将调用该数组生成状态栏。 static UINT indicators[] ={ ID_SEPARATOR, // 信息窗格 ID_INDICATOR_CAPS, //Caps Lock指示器ID_INDICATOR_NUM, //Num Lock指示器ID_INDICATOR_SCRL, // Scoll Lock指示器};

Page 44: 第 5 章 菜单、 工具栏和状态栏

44

状态栏的常用操作 增加或减少窗格 如果要对状态栏进行改变,可以对此数组元素进行修改、增加或删除。 在状态栏上显示信息 ( 1 ) CStatusBar 类 SetPaneText ( nIndex,lpszNewText ) ( 2 ) CWnd::SetWindowText ()设置第 1 个窗格的文本 (3) 手动添加状态栏窗格的 ON_UPDATE_COMMAND_UI事件的消息映射,添加 afx_msg void 类型的带参消息处理函数 OnUpdate***( CCmdUI* pCmdUI ) 改变状态栏的风格 SetPaneStyle(int nIndex, UINT nStyle); SetPaneInfo(int nIndex,UINT Id, UINT nStyle,int cxWidth); P224表 7-11风格类型示例一 P224-225 使用 SetPaneText ()函数示例二 使用 ON_UPDATE_COMMAND_UI事件的消息

Page 45: 第 5 章 菜单、 工具栏和状态栏

45

实例:为实例 5_1 添加状态栏信息 程序运行中会在状态栏显示系统时间 ,[Insert]键是否被按下等状态,效果如下 :

Page 46: 第 5 章 菜单、 工具栏和状态栏

46

步骤:1 、打开 EX5_1 项目2 、在资源编辑器的串表中添加以下字符串资源 ID Value Caption ID_INDICATOR_X X坐标值 ID_INDICATOR_Y Y 坐标值 ID_INDICATOR_TIME 00:00:00 3 、打开 MainFrm.cpp 文件,修改数组 indicators 如下: static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_X, ID_INDICATOR_Y, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_TIME , };

Page 47: 第 5 章 菜单、 工具栏和状态栏

47

4. 在 CEx5_1View 类中加入 WM_MOUSEMOVE 消息处理函数 , 并添加代码。 void C Ex5_1View::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd ; CStatusBar* pStatus=&pFrame->m_wndStatusBar ; CString str; if (pStatus) { str.Format("X=%d",point.x); pStatus->SetPaneText(1,str); str.Format("Y=%d",point.y); pStatus->SetPaneText(2,str); } CView::OnMouseMove(nFlags, point); }

Page 48: 第 5 章 菜单、 工具栏和状态栏

48

5. 将类 CMainFrame 中的保护型状态栏对象m_wndStatusBar 修改为公共变量。 6. 在 Ex_SDIMenuView.cpp 文件的开始处增加下列语句: #include “MainFrm.h” 7.在 CMainFrame 类的 OnCreate 函数中,设置定时器,代码如下 : int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { …… SetTimer(1,1000,NULL); // 设置定时器 return 0; }

Page 49: 第 5 章 菜单、 工具栏和状态栏

49

8. 为 CMainFrame 类映射WM_TIMER 消息的处理函数,并添加代码如下: void CMainFrame::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CTime tmCurr; CString strTime; tmCurr=CTime::GetCurrentTime(); // 获取系统当前时间 strTime=tmCurr.Format("%H:%M:%S"); // 设置状态栏 ID_INDICATOR_TIME 窗格文本内容 m_wndStatusBar.SetPaneText( m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIME), strTime); CFrameWnd::OnTimer(nIDEvent); } 9. 编译并运行。

Page 50: 第 5 章 菜单、 工具栏和状态栏

50

习题五 1. 填空题 2. 选择题 3. 简答题 4. 操作题

Page 51: 第 5 章 菜单、 工具栏和状态栏

51

实验指导五 基本实验 拓展与提高