版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 菜单、工具栏和状态栏设计菜单、工具栏和状态栏是Windows应用程序中常见的界面元素。Visual C+ 6.0支持各种界面元素的创建,这样使得应用程序的界面更加美观、实用。学习本章,读者可以掌握利用Visual C+ 6.0创建菜单、工具栏和状态栏的基本过程,掌握其使用方法。9.1 概 述在Windows应用程序中,菜单栏、工具栏和状态栏是经常使用的界面元素。在Windows应用程序中使用菜单栏、工具栏和状态栏可以使得应用程序的界面更加美观,同时用户可以方便地通过菜单栏、工具栏和状态栏与应用程序进行交互。菜单栏是大部分Windows应用程序的组成部分,它提供了应用程序和用户进行交互的
2、工具,同时它明确指出用户可以进行的操作,并且对操作进行分类。在前面文档/视图应用程序中,创建单文档或者多文档应用程序时向导会自动生成一个菜单栏。它提供了一般应用程序所拥有的菜单命令。工具栏和状态栏是一个完善的Windows应用程序的重要组成部分。工具栏一般位于主框架窗口的上部,上面有一些图形按钮。当用户用鼠标在某一按钮上单击时,程序就会执行相应的命令;当鼠标在按钮上停留片刻后,就会弹出一个小窗口并显示工具提示。按钮的图形是它所代表功能的形象表示,人们对于形象图形的辨别速度要快于抽象文字,因此工具条提供了一种比菜单更快捷的用户接口。在一个标准的Windows应用程序中,工具条的大部分按钮执行的命
3、令与菜单命令相同,这样做的目的是能同时提供形象和抽象的用户接口,以方便用户的使用。状态栏位于主框架窗口的底部,主要用来显示一些提示信息,可细分为几个窗格。状态栏的主要功能是简要解释被选中的菜单、命令或工具条、按钮、命令,有时状态栏还会显示键盘上某些特定键的状态。例如:显示Caps Lock键、Num Lock键的状态。在一般应用程序中菜单栏、工具栏和状态栏的位置是固定的,如图9.1所示。菜单栏、工具栏和状态栏是一个Windows应用程序中最为常用的界面元素。它不仅使应用程序的界面更加美观,同时可以提供方便的操作。9.2 菜 单在利用Visual C+的应用程序向导生成单文档或者多文档应用程序时
4、,向导会自动生成一个Windows应用程序常见的菜单栏,它提供了Windows应用程序常见的命令。在实际的应用中有时需要对菜单进行重新设计,利用Visual C+的资源编辑工具可以方便地设计菜单资源。本节介绍菜单资源的创建与使用。图9.1 菜单栏、工具栏和状态栏9.2.1 创建菜单在Visual C+ 6.0的资源编辑工具中可以方便地创建菜单资源。在Windows应用程序中,菜单通常有3类,系统菜单、程序主菜单和快捷菜单。系统菜单提供了系统对应用程序主窗口的管理功能,单击程序窗口左上角的标题前的图标时就会弹出系统菜单,如图9.2所示。由于程序中一般不需要对系统菜单进行修改,因此在此不再介绍。图
5、9.2 系统菜单说明:系统菜单是由应用程序自动生成的,用户不需要做任何改变,也不需要对其菜单命令进行消息映射。程序菜单通常位于应用程序的最顶端,它包含了应用程序的大部分功能。在MFC的文档/视图应用程序中,向导会自动创建应用程序主菜单,但是它只是生成了默认的菜单项,在实际中需要根据实际需要进行修改或者添加菜单项。下面结合实例介绍在Visual C+ 6.0中创建菜单资源的方法。【示例9.1】 在单文档应用程序中添加新的菜单项。操作步骤如下所述。(1)创建一个基于单文档的应用程序。(2)单击项目工作区的“Resource View”面板,展开面板里面的内容。单击Menu前面的加号图标,双击其选项
6、,在代码编辑区弹出向导创建的菜单资源。(3)右击菜单资源右边的空白项,在弹出的快捷菜单中选择Properties命令,弹出Menu Item Properties对话框,如图9.3所示。在该对话框中可以对菜单资源的样式等进行设计,下面介绍其属性的具体含义。图9.3 Menu Item Properties对话框Separator:表示该菜单项是一个分割线。Pop Up:表示该菜单项是弹出式菜单,如果是主菜单,那么其有下拉菜单。如果是下拉菜单,那么有向左弹出的菜单。这种菜单一般不具有具体的操作,它只是负责对菜单进行分类。Inactive:表示该菜单项是否被激活,选中该选项表示菜单不可用。Chec
7、ked:表示菜单是否被选中,选中时会在左侧出现一个“”。Grayed:表示菜单是否被禁止使用,禁止使用时字体颜色为灰色。Prompt:表示鼠标滑动到菜单项,是否显示提示内容,提示内容在文本框中输入。(4)设置菜单“下拉菜单选项1”的“Pop Up”按钮,此时它是一个子菜单,即本身不提供操作,拥有向右弹出的菜单。设计两个菜单“具体操作菜单”和“具体操作2”。并且为“具体操作2”设计一个提示字符串:“这是具体操作2”。(5)在“主菜单”下设计另一个菜单命令“下拉菜单2”,取消其“Pop Up”按钮,即本身提供一个菜单命令。(6)编译、连接,运行结果如图9.4所示。图9.4 菜单设计上面的例子虽然设
8、计了菜单,但是可以看到运行时具体的菜单命令是灰色的。这是因为应用程序没有对菜单命令进行任何响应,即此时菜单是没有用处的。在9.2.2节将会利用类向导添加菜单的响应命令,即使得菜单可用。说明:设计菜单时,如果需要添加菜单项,只要在已设计的菜单项下一个空白菜单中右击就可以进行设计。9.2.2 响应菜单项命令前面介绍了在Visual C+ 6.0的资源编辑器中设计菜单资源的一般方法。但是程序运行时,菜单选项都是灰色的,这是因为对菜单命令没有进行映射,即菜单只是一个摆设,还没有具体功能。下面介绍菜单的命令处理,在类向导中,MFC封装了对菜单项的两类消息映射,一是COMMAND消息,另一个是UPDATE
9、_COMMAND_UI消息,下面分别进行介绍。1COMMAND消息的响应COMMAND消息是在用户单击菜单项时产生的消息。因此如果需要对用户单击菜单命令时进行响应,只需要添加COMMAND的消息响应函数就可以了。在前面程序的基础上对前面的“下拉菜单2”进行单击响应,只需要进行如下步骤。(1)选择View|ClassWizard命令,弹出MFC ClassWizard对话框。选择Message Maps标签,在Object Ids列表框中选择ID_MENU2,即是下拉菜单2 的ID。(2)选择Message列表框的COMMAND选项,单击Add Function按钮,即添加了COMMAND的消息
10、映射。如图9.5所示。图9.5 添加消息映射(3)编写消息映射函数的函数体,代码如下:01void CMainFrame:OnMenu2() 0203/ TODO: Add your command handler code here04AfxMessageBox(单击了下拉菜单2命令);/弹出消息框05其功能是弹出一个消息框,提示用户单击了菜单。(4)编译、链接,运行程序,选择“主菜单”|“下拉菜单2”命令,结果如图9.6所示。可见上面代码响应的单击菜单命令的消息,弹出了一个对话框。2UPDATE_COMMAND_UI消息的响应UPDATE_COMMAND_UI消息是在窗口绘制菜单项时产生的
11、消息。有时需要对菜单项的状态或者属性进行设置,那么就可以利用UPDATE_COMMAND_UI消息进行处理。图9.6 运行结果例如可以设置菜单是否可用,菜单前面是否加上“”号,表示选中,表示选中的状态经常和单击菜单结合起来。因此如果需要对用户选择菜单命令时对菜单状态进行处理,只需要添加UPDATE_COMMAND_UI的消息响应函数就可以了。仍然在前面程序的基础上添加“主菜单”|“下拉菜单2”的UPDATE_COMMAND_UI消息。即需要对前面的“下拉菜单2”进行单击时的状态设置,即添加“”,只需要进行如下步骤。(1)选择View|ClassWizard命令,弹出MFC ClassWizar
12、d对话框。选择Message Maps标签,在Object Ids列表框中选择ID_MENU2,即是下拉菜单2 的ID。(2)选择Message列表框的UPDATE_COMMAND_UI选项,单击Add Function按钮,即添加了UPDATE_COMMAND_UI的消息映射。(3)在消息响应这种编写函数体,代码如下:01void CMainFrame:OnUpdateMenu2(CCmdUI* pCmdUI) 0203/ TODO: Add your command update UI handler code here04pCmdUI-SetCheck(flag);/设置状态05需要注意
13、的是flag变量是在类中添加的一个BOOL成员,并且初始化为false。因为此时需要在单击时添加“”,再次单击去掉“”,所以在上面单击的消息响应函数中添加下面一条语句:flag=!flag;通过上面的处理,当选择菜单命令时,会在前面出现“”,再次单击,“”去掉。类CCmdUI常用的函数有下面几个。SetCheck():设置菜单前面的“”。Enable():设置菜单是否可用。SetRadio():设置菜单前面的“”,和SetCheck()相似。SetText():设置菜单的字符串。在UPDATE_COMMAND_UI消息中可以方便地利用上面的函数对菜单进行处理,设置菜单的状态等。(4)编译、连接
14、,运行结果如图9.7所示。首先选择“主菜单”|“下拉菜单2”命令,此时弹出一个消息框。单击“确定”按钮后,再次单击主菜单可以看到,其下面的子菜单上的“下拉菜单2”命令前面添加了一个“”。图9.7 运行结果说明:一般情况下SetCheck()和SetRadio()函数是用来表明菜单的一种状态,使得用户可以方面地查看当前的状态。9.2.3 菜单类概览在MFC中,类CMenu对菜单进行了封装,CMenu类是由CObject类直接派生出来的类。它封装了菜单的基本操作,其中常见的成员如表9.1所示。表9.1 CMenu的成员上面的函数是对菜单的处理函数。在实际应用中,有时需要添加快捷菜单或者其他情况,这
15、时需要利用上面的函数对菜单进行处理,具体实例参见9.2.4节。函函 数数说说 明明BOOL Attach( HMENU hMenu );得到得到Windows标准菜单句柄标准菜单句柄HMENU GetSafeHmenu() const;获得菜单的句柄获得菜单的句柄BOOL CreateMenu();创建一个菜单创建一个菜单BOOL CreatePopupMenu();创建一个弹出式菜单创建一个弹出式菜单BOOL LoadMenu( LPCTSTR lpszResourceName );BOOL LoadMenu( UINT nIDResource );加载菜单资源加载菜单资源BOOL Dest
16、royMenu();释放菜单释放菜单BOOL AppendMenu ( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );添加新项添加新项UINT EnableMenuItem ( UINT nIDEnableItem, UINT nEnable );激活或禁止菜单项激活或禁止菜单项UINT GetMenuItemCount() const;获取菜单项数获取菜单项数UINT GetMenuItemID( int nPos ) const;获取指定位置的菜单的获取指定位置的菜单的IDUINT GetMenuState(
17、UINT nID, UINT nFlags ) const;获取菜单状态获取菜单状态int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;获取菜单的字符串获取菜单的字符串BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitma
18、p* pBmp );插入菜单插入菜单BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );修改菜单修改菜单BOOL RemoveMenu( UINT nPosition, UINT nFlags );删除菜单删除菜单9.2.4 弹出式菜单弹出式菜单是在应用程序中经常用到的一类菜单,又称为快捷菜单。例如在Word文档的工作区里右击,会弹出一个快捷菜单。在应用程序中经常需要设计一个右击的快捷菜单。下面结合实例进行介绍。【示例9.2】 在SDI应用程序中设计一个右
19、击的快捷菜单。具体的操作步骤如下所述。(1)创建一个基于单文档的应用程序。(2)在项目工作区中,单击Resource View面板,然后右击Menu小图标,选择Insert Menu命令,在工作区弹出新建的菜单资源。设计菜单资源如图9.8所示。图9.8 设计菜单(3)在类CTestView中添加数据成员如下:CMenu menu;/定义对象CMenu *menupop;/定义对象指针menu是快捷菜单,menupop是子菜单,本例子中menu是颜色,子菜单是下面的几个菜单项。在构造函数中添加初始化和释放菜单的语句如下:01CTestView:CTestView()0203/ TODO: add
20、 construction code here04menu.LoadMenu(IDR_MENU1);/加载菜单资源050607CTestView:CTestView()0809menu.DestroyMenu();/销毁菜单10(4)向导中添加右击时的消息响应函数。编写函数体,代码如下:01void CTestView:OnRButtonDown(UINT nFlags, CPoint point) 0203/ TODO: Add your message handler code here and/or call default04menupop=menu.GetSubMenu(0);/得到
21、子菜单05ClientToScreen(&point);/客户坐标转换为屏幕坐标06menupop-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);07/弹出菜单08CView:OnRButtonDown(nFlags, point);09分析:上面的代码首先获得了子菜单,然后进行显示。需要注意的是,中间需要由客户坐标转换为屏幕坐标,这是因为所使用的两个坐标系是不相同的,关于此处将在第10章进行介绍。在快捷菜单中,子菜单项的获取需要利用主菜单的GetSubMenu()函数,这样在实际应用中就可以根据需要动态地加载某个子菜单。(5)编译、连接
22、,运行结果如图9.9所示。图9.9 右击弹出快捷菜单快捷菜单的消息响应函数与程序主菜单的消息响应的处理完全一样,只需要利用类向导对相应的菜单添加相应的消息映射,然后编写处理代码就可以了,在此不再介绍。9.2.5 使用对话框中的菜单菜单资源不仅仅可以在文档应用程序中使用,在对话框应用程序中同样可以使用菜单资源。下面结合实例,介绍对话框应用程序中菜单资源的使用。【示例9.3】 在对话框应用程序中使用菜单资源实例。(1)在资源编辑环境中创建一个菜单资源。在此不再介绍具体步骤,读者可参阅前面的叙述。(2)在对话框资源上右击,在弹出的快捷菜单中选择Properties命令,弹出Dialog Proper
23、ties对话框,如图9.10所示。在Menu下拉列表框中选择IDR_MENU1选项。图9.10 Dialog Properties对话框说明:在Menu下拉列表框中会列出本工程中所有的菜单资源,如果没有菜单资源,那么下拉列表框中是空白的。(3)利用上面的步骤,可以将菜单与对话框绑定在一起。此时的菜单显示在对话框的标题栏的下面。利用类向导为单击菜单命令添加消息映射。下面仅仅实验菜单命令的消息映射。实际应用中可以设计具体的功能代码。01void CTestDlg:OnMenu11() 0203/ TODO: Add your command handler code here04AfxMessag
24、eBox(单击主菜单1下的下拉菜单11命令);05flag=!flag;06上面的代码是响应COMMAND消息的消息映射函数。选择菜单命令时弹出一个消息对话框。实际应用中可以设计相关的操作。在菜单中还有一个比较重要的消息UPDATE_COMMAND_UI消息。该消息是在窗口绘制菜单项时产生的消息。有时需要对菜单项的状态或者属性进行设置,那么就可以利用UPDATE_COMMAND_UI消息进行处理。但是此时在对话框中并不能响应这个消息。对于基于文档的应用程序,在下拉菜单显示的时候,WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWnd:OnInitMenuPopup
25、()函数遍历菜单项并为每个菜单项调用更新命令处理函数。菜单的外观被更新以反映它的状态。而更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuPopup()处理函数,而使用CWnd的默认处理函数,该函数没有为菜单项调用更新命令处理函数。为了解决整个问题可以在对话框应用程序中添加WM_INITMENUPOPUP的消息映射。具体步骤如下所述。(4)选择View|CLassWizard命令,弹出MFC CLassWizard对话框。选择Class Info标签,在Message filter下拉列表框中选择Window,如图9.11所示。这样就可以拦截所有的Wi
26、ndows消息。单击Message Maps标签,添加WM_INITMENUPOPUP的消息映射。图9.11 MFC CLassWizard对话框(5)编写WM_INITMENUPOPUP消息的消息映射函数,实现对菜单的更新。在实际应用中并不需要读者自己编写此函数,因为在文档中对菜单的更新进行了函数实现。因此可以直接复制文档模型中CFrameWnd:OnInitMenuPopup()函数的代码,将其粘贴到void CTestDlg:OnInitMenuPopup()函数中,函数代码如下:分析:上面的代码实现了菜单资源的更新操作,并且在MFC中对这类操作提供了很强的保护功能。读者在使用时可以直接
27、复制代码,而不要自己编写代码。利用上面的代码就实现了菜单的更新操作,此时菜单就可以响应WM_INITMENUPOPUP消息。说明:如果读者十分清楚添加消息映射的概念,可以手动添加消息映射,而不需要利用类向导去添加。(6)利用类向导添加“主菜单1”|“下拉菜单11”的UPDATE_COMMAND_UI的消息映射,编写代码如下:01void CTestDlg:OnUpdateMenu11(CCmdUI* pCmdUI) 0203/ TODO: Add your command update UI handler code here04pCmdUI-SetCheck(flag1);/设置菜单状态05
28、上面的代码实现了菜单命令的样式操作,单击一次后则在菜单前面添加“”,再次单击“”消失。(7)编译、连接,运行后选择“主菜单1”|“下拉菜单11”命令,弹出一个消息框,如图9.12所示。再次单击“主菜单”,可以看到其下拉菜单的“下拉菜单11”前面添加了一个“”,即响应了UPDATE_COMMAND_UI消息,如图9.13所示。图9.12 单击菜单命令图9.13 响应UPDATE_COMMAND_UI消息上面介绍了在对话框中使用菜单资源的基本过程和方法。虽然菜单资源可以方便地显示在对话框上,并可以响应COMMAND消息。但对话框并没有实现UPDATE_COMMAND_UI消息的处理,因此需要利用W
29、M_INITMENUPOPUP消息实现对菜单资源的更新。9.3 工具栏工具栏一般位于主框架窗口的上部,上面有一些图形按钮。当用户用鼠标在某一按钮上单击时,程序就会执行相应的命令。按钮的图形是它所代表功能的形象表示,人们对于形象图形的辨别速度要快于抽象文字,因此工具条提供了一种比菜单更快捷的用户接口。一般情况下,工具栏提供了常用菜单的功能。9.3.1 创建工具栏在Visual C+的资源编辑环境中可以方便地对工具栏进行设计。在创建基于文档/视图的应用程序中,向导会自动生成一些常用的工具栏,但是有时这些工具栏并不能满足要求,需要程序员自己设计工具栏资源。一般工具栏的设计分为两类,一是在原有工具栏的
30、基础上添加工具按钮。但大部分的情况是程序员新添加一个工具栏,把新添加的工具栏放在向导自动生成工具栏的下面,下面对两种情况的设计分别进行介绍。1添加工具栏按钮要在自动生成的工具栏上设计工具按钮,只需要进行如下操作:在项目工作区中,单击Resource View面板,然后单击Toolbar图标的加号,在其展开项中双击主工具栏的图标,在代码编辑区弹出工具栏编辑,如图9.14所示。程序员可以方便地添加或者删除工具栏按钮。图9.14 工具栏设计系统自动的为新建按钮指定位置,程序员只要在最后一个按钮处双击,即弹出Toolbar Button Properties对话框,如图9.15所示,只要指定其ID就可
31、以了。由于工具栏按钮一般是和菜单命令完成相同的功能,因此其ID可以指定为其相应菜单的ID号,此时工具栏按钮就可以和菜单命令就有相应的功能了。同时可以利用绘图工具设计工具按钮的形象化图标。图9.15 Toolbar Button Properties对话框提示:如果读者看不到这两个面板,可以在Developer Studio的工具条的空白处右击,并在随之弹出的快捷菜单中选中Graphics和Colors两项。2新建工具栏有时需要设计新的工具栏以完成较为复杂的工具栏按钮。这时可以称之为工具条,它一般完成一类操作。例如Word文档里面的工具栏包含多个工具条。在资源编辑环境中添加工具条的步骤如下所述。
32、在项目工作区中,单击Resource View面板,然后右击“Toolbar”小图标,选择Insert Toolbar命令,在工作区弹出新建的工具条资源。程序员可以设计必要的工具栏按钮的图形来说明具体操作的意义。具体的设计内容在此不再介绍。9.3.2 工具栏相关类在MFC中,类CToolBar是工具条类,它是从CControlBar类派生出来的,而CControlBar是可以接受命令输入并向用户显示状态消息的类,它称为控制条类。CToolBar封装了对工具条的大部分操作,同时也封装了对工具按钮的操作。工具栏类的常用成员如表9.2所示。表9.2 CToolBar的成员在MFC中利用工具栏控制类来
33、控制工具栏,类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 );设置工具栏的高度设置工具栏的高度BOOL Loa
34、dToolBar( LPCTSTR lpszResourceName );BOOL LoadToolBar( UINT nIDResource );加载工具栏资源加载工具栏资源BOOL SetBitmap( HBITMAP hbmImageWell );设置为图像设置为图像BOOL SetButtons( const UINT* lpIDArray, int nIDCount );设置按钮,并使按钮与图像关联设置按钮,并使按钮与图像关联void SetButtonStyle( int nIndex, UINT nStyle );设置按钮风格设置按钮风格void SetButtonInfo( i
35、nt nIndex, UINT nID, UINT nStyle, int iImage );设置按钮的设置按钮的ID、风格、图像号、风格、图像号BOOL SetButtonText( int nIndex, LPCTSTR lpszText );设置按钮的提示文本设置按钮的提示文本表9.3 CToolBarCtrl的成员在应用程序中,创建了工具栏资源文件以后,需要调用相应的函数进行显示,并且设置其风格。函函 数数说说 明明BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParent Wnd, UINT nID );创建一个工具条,需与
36、资源绑定创建一个工具条,需与资源绑定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 SetButtonS
37、ize( CSize size );设置按钮大小设置按钮大小BOOL HideButton( int nID, BOOL bHide = TRUE );隐藏按钮隐藏按钮9.3.3 响应工具栏的命令通过上面的步骤,可以方便地创建工具栏,然后利用工具栏类和工具栏控制类对工具栏进行显示,利用工具栏控制类可以进一步设置工具栏的样式和风格等。工具栏的命令一般是单击响应,由于工具栏一般是菜单的快捷命令形式,只需要把工具按钮的ID设置成相应的菜单的ID号就可以实现其与菜单一致的消息响应。同时也可以利用类向导添加相应的消息响应函数,实现单击工具栏按钮的功能。 9.3.4 使用工具栏上面介绍了工具栏的设计方法和
38、工具栏及工具栏控制类。下面通过具体实例讲解创建工具栏和工具栏的使用。【示例9.4】 在单文档应用程序中添加工具栏,工具栏中放置两个按钮,实现单击工具栏按钮弹出一个消息框。具体的操作步骤如下所述。(1)创建一个基于单文档的应用程序Test。(2)利用资源编辑器添加工具栏,并放置按钮。设计的按钮如图9.16所示。图9.16 新建工具条提示:如果觉得按钮太小,可以用鼠标拖动围绕按钮放大位图的虚框的右下角,把按钮放 大些。注意工具条内的所有按钮都将被放大。(3)在CMainFrame类中添加成员CToolBar m_toolbar,在OnCreate()函数中显示工具栏,添加代码如下:0102if (
39、!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)/创建工具栏0607TRACE0(Failed to create toolbarn);08return -1; / fail to create09上面的代码加载了工具栏资源,但此时显示是不正常的,需要再添加下面代码:m_toolbar.
40、EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_toolbar);这样可以使工具条在应用程序的顶部显示,此时可以有多个工具条。(4)在CMainFrame类中添加变量BOOL cir和BOOL rect,并且进行初始化值为false。(5)添加单击工具栏的消息映射。利用类向导添加工具栏按钮的消息映射。此时需要在其消息响应函数里处理单击的标志变量,以实现按钮按下的状态。分析:上面的代码是根据当前工具栏按钮的状态进行消息响应。在单击了按钮以后,程序会产生UPDATE_COMMAND_UI消息
41、。可以在此消息的消息映射中处理按钮的状态。(6)添加UPDATE_COMMAND_UI的消息映射,实现按钮状态的变化。代码如下:此时,按钮状态已经处理完了,当单击工具栏按钮时按钮呈现按下状态,再次单击,按钮弹起。(7)编译、连接,运行结果如图9.17和图9.18所示。图9.17 单击矩形按钮图9.18 单击圆形按钮上面的代码是添加了工具栏的例子,在实际应用中,利用工具栏类可以方便地实现各种功能。同时工具栏作为一种窗口,可以利用函数移动它在父窗口的位置。实际应用中经常利用工具栏按钮显示一些常用的命令。实际上工具栏不仅仅在文档中使用,而且可以在对话框等应用程序中管理对话框资源,并进行显示。同时可以
42、利用工具栏进行操作。下面介绍一个具体实例。【示例9.5】 在对话框应用程序中创建一个工具条,并且在对话框的下端显示出来,同时响应单击工具栏按钮。具体步骤如下所述。(1)新建一个基于对话框的应用程序。(2)利用资源编辑器添加工具栏,并放置按钮。设计的按钮如图9.19所示。图9.19 设计工具条设置上面工具条的ID为IDR_TOOLBAR1,各个按钮从左到右的ID依次为ID_BUTTON1、ID_BUTTON2、ID_BUTTON3和ID_BUTTON4。(3)在类CTestDlg中添加变量CToolBar m_toolbar,用来实现加载工具条资源,并进行显示。在OnInitDialog()函数
43、中添加代码实现工具条的显示。分析:上面的代码是实现工具栏在对话框最下端的显示工作。说明:读者可能很难记忆上面各个样式的代码,但是可以参看单文档中的工具栏加载部分的代码。(4)利用类向导添加单击工具栏按钮的消息映射。下面仅仅为了测试消息响应,弹出一个消息框。这类消息与单击对话框上的一般控件的消息基本上是一致的。代码如下:(5)编译、连接,运行后单击工具栏上的工具栏按钮,运行结果如图9.20所示。图9.20 运行结果上面介绍了在对话框应用程序中工具栏的使用方法。由于工具栏可大可小,同时可以利用资源编辑工具绘制工具栏的图标,这样使得工具栏的使用比按钮更加方便。在实际应用中,工具栏按钮与普通按钮控件的
44、作用基本是一样的。9.4 状态栏在Windows应用程序中经常使用状态栏显示当前系统的状态,例如当前键盘特殊键的状态。鼠标的位置等。在Visual C+中可以进行状态栏的设计,同时可以动态改变其显示的内容。本节介绍状态栏的设计和使用方法。9.4.1 状态栏状态栏一般位于窗口的最下端,用来显示一些键盘的特殊键的状态,或者显示菜单、工具栏按钮的一些说明。在MFC中,CStatusBar类封装了对状态栏的操作。在单文档应用程序的CMainFrame中可以看到一个CStatusBar对象,在OnCreate()中创建了状态栏。状态栏的创建是利用CStatusBar类的Create()函数进行的,创建了
45、状态栏以后,状态栏并没有任何作用,因为仅仅创建了一个状态栏,上面没有任何东西。因此它调用了CStatusBar:SetIndicators()函数分配窗格,并将状态栏的每一个窗格与一个字符串ID相联系。SetIndicators函数的第一个参数indicators是一个ID数组,在CMainFrame类所在的CPP文件的开头部分可以找到该数组,代码如下:static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;indicat
46、or数组是存储了状态栏窗格的分配信息。程序员可以在该数组中添加字符串资源的ID号,然后在应用程序中分配响应的显示位置。这样应用程序就可以在应用程序界面上显示状态栏信息。在实际的应用中,可以在String Table字符串资源中添加一项,并且在indicator数组中添加相应的ID,这样就可以在状态栏中添加新的一栏。通常情况下需要动态地处理状态栏,这时只需要利用函数得到指向状态栏的指针,就可以很方便地调用函数实现状态栏的显示。说明:状态栏某一项显示的字符长度,是程序初始化时根据indicators数组对应的默认字符串进行分配的。9.4.2 状态栏操作实例通过前面的介绍了解了状态栏的基本知识,本小节结合实例讲解添加状态栏并且动态处理状态栏显示的问题。【示例9.6】 在状态栏中添加一项,显示鼠标的坐标。具体操作步骤如下所述。(1)创建一个基于单文档的应用程序。(2)在项目工作区中,单击Resource View面板,然后单击String Table图标的加号,在其展开项中双击主工具栏的图标,在代码编辑区弹出String Table,如图9.21所示。程序员可以方便地添加或者删除其中的某项。图9.21 String T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河道城市供热系统改造合同
- 建筑安全净化施工合同
- 建筑工程测量合同样本
- 智能电网电力施工合同范本
- 酒店工程建造师招聘合同
- 保健医生岗位聘用合同
- 高速公路安全文明施工协议
- 非营利组织合同专用章管理规定
- 出售葵花合同范例
- 店铺定做礼品采购合同范例
- 课内文言文阅读(原卷版)-2024-2025学年九年级语文上学期期中试题分类汇编(山东专用)
- 院感课件下载
- 2022幼儿园教师读书参考心得体会5篇
- 2024年《内科护理学》考试复习题库(含答案)
- 江苏省常熟市2024-2025学年七年级上学期12月月考历史卷(含答案)
- 浙江大学医学院附属儿童医院招聘人员真题
- 考试安全保密培训
- 租赁部绩效考核制度
- 江苏省扬州市2023-2024学年高一上学期期末考试物理试题(含答案)
- 2024年时事政治题库附参考答案(综合题)
- 屠呦呦课件教学课件
评论
0/150
提交评论