第9章菜单、工具栏和状态栏_第1页
第9章菜单、工具栏和状态栏_第2页
第9章菜单、工具栏和状态栏_第3页
第9章菜单、工具栏和状态栏_第4页
第9章菜单、工具栏和状态栏_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章 菜单、工具栏和状 态栏设计 菜单、工具栏和状态栏是Windows应用程序中常见的界面元素。Visual C+ 6.0支持各种界面元素的创建,这样使得应用程序的界面更加美观、 实用。学习本章,读者可以掌握利用Visual C+ 6.0创建菜单、工具栏和 状态栏的基本过程,掌握其使用方法。 9.1 概 述 在Windows应用程序中,菜单栏、工具栏和状态栏是经常使用的界面元 素。在Windows应用程序中使用菜单栏、工具栏和状态栏可以使得应用 程序的界面更加美观,同时用户可以方便地通过菜单栏、工具栏和状态 栏与应用程序进行交互。 菜单栏是大部分Windows应用程序的组成部分,它提供了应用

2、程序和用 户进行交互的工具,同时它明确指出用户可以进行的操作,并且对操作 进行分类。在前面文档/视图应用程序中,创建单文档或者多文档应用 程序时向导会自动生成一个菜单栏。它提供了一般应用程序所拥有的菜 单命令。 工具栏和状态栏是一个完善的Windows应用程序的重要组成部分。工具栏 一般位于主框架窗口的上部,上面有一些图形按钮。当用户用鼠标在某一 按钮上单击时,程序就会执行相应的命令;当鼠标在按钮上停留片刻后, 就会弹出一个小窗口并显示工具提示。按钮的图形是它所代表功能的形象 表示,人们对于形象图形的辨别速度要快于抽象文字,因此工具条提供了 一种比菜单更快捷的用户接口。在一个标准的Window

3、s应用程序中,工具 条的大部分按钮执行的命令与菜单命令相同,这样做的目的是能同时提供 形象和抽象的用户接口,以方便用户的使用。 状态栏位于主框架窗口的底部,主要用来显示一些提示信息,可细分为几 个窗格。状态栏的主要功能是简要解释被选中的菜单、命令或工具条、按 钮、命令,有时状态栏还会显示键盘上某些特定键的状态。例如:显示 Caps Lock键、Num Lock键的状态。 在一般应用程序中菜单栏、工具栏和状态栏的位置是固定的,如图9.1 所示。 菜单栏、工具栏和状态栏是一个Windows应用程序中最为常用的界面元 素。它不仅使应用程序的界面更加美观,同时可以提供方便的操作。 9.2 菜 单 在利

4、用Visual C+的应用程序向导生成单文档或者多文档应用程序时, 向导会自动生成一个Windows应用程序常见的菜单栏,它提供了 Windows应用程序常见的命令。在实际的应用中有时需要对菜单进行重 新设计,利用Visual C+的资源编辑工具可以方便地设计菜单资源。本 节介绍菜单资源的创建与使用。 图9.1 菜单栏、工具栏和 状态栏 9.2.1 创建菜单 在Visual C+ 6.0的资源编辑工具中可以方便地创建菜单资源。在 Windows应用程序中,菜单通常有3类,系统菜单、程序主菜单和快捷 菜单。 系统菜单提供了系统对应用程序主窗口的管理功能,单击程序窗口左上 角的标题前的图标时就会弹

5、出系统菜单,如图9.2所示。由于程序中一 般不需要对系统菜单进行修改,因此在此不再介绍。 图9.2 系统菜单 说明:系统菜单是由应 用程序自动生成的,用户 不需要做任何改变,也不 需要对其菜单命令进行消 息映射。 程序菜单通常位于应用程序的最顶端,它包含了应用程序的大部分功能。 在MFC的文档/视图应用程序中,向导会自动创建应用程序主菜单,但 是它只是生成了默认的菜单项,在实际中需要根据实际需要进行修改或 者添加菜单项。下面结合实例介绍在Visual C+ 6.0中创建菜单资源的方 法。 【示例9.1】 在单文档应用程序中添加新的菜单项。操作步骤如下所述。 (1)创建一个基于单文档的应用程序。

6、 (2)单击项目工作区的“Resource View”面板,展开面板里面的内容。 单击Menu前面的加号图标,双击其选项,在代码编辑区弹出向导创建 的菜单资源。 (3)右击菜单资源右边的空白项,在弹出的快捷菜单中选择Properties 命令,弹出Menu Item Properties对话框,如图9.3所示。在该对话框中可 以对菜单资源的样式等进行设计,下面介绍其属性的具体含义。 图9.3 Menu Item Properties对话框 Separator:表示该菜单项是一个分割线。 Pop Up:表示该菜单项是弹出式菜单,如果是主菜单,那么其有下拉菜单。如果是 下拉菜单,那么有向左弹出的菜

7、单。这种菜单一般不具有具体的操作,它只是负责 对菜单进行分类。 Inactive:表示该菜单项是否被激活,选中该选项表示菜单不可用。 Checked:表示菜单是否被选中,选中时会在左侧出现一个“”。 Grayed:表示菜单是否被禁止使用,禁止使用时字体颜色为灰色。 Prompt:表示鼠标滑动到菜单项,是否显示提示内容,提示内容在文本框中输入。 (4)设置菜单“下拉菜单选项1”的“Pop Up”按钮,此时它是一个子 菜单,即本身不提供操作,拥有向右弹出的菜单。设计两个菜单“具体 操作菜单”和“具体操作2”。并且为“具体操作2”设计一个提示字符 串:“这是具体操作2”。 (5)在“主菜单”下设计另

8、一个菜单命令“下拉菜单2”,取消其 “Pop Up”按钮,即本身提供一个菜单命令。 (6)编译、连接,运行结果如图9.4所示。 图9.4 菜单设计 上面的例子虽然设计了菜单,但是可以看到运行时具体的菜单命令是灰 色的。这是因为应用程序没有对菜单命令进行任何响应,即此时菜单是 没有用处的。在9.2.2节将会利用类向导添加菜单的响应命令,即使得菜 单可用。 说明:设计菜单时,如果需要添加菜单项,只要在已设计的菜单项下 一个空白菜单中右击就可以进行设计。 9.2.2 响应菜单项命令 前面介绍了在Visual C+ 6.0的资源编辑器中设计菜单资源的一般方法。 但是程序运行时,菜单选项都是灰色的,这是

9、因为对菜单命令没有进行 映射,即菜单只是一个摆设,还没有具体功能。 下面介绍菜单的命令处理,在类向导中,MFC封装了对菜单项的两类消 息映射,一是COMMAND消息,另一个是UPDATE_COMMAND_UI消 息,下面分别进行介绍。 1COMMAND消息的响 应 COMMAND消息是在用户单击菜单项时产生的消息。因此如果需要对 用户单击菜单命令时进行响应,只需要添加COMMAND的消息响应函 数就可以了。在前面程序的基础上对前面的“下拉菜单2”进行单击响 应,只需要进行如下步骤。 (1)选择View|ClassWizard命令,弹出MFC ClassWizard对话框。选择 Message

10、Maps标签,在Object Ids列表框中选择ID_MENU2,即是下拉菜 单2 的ID。 (2)选择Message列表框的COMMAND选项,单击Add Function按钮, 即添加了COMMAND的消息映射。如图9.5所示。 图9.5 添加消息映射 (3)编写消息映射函数的函数体,代码如下: 01void CMainFrame:OnMenu2() 02 03/ TODO: Add your command handler code here 04AfxMessageBox(单击了下拉菜单2命令);/弹出消息框 05 其功能是弹出一个消息框,提示用户单击了菜单。 (4)编译、链接,运行程

11、序,选择“主菜单”|“下拉菜单2”命令,结果如图9.6所示。 可见上面代码响应的单击菜单命令的消息,弹出了一个对话框。 2 UPDATE_COMMAND_U I消息的响应 UPDATE_COMMAND_UI消息是在窗口绘制菜单项时产生的消息。有 时需要对菜单项的状态或者属性进行设置,那么就可以利用 UPDATE_COMMAND_UI消息进行处理。 图9.6 运行结果 例如可以设置菜单是否可用,菜单前面是 否加上“”号,表示选中,表示选中的状 态经常和单击菜单结合起来。因此如果需 要对用户选择菜单命令时对菜单状态进行 处理,只需要添加 UPDATE_COMMAND_UI的消息响应函数 就可以了。

12、 仍然在前面程序的基础上添加“主菜单”|“下拉菜单2”的 UPDATE_COMMAND_UI消息。即需要对前面的“下拉菜单2”进行单 击时的状态设置,即添加“”,只需要进行如下步骤。 (1)选择View|ClassWizard命令,弹出MFC ClassWizard对话框。选择 Message Maps标签,在Object Ids列表框中选择ID_MENU2,即是下拉菜 单2 的ID。 (2)选择Message列表框的UPDATE_COMMAND_UI选项,单击Add Function按钮,即添加了UPDATE_COMMAND_UI的消息映射。 (3)在消息响应这种编写函数体,代码如下: 01

13、void CMainFrame:OnUpdateMenu2(CCmdUI* pCmdUI) 02 03/ TODO: Add your command update UI handler code here 04pCmdUI-SetCheck(flag);/设置状态 05 需要注意的是flag变量是在类中添加的一个BOOL成员,并且初始化为false。因为此时需 要在单击时添加“”,再次单击去掉“”,所以在上面单击的消息响应函数中添加下 面一条语句: flag=!flag; 通过上面的处理,当选择菜单命令时,会在前面出现“”,再次单击, “”去掉。 类CCmdUI常用的函数有下面几个。 Set

14、Check():设置菜单前面的“”。 Enable():设置菜单是否可用。 SetRadio():设置菜单前面的“”,和SetCheck()相似。 SetText():设置菜单的字符串。 在UPDATE_COMMAND_UI消息中可以方便地利用上面的函数对菜单 进行处理,设置菜单的状态等。 (4)编译、连接,运行结果如图9.7所示。首先选择“主菜单”|“下拉 菜单2”命令,此时弹出一个消息框。单击“确定”按钮后,再次单击 主菜单可以看到,其下面的子菜单上的“下拉菜单2”命令前面添加了 一个“”。 图9.7 运行结果 说明:一般情况下SetCheck()和SetRadio()函数是用来表明菜单的

15、一种 状态,使得用户可以方面地查看当前的状态。 9.2.3 菜单类概览 在MFC中,类CMenu对菜单进行了封装,CMenu类是由CObject类直接 派生出来的类。它封装了菜单的基本操作,其中常见的成员如表9.1所 示。 表9.1 CMenu的成员 上面的函数是对菜单的处理函数。在实际应用中,有时需要添加快捷菜 单或者其他情况,这时需要利用上面的函数对菜单进行处理,具体实例 参见9.2.4节。 函函 数数说说 明明 BOOL Attach( HMENU hMenu );得到得到Windows标准菜单句柄标准菜单句柄 HMENU GetSafeHmenu() const;获得菜单的句柄获得菜单

16、的句柄 BOOL CreateMenu();创建一个菜单创建一个菜单 BOOL CreatePopupMenu();创建一个弹出式菜单创建一个弹出式菜单 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); 加载菜单资源加载菜单资源 BOOL DestroyMenu();释放菜单释放菜单 BOOL AppendMenu ( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );添加新项添加新项 UINT EnableMen

17、uItem ( UINT nIDEnableItem, UINT nEnable );激活或禁止菜单项激活或禁止菜单项 UINT GetMenuItemCount() const;获取菜单项数获取菜单项数 UINT GetMenuItemID( int nPos ) const;获取指定位置的菜单的获取指定位置的菜单的ID UINT GetMenuState( UINT nID, UINT nFlags ) const;获取菜单状态获取菜单状态 int GetMenuString( UINT nIDItem, CString获取菜单的字符串获取菜单的字符串 BOOL InsertMenu( U

18、INT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); 插入菜单插入菜单 BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); 修改菜单修改菜单 BOOL RemoveMenu( UIN

19、T nPosition, UINT nFlags );删除菜单删除菜单 9.2.4 弹出式菜单 弹出式菜单是在应用程序中经常用到的一类菜单,又称为快捷菜单。例 如在Word文档的工作区里右击,会弹出一个快捷菜单。在应用程序中 经常需要设计一个右击的快捷菜单。下面结合实例进行介绍。 【示例9.2】 在SDI应用程序中设计一个右击的快捷菜单。具体的操作步骤如下所述。 (1)创建一个基于单文档的应用程序。 (2)在项目工作区中,单击Resource View面板,然后右击Menu小图标, 选择Insert Menu命令,在工作区弹出新建的菜单资源。设计菜单资源如 图9.8所示。 图9.8 设计菜单

20、(3)在类CTestView中添加数据成员如下: CMenu menu; /定义对象 CMenu *menupop; /定义对象指针 menu是快捷菜单,menupop是子菜单,本例子中menu 是颜色,子菜单是下面的几个菜单项。 在构造函数中添加初始化和释放菜单的语句如下: 01CTestView:CTestView() 02 03/ TODO: add construction code here 04menu.LoadMenu(IDR_MENU1);/加载菜单资源 05 06 07CTestView:CTestView() 08 09menu.DestroyMenu();/销毁菜 单 1

21、0 (4)向导中添加右击时的消息响应函数。编写函数体,代码如下: 01void CTestView:OnRButtonDown(UINT nFlags, CPoint point) 02 03/ TODO: Add your message handler code here and/or call default 04menupop=menu.GetSubMenu(0); /得到子菜单 05ClientToScreen( /客户坐标转换为屏幕坐标 06menupop-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); 07 /弹出菜单 08

22、CView:OnRButtonDown(nFlags, point); 09 分析:上面的代码首先获得了子菜单,然后进行显示。需要注意的是, 中间需要由客户坐标转换为屏幕坐标,这是因为所使用的两个坐标系是 不相同的,关于此处将在第10章进行介绍。 在快捷菜单中,子菜单项的获取需要利用主菜单的GetSubMenu()函数, 这样在实际应用中就可以根据需要动态地加载某个子菜单。 (5)编译、连接,运行结果如图9.9所示。 图9.9 右击弹出快捷菜单 快捷菜单的消息响应函数与程序主菜单的消息响应 的处理完全一样,只需要利用类向导对相应的菜单 添加相应的消息映射,然后编写处理代码就可以了, 在此不再介

23、绍。 9.2.5 使用对话框中的菜 单 菜单资源不仅仅可以在文档应用程序中使用,在对话框应用程序中同样 可以使用菜单资源。下面结合实例,介绍对话框应用程序中菜单资源的 使用。 【示例9.3】 在对话框应用程序中使用菜单资源实例。 (1)在资源编辑环境中创建一个菜单资源。在此不再介绍具体步骤, 读者可参阅前面的叙述。 (2)在对话框资源上右击,在弹出的快捷菜单中选择Properties命令, 弹出Dialog Properties对话框,如图9.10所示。在Menu下拉列表框中选择 IDR_MENU1选项。 图9.10 Dialog Properties 对话框 说明:在Menu下拉列表框中会列

24、出本工程中所有的菜单资源,如果 没有菜单资源,那么下拉列表框中是空白的。 (3)利用上面的步骤,可以将菜单与对话框绑定在一起。此时的菜单 显示在对话框的标题栏的下面。利用类向导为单击菜单命令添加消息映 射。下面仅仅实验菜单命令的消息映射。实际应用中可以设计具体的功 能代码。 01void CTestDlg:OnMenu11() 02 03/ TODO: Add your command handler code here 04AfxMessageBox(单击主菜单1下的下拉菜单11命令); 05flag=!flag; 06 上面的代码是响应COMMAND消息的消息映射函数。选择菜单命令时 弹出

25、一个消息对话框。实际应用中可以设计相关的操作。 在菜单中还有一个比较重要的消息UPDATE_COMMAND_UI消息。该 消息是在窗口绘制菜单项时产生的消息。有时需要对菜单项的状态或者 属性进行设置,那么就可以利用UPDATE_COMMAND_UI消息进行处 理。但是此时在对话框中并不能响应这个消息。 对于基于文档的应用程序,在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWnd:OnInitMenuPopup()函数遍历菜单项并为每个菜单项调用更 新命令处理函数。菜单的外观被更新以反映它的状态。而更新用户界面 机制在基于对话框的应用程序中

26、不能工作,因为CDialog没有 OnInitMenuPopup()处理函数,而使用CWnd的默认处理函数,该函数没 有为菜单项调用更新命令处理函数。为了解决整个问题可以在对话框应 用程序中添加WM_INITMENUPOPUP的消息映射。具体步骤如下所述。 (4)选择View|CLassWizard命令,弹出MFC CLassWizard对话框。选择 Class Info标签,在Message filter下拉列表框中选择Window,如图9.11所 示。这样就可以拦截所有的Windows消息。单击Message Maps标签,添 加WM_INITMENUPOPUP的消息映射。 图9.11 M

27、FC CLassWizard 对话框 (5)编写WM_INITMENUPOPUP消息的消息映射函数,实现对菜单的 更新。在实际应用中并不需要读者自己编写此函数,因为在文档中对菜 单的更新进行了函数实现。因此可以直接复制文档模型中 CFrameWnd:OnInitMenuPopup()函数的代码,将其粘贴到void CTestDlg:OnInitMenuPopup()函数中,函数代码如下: 分析:上面的代码实现了菜单资源的更新操作,并且在MFC中对这类操 作提供了很强的保护功能。读者在使用时可以直接复制代码,而不要自 己编写代码。利用上面的代码就实现了菜单的更新操作,此时菜单就可 以响应WM_I

28、NITMENUPOPUP消息。 说明:如果读者十分清楚添加消息映射的概念,可以手动添加消息映 射,而不需要利用类向导去添加。 (6)利用类向导添加“主菜单1”|“下拉菜单11”的 UPDATE_COMMAND_UI的消息映射,编写代码如下: 01void CTestDlg:OnUpdateMenu11(CCmdUI* pCmdUI) 02 03/ TODO: Add your command update UI handler code here 04pCmdUI-SetCheck(flag1); /设置菜单状态 05 上面的代码实现了菜单命令的样式操作,单击一次后则在菜单前面添加 “”,再次

29、单击“”消失。 (7)编译、连接,运行后选择“主菜单1”|“下拉菜单11”命令,弹 出一个消息框,如图9.12所示。再次单击“主菜单”,可以看到其下拉 菜单的“下拉菜单11”前面添加了一个“”,即响应了 UPDATE_COMMAND_UI消息,如图9.13所示。 图9.12 单击菜单命令 图9.13 响应UPDATE_COMMAND_UI消 息 上面介绍了在对话框中使用菜单资源的基本过程和方法。虽然菜单资源 可以方便地显示在对话框上,并可以响应COMMAND消息。但对话框 并没有实现UPDATE_COMMAND_UI消息的处理,因此需要利用 WM_INITMENUPOPUP消息实现对菜单资源的

30、更新。 9.3 工具栏 工具栏一般位于主框架窗口的上部,上面有一些图形按钮。当用户用鼠 标在某一按钮上单击时,程序就会执行相应的命令。按钮的图形是它所 代表功能的形象表示,人们对于形象图形的辨别速度要快于抽象文字, 因此工具条提供了一种比菜单更快捷的用户接口。一般情况下,工具栏 提供了常用菜单的功能。 9.3.1 创建工具栏 在Visual C+的资源编辑环境中可以方便地对工具栏进行设计。在创建 基于文档/视图的应用程序中,向导会自动生成一些常用的工具栏,但 是有时这些工具栏并不能满足要求,需要程序员自己设计工具栏资源。 一般工具栏的设计分为两类,一是在原有工具栏的基础上添加工具按钮。 但大部

31、分的情况是程序员新添加一个工具栏,把新添加的工具栏放在向 导自动生成工具栏的下面,下面对两种情况的设计分别进行介绍。 1添加工具栏按钮 要在自动生成的工具栏上设计工具按钮,只需要进行如下操作: 在项目工作区中,单击Resource View面板,然后单击Toolbar图标的加 号,在其展开项中双击主工具栏的图标,在代码编辑区弹出工具栏编辑, 如图9.14所示。程序员可以方便地添加或者删除工具栏按钮。 图9.14 工具栏设计 系统自动的为新建按钮指定位置,程序员只要在 最后一个按钮处双击,即弹出Toolbar Button Properties对话框,如图9.15所示,只要指定其ID 就可以了。

32、由于工具栏按钮一般是和菜单命令完 成相同的功能,因此其ID可以指定为其相应菜单 的ID号,此时工具栏按钮就可以和菜单命令就有 相应的功能了。同时可以利用绘图工具设计工具 按钮的形象化图标。 图9.15 Toolbar Button Properties对话框 提示:如果读者看不到这两个面板,可以在Developer Studio的工具条 的空白处右击,并在随之弹出的快捷菜单中选中Graphics和Colors两项。 2新建工具栏 有时需要设计新的工具栏以完成较为复杂的工具栏按钮。这时可以称之 为工具条,它一般完成一类操作。例如Word文档里面的工具栏包含多 个工具条。在资源编辑环境中添加工具条

33、的步骤如下所述。 在项目工作区中,单击Resource View面板,然后右击“Toolbar”小图 标,选择Insert Toolbar命令,在工作区弹出新建的工具条资源。程序员 可以设计必要的工具栏按钮的图形来说明具体操作的意义。具体的设计 内容在此不再介绍。 9.3.2 工具栏相关类 在MFC中,类CToolBar是工具条类,它是从CControlBar类派生出来的, 而CControlBar是可以接受命令输入并向用户显示状态消息的类,它称 为控制条类。CToolBar封装了对工具条的大部分操作,同时也封装了对 工具按钮的操作。工具栏类的常用成员如表9.2所示。 表9.2 CToolBa

34、r的成员 在MFC中利用工具栏控制类来控制工具栏,类CToolBarCtrl封装了控制 工具栏的基本操作,其主要成员如表9.3所示。 函函 数数说说 明明 BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR ); 创建工具条创建工具条 void SetSizes( SIZE sizeButton, SIZE sizeImage );设置按钮及位图的大小设置按钮及位图的大小 void SetHeight( int cyHeight )

35、;设置工具栏的高度设置工具栏的高度 BOOL LoadToolBar( LPCTSTR lpszResourceName ); BOOL LoadToolBar( UINT nIDResource ); 加载工具栏资源加载工具栏资源 BOOL SetBitmap( HBITMAP hbmImageWell );设置为图像设置为图像 BOOL SetButtons( const UINT* lpIDArray, int nIDCount );设置按钮,并使按钮与图像关联设置按钮,并使按钮与图像关联 void SetButtonStyle( int nIndex, UINT nStyle );设置

36、按钮风格设置按钮风格 void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );设置按钮的设置按钮的ID、风格、图像号、风格、图像号 BOOL SetButtonText( int nIndex, LPCTSTR lpszText );设置按钮的提示文本设置按钮的提示文本 表9.3 CToolBarCtrl的成员 在应用程序中,创建了工具栏资源文件以后,需要调用相应的函数进行 显示,并且设置其风格。 函函 数数说说 明明 BOOL Create( DWORD dwStyle, const RECT 创建一个工具条,需

37、与资源绑定创建一个工具条,需与资源绑定 BOOL SetState( int nID, UINT nState );设置按钮的状态设置按钮的状态 int AddStrings( LPCTSTR lpszStrings );添加按钮文字添加按钮文字 BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );添加按钮添加按钮 BOOL InsertButton( int nIndex, LPTBBUTTON lpButton );插入按钮插入按钮 void SetStyle( DWORD dwStyle );设置样式设置样式 BOOL Set

38、ButtonSize( CSize size );设置按钮大小设置按钮大小 BOOL HideButton( int nID, BOOL bHide = TRUE );隐藏按钮隐藏按钮 9.3.3 响应工具栏的命令 通过上面的步骤,可以方便地创建工具栏,然后利用工具栏类和工具栏 控制类对工具栏进行显示,利用工具栏控制类可以进一步设置工具栏的 样式和风格等。 工具栏的命令一般是单击响应,由于工具栏一般是菜单的快捷命令形式, 只需要把工具按钮的ID设置成相应的菜单的ID号就可以实现其与菜单一 致的消息响应。同时也可以利用类向导添加相应的消息响应函数,实现 单击工具栏按钮的功能。 9.3.4 使用工

39、具栏 上面介绍了工具栏的设计方法和工具栏及工具栏控制类。下面通过具体 实例讲解创建工具栏和工具栏的使用。 【示例9.4】 在单文档应用程序中添加工具栏,工具栏中放置两个按钮,实现单击 工具栏按钮弹出一个消息框。具体的操作步骤如下所述。 (1)创建一个基于单文档的应用程序Test。 (2)利用资源编辑器添加工具栏,并放置按钮。设计的按钮如图9.16 所示。 图9.16 新建工具条 提示:如果觉得按钮太小,可以用鼠标拖动围绕按钮放大位图的虚框 的右下角,把按钮放 大些。注意工具条内的所有按钮都将被放大。 (3)在CMainFrame类中添加成员CToolBar m_toolbar,在OnCreat

40、e()函 数中显示工具栏,添加代码如下: 01 02if (!m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | 03 CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | 04CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | 05!m_toolbar.LoadToolBar(IDR_TOOLBAR1) /创建工具栏 06 07TRACE0(Failed to create toolbarn); 08return -1; / fail to create 09 上面的代码加载

41、了工具栏资源,但此时显示是不正常的,需要再添加下 面代码: m_toolbar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar( 这样可以使工具条在应用程序的顶部显示,此时可以有多个工具条。 (4)在CMainFrame类中添加变量BOOL cir和BOOL rect,并且进行初 始化值为false。 (5)添加单击工具栏的消息映射。利用类向导添加工具栏按钮的消息 映射。此时需要在其消息响应函数里处理单击的标志变量,以实现按钮 按下的状态。 分析:上面的代码是根据当前工具栏按钮的状态进行消

42、息响应。在单击 了按钮以后,程序会产生UPDATE_COMMAND_UI消息。可以在此消 息的消息映射中处理按钮的状态。 (6)添加UPDATE_COMMAND_UI的消息映射,实现按钮状态的变化。 代码如下: 此时,按钮状态已经处理完了,当单击工具栏按钮时按钮呈现按下状态, 再次单击,按钮弹起。 (7)编译、连接,运行结果如图9.17和图9.18所示。 图9.17 单击矩形按钮 图9.18 单击圆形按钮 上面的代码是添加了工具栏的例子, 在实际应用中,利用工具栏类可以方 便地实现各种功能。同时工具栏作为 一种窗口,可以利用函数移动它在父 窗口的位置。实际应用中经常利用工 具栏按钮显示一些常用

43、的命令。 实际上工具栏不仅仅在文档中使用, 而且可以在对话框等应用程序中管理 对话框资源,并进行显示。同时可以 利用工具栏进行操作。下面介绍一个 具体实例。 【示例9.5】 在对话框应用程序中创建一个工具条,并且在对话框的下端显示出来, 同时响应单击工具栏按钮。具体步骤如下所述。 (1)新建一个基于对话框的应用程序。 (2)利用资源编辑器添加工具栏,并放置按钮。设计的按钮如图9.19 所示。 图9.19 设计工具条 设置上面工具条的ID为IDR_TOOLBAR1,各个按钮从左到右的ID依次 为ID_BUTTON1、ID_BUTTON2、ID_BUTTON3和ID_BUTTON4。 (3)在类C

44、TestDlg中添加变量CToolBar m_toolbar,用来实现加载工具 条资源,并进行显示。在OnInitDialog()函数中添加代码实现工具条的显 示。 分析:上面的代码是实现工具栏在对话框最下端的显示工作。 说明:读者可能很难记忆上面各个样式的代码,但是可以参看单文档 中的工具栏加载部分的代码。 (4)利用类向导添加单击工具栏按钮的消息映射。下面仅仅为了测试 消息响应,弹出一个消息框。这类消息与单击对话框上的一般控件的消 息基本上是一致的。代码如下: (5)编译、连接,运行后单击工具栏上的工具栏按钮,运行结果如图 9.20所示。 图9.20 运行结果 上面介绍了在对话框应用程序中

45、工具栏的使用方法。由于工具栏可大可 小,同时可以利用资源编辑工具绘制工具栏的图标,这样使得工具栏的 使用比按钮更加方便。在实际应用中,工具栏按钮与普通按钮控件的作 用基本是一样的。 9.4 状态栏 在Windows应用程序中经常使用状态栏显示当前系统的状态,例如当前 键盘特殊键的状态。鼠标的位置等。在Visual C+中可以进行状态栏的 设计,同时可以动态改变其显示的内容。本节介绍状态栏的设计和使用 方法。 9.4.1 状态栏 状态栏一般位于窗口的最下端,用来显示一些键盘的特殊键的状态,或 者显示菜单、工具栏按钮的一些说明。在MFC中,CStatusBar类封装了 对状态栏的操作。在单文档应用

46、程序的CMainFrame中可以看到一个 CStatusBar对象,在OnCreate()中创建了状态栏。 状态栏的创建是利用CStatusBar类的Create()函数进行的,创建了状态栏 以后,状态栏并没有任何作用,因为仅仅创建了一个状态栏,上面没有 任何东西。因此它调用了CStatusBar:SetIndicators()函数分配窗格,并将 状态栏的每一个窗格与一个字符串ID相联系。 SetIndicators函数的第一个参数indicators是一个ID数组,在CMainFrame 类所在的CPP文件的开头部分可以找到该数组,代码如下: static UINT indicators =

47、 ID_SEPARATOR, / status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ; indicator数组是存储了状态栏窗格的分配信息。程序员可以在该数组中 添加字符串资源的ID号,然后在应用程序中分配响应的显示位置。这样 应用程序就可以在应用程序界面上显示状态栏信息。在实际的应用中, 可以在String Table字符串资源中添加一项,并且在indicator数组中添加 相应的ID,这样就可以在状态栏中添加新的一栏。 通常情况下需要动态地处理状态栏,这时只需要利用函数得到指向状态 栏

48、的指针,就可以很方便地调用函数实现状态栏的显示。 说明:状态栏某一项显示的字符长度,是程序初始化时根据indicators 数组对应的默认字符串进行分配的。 9.4.2 状态栏操作实例 通过前面的介绍了解了状态栏的基本知识,本小节结合实例讲解添加状 态栏并且动态处理状态栏显示的问题。 【示例9.6】 在状态栏中添加一项,显示鼠标的坐标。具体操作步骤如下所述。 (1)创建一个基于单文档的应用程序。 (2)在项目工作区中,单击Resource View面板,然后单击String Table 图标的加号,在其展开项中双击主工具栏的图标,在代码编辑区弹出 String Table,如图9.21所示。程序员可以方便地添加或者删除其中的某 项。 图9.21 String Table (3)双击最下面的空白

温馨提示

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

评论

0/150

提交评论