CToolBar的使用介绍

CToolBar控件是MFC提供的一个类,实现了一般窗口应用中的工具条。通常用于SDI或者MDI程序中,对话框程序中通常不使用工具条。


工具栏介绍


一、代码中的工具条

工具条是一个CToolBar类对象,通常作为成员对象嵌入程序的CMainFrame类中,也就是说嵌入主框架窗口中。因此,MFC生成框架窗口的时候同时生成工具条,销毁框架窗口的时候同时销毁工具条。下面是一个多文档 (MDI) 程序的代码片断,给出了工具条相关的代码:

class CMainFrame : public CMDIFrameWnd
{
   // ...
protected:  // control bar embedded members
   CToolBar    m_wndToolBar;

protected:
   //{{AFX_MSG(CMainFrame)
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
   //}}AFX_MSG
   DECLARE_MESSAGE_MAP()
};


工具条的创建过程发生在CMainFrame::OnCreate阶段。MFC在创建框架窗口以后,在显示窗口之前调用这个OnCreate函数,AppWizard通常在这个函数中做如下的工作:
1、调用CToolBar对象的Create成员函数,来生成内嵌的CToolBarCtrl对象。
2、调用LoadToolBar函数加载工具条资源。
3、调用函数来启动工具条的停靠、浮动、提示等功能,具体详见后面“停靠和浮动”的内容。这些调用的代码是可选的,如果不需要这些功能,可以删除它们。

二、编辑工具条资源
通过AppWizard生成的工具条是基于MFC4.0中定义的RT_TOOLBAR类型的资源。工具条的按钮可以用工具条编辑器来修改,诸如添加、删除、排列按钮等操作。
要把一个工具条按钮和一个命令相关联,必须给按钮一个命令ID,例如ID_MYCOMMAND,可以在工具条按钮的属性页中添加这个命令,然后用ClassWizard生成命令的响应函数。

三、多个工具条
AppWizard仅仅提供了一个工具条,如果需要多个,则可以根据第一个工具条的代码创建多个自己的工具条。首先创建工具条资源,然后在框架窗口类中嵌入新的CToolBar对象,最后在OnCreate函数中生成它。

四、工具条按钮
通常工具条显示一些代表不同命令的按钮,工具条的按钮和菜单项类似,都会产生命令,而且通常情况下工具条按钮和菜单项的ID相同,两者的功能相同,用户可以在使用程序的时候,自愿选择。

五、停靠和浮动
MFC的工具条可以固定停靠在父窗口的一侧,或者通过拖拉停靠在父窗口的任何一侧,或者以小窗口的形式浮动在父窗口的上面。

1、允许停靠
要在一个框架窗口中停靠工具条,该窗口必须允许停靠,调用CFrameWnd::EnableDocking ,该函数通过一个DWORD参数给出框架窗口的那一侧允许停靠。准备好停靠的目标以后,工具条也要做同样的准备,调用CControlBar::EnableDocking 启动工具条的停靠功能,给出可以停靠的边。如果工具条允许停靠的边和框架窗口允许停靠的边没有相同的,工具条就会浮动在框架窗口的上面。因此如果想永久的把工具条做成浮动的,就把参数设置成0,然后调用CFrameWnd::FloatControlBar。

准备好上述工作以后,框架调用CFrameWnd::DockControlBar 开始启动工具条的停靠。可以在任何时候调用这个函数,但通常是在初始化阶段调用。

一个停靠的工具条离开框架窗口的边以后,就浮动的,也可以直接调用CFrameWnd::FloatControlBar 把工具条设置成浮动的。给出浮动的位置和样子。当用户把一个停靠的工具条拖拽离开框架窗口的边的时候,框架也调用这个函数,和DockControlBar函数一样,你也可以在初始化阶段调用它。
MFC对停靠工具条不提供某些功能的支持,例如自定义工具条。

从Visual C++ 4.0版本之后,开始提供对动态改变工具条尺寸的支持,一般来讲,工具条是一个水平的长条形,但是也可以改变它的形状,例如垂直的长条,或者多行。工具条在生成的时候,有一个属性:
CBRS_SIZE_DYNAMIC 或者 CBRS_SIZE_FIXED   。如果定义了前者,则工具条在浮动状态的时候,可以通过拖拽它的边改变它的形状。如果定义了后者,则不论工具条是停靠状态还是浮动状态,它的形状是不变的。

可以通过函数CToolBar::GetButtonStyle获取工具条按钮的状态和属性,属性决定了按钮如何响应用户的单击,状态决定了按钮的换行。比如说对于一个FIXED属性的工具条,想让它的按钮分两行显示,从第三个按钮(包括分割条)开始,可以这么做:
在框架窗口的OnCreate函数中,生成工具条以后,加入下列代码:
 //获取第三个按钮(或者分割条)的属性
 UINT nStyle = m_wndToolBar.GetButtonStyle( 3 );
 //将它设置成换行
 nStyle |= TBBS_WRAPPED;
 m_wndToolBar.SetButtonStyle( 3, nStyle );

 // 将工具条属性设置成 fixed
 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
       CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);


六、工具条提示
MFC的工具条还可以提供提示功能,就是当用户把鼠标移动在工具条按钮上面的时候,弹出一个小的窗口,给出描述该按钮用途的一小段文字。用AppWizard生成的工具条,自动具备这个提示功能。
要在程序中激活提示功能,需要两个条件:
1、在CToolBar::Create函数中明确给出CBRS_TOOLTIPS 风格,或者用SetBarStyle函数设置这个风格。
2、在资源里面添加提示字符串,用/n隔开,字符串的ID和该按钮的相同。或者在编辑工具条按钮的时候,打开它们的属性栏,在Properties 一栏输入提示字符串。如果一个工具条包含子控件,只要控件的ID不是-1,而且字符串资源里面有对应的字符串,子控件也可以有提示功能。

这里要说一下 CBRS_FLYBY 属性,一般来说当工具条的按钮被按下的时候,状态条就会显示关于该按钮的一个说明文字,如果定义了这个属性,则当鼠标位于按钮之上的时候,就会显示这个提示,不用按下按钮。


二、使用CToolBar类

 
 CToolbar对象具有一行位图按钮和可选的分割条,这些按钮的行为和下压按钮,check-box按钮和单选按钮一样。CToolBar对象通常嵌入 CFrameWnd 或者 CMDIFrameWnd对象里面。

 CToolBar类的成员函数GetToolBarCtrl允许你使用Windows通用控件支持的特性来设计工具条或者添加额外的功能。CToolBar的成员函数已经提供了Windows通用控件的大多数功能,如果你调用GetToolBarCtrl,会返回一个CToolBarCtrl对象的引用,利用它可以实现 Windows 95工具条的许多特性。

Visual C++ 提供了两种生成工具条的方法:
要生成一个工具条,应该遵循下面的步骤:
1、生成一个工具条资源
2、构造工具条对象
3、调用 Create (或者 CreateEx) 函数生成一个工具条窗口,并把它关联到 CToolBar对象。
4、调用 LoadToolBar 函数加载工具条的资源。

或则采用下面的步骤:
1、构造一个工具条对象。
2、调用 Create (或者 CreateEx) 函数生成一个工具条窗口,并把它关联到 CToolBar对象。
3、调用 LoadBitmap 函数来加载包含工具条按钮图片的位图。
4、调用 SetButtons 函数来设置工具条按钮的样式并且把每个按钮与位图中的某个图片相关联。

一个工具条中的所有图片都来自于一个位图,该位图应该至少为每个按钮提供一个图片,所有的图片必需是相同的尺寸,缺省定义是 16 象素宽,15 象素高。在位图中,图片必需一个挨着一个。

 SetButtons 函数使用一个指向 控制ID的数组指针和一个给出id数目的整数。该函数把工具条每个按钮的id设置成数组中对应的值,并且为每个按钮分配一个图片。如果数组中包含ID_SEPARATOR的项,则不会给它关联图片。

 通常图片的顺序就是他们在屏幕上画的顺序,但是你可以通过函数SetButtonInfo来改变这个顺序。

 一个工具条的所有按钮都是相同的尺寸。缺省定义是 24 x 22 象素,迎合了 Windows 软件设计接口规范的要求。在图片和按钮之外的其它多余空间是用来生成一个边框。

 每个按钮有一个图片。不同的按钮状态和属性下 (压下,抬起,禁用,激活,以及中间态)的图片都从那个图片产生。虽然图片可以用任何颜色,但是带有灰色阴影的黑色图片效果最好。

 工具条上的按钮初始状态都是下压按钮。然而,它们可以改成check-box 按钮或者单选按钮。Check-box 按钮具有三个状态:选中,清除和中间态,单选按钮只有两个状态:选中和清除。

 要设置一个按钮或者分隔条的属性,可以通过函数 GetButtonStyle获得属性,然后调用 SetButtonStyle进行设置,而不用SetButtons。 SetButtonStyle函数在运行时刻改变按钮的属性十分好用。

 要在按钮上显示文字,可以通过函数 GetButtonText获取文字,调用 SetButtonText设置文字。

  要生成一个 check-box 按钮,只需加上 TBBS_CHECKBOX属性,或者在 ON_UPDATE_COMMAND_UI 处理函数中使用CCmdUI对象的SetCheck函数设置。只要调用SetCheck函数就会自动把下压按钮改变成为check-box按钮。

 要生成一个单选按钮,可以在ON_UPDATE_COMMAND_UI处理函数中,调用CCmdUI对象的SetRadio函数。为了提供一组单选按钮的排它功能,你必须为该组的所有按钮都生成ON_UPDATE_COMMAND_UI处理函数。


关于通用控制条的认识


本文所论及的内容包括MFC中的控制条类:
 CControlBar, CStatusBar, CToolBar, CDialogBar, 和 CDockBar.
(一)CControlBar

 ControlBar 派生自 CWnd,通常定位于框架窗口的顶端或者底部。它可以包含窗口类的子项,比如 CDialogBar,或者非窗口类的子项,比如CToolBar和 CStatusBar。

 控制条支持的样式包括:

 CBRS_TOP   (缺省的)位于顶部
 CBRS_BOTTOM  放置在底部
 CBRS_NOALIGN 在父窗口尺寸变化的时候,不要重新定位控制条

 从 CControlBar派生的类提供了更加有趣的功能:

 (a) 状态条CStatusBar ,它的子项是包含文字的面板
 (b) 工具条CToolBar ,对于工具条来说,子项是排列成一行的位图按钮
 (c)  对话框条CDialogBar 象一个框架一样的工具条,包括标准windows控件 (从一个对话框模板资源生成)
 (d)  CDockBar,可以认为它是为其它控制条类提供对接区域的一个区域。该类的成员函数和变量在将来可能还要变化。

  记住:所有的控制条对象必需是某个框架窗口的子窗口。通常它们被作为框架客户区(例如,一个MDI客户区或者一个视窗口)的同级窗口。对于一个控制条来说,它的子窗口ID是非常重要的。仅仅当它的ID的值位于AFX_IDW_CONTROLBAR_FIRST和AFX_IDW_CONTROLBAR_LAST之间时,控制条的缺省布局才能起作用。

#define AFX_IDW_CONTROLBAR_FIRST        0xE800
#define AFX_IDW_CONTROLBAR_LAST         0xE8FF

注意,虽然一共有256个控制条ID,前面的32个是做特殊用途的,它们直接被打印预览结构支持。


(二)工具条

工具条支持两种按钮: 下压按钮和check box按钮。通过使用check box按钮组加上适当的ON_UPDATE_COMMAND_UI处理,可以得到单选按钮组的功能。

工具条中的所有按钮的图片都取自同一个位图。每个按钮尺寸相同(缺省尺寸是24x22象素大小),每个按钮的图片尺寸相同而且相连, 图片的缺省大小是16x15象素,所以如果一个工具条具有10个按钮,则需要位图的尺寸是160象素宽,15 象素高。

工具条按钮的所有状态的图片都是通过一定的算法从那一个图片中转换得到。因此,虽然理论上按钮图片可以使用任何颜色,但是对于这个算法来说,如果原始图片使用灰色阴影效果比较好。

项              Windows 颜色           缺省RGB值 
工具条背景      COLOR_BTNFACE          RGB(192, 192, 192) 
工具条左/上边框 COLOR_BTNHIGHLIGHT     RGB(255, 255, 255) 
工具条右/下边框 COLOR_BTNSHADOW        RGB(128, 128, 128)

对工具条的 CCmdUI 支持:

工具条按钮的更新是通过空闲时刻调用 ON_UPDATE_COMMAND_UI 完成的。通过这个函数可以:

1、允许/禁止工具条按钮。
2、设置按钮为check状态。注意调用SetCheck函数会把按钮变成check box 按钮。
3、SetRadio: 设置类似单选按钮的功能。

工具条按钮会象正常的按钮一样发送WM_COMMAND消息,通常被一个ON_COMMAND函数处理。

工具条按钮一共有四种样式(代表四种状态):
TBBS_CHECKED
TBBS_INDETERMINATE
TBBS_DISABLED
TBBS_PRESSED

正式的按钮状态定义是六种,它们是:

Up = 0
Mouse Down = TBBS_PRESSED (| any other style)
Disabled = TBBS_DISABLED
Down = TBBS_CHECKED
Down Disabled = TBBS_CHECKED | TBBS_DISABLED
Indeterminate = TBBS_INDETERMINATE

原文地址:https://www.cnblogs.com/jinxiang1224/p/8468359.html