标题：CToolBarCtrl
CToolBarCtrl
概述ctoolbarctrl是CStandardBar的父类CToolBarCtrl的父类的父类，是一个窗口继承类，在子窗口变动的时候，MFC一定会给窗口发出一些消息，其中包括调用OnChildNotify的消息，能进入到这个接口的消息也很多WM_NOTIFY只是其中一个， 默认情况下，OnChildNotify他只处理正常的界面调整功能，你不重载的话，他就实现 CToolBarCtrl::OnChildNotify(message, wParam, lParam, pLResult); 所实现的程序功能， 而你重载了，他每次到这个消息，先执行你需要的操作，再执行系统操作，也就是重载在运行时被你控制过了。 CToolBarCtrl类提供了Windows工具条通用控件的性能。这个控件（也就是CToolBarCtrl类）只对运行在Windows 95和Windows NT 3.51或更高版本下的程序来说才是可用的。
一个Windows工具条通用控件是一个矩形子窗口，它包含一个或多个按钮。这些按钮可以显示一个位图图像，一个字符串，或两者都有。当用户选择一个按钮时，它向该工具条的属主窗口发送一条命令消息。通常，工具条中的按钮对应于应用程序的菜单中的项；这些按钮为用户访问一个应用程序的命令提供了更为直接的方法。
CToolBarCtrl对象包含几个重要的内部数据结构：一个按钮图像列表或一个图像列表，一个按钮标签字符串列表和一个TBBUTTON结构的列表，该结构使一个图像和/或字符串与按钮的位置，风格，主题和命令ID相关联。这些数据结构的每一个都由一个从零开始的索引来引用。在你可以使用一个CToolBarCtrl对象之前，你必须设置这些数据结构。字符串列表只能被用作按钮标签；不能从按钮中检取字符串。使用步骤要使用一个CToolBarCtrl对象，通常你应该遵循下面的这些步骤：
1. 构造该CToolBarCtrl对象。
2. 调用Create来创建Windows工具条通用控件并将它与该CToolBarCtrl对象连接。通过使用风格来指定工具条的风格，如对一个透明的工具条使用TBSTYLE_ TRANSPARENT，或对一个支持风格按钮的工具条使用TBSTYLE_DROPDOWN。
3. 指明你希望按钮在工具条上如何显示：
给按钮使用位图图像，通过调用AddBitmap将按钮位图添加到工具条中。
给按钮使用来自一个图像列表的图像，通过调用SetImageList，SetHotImageList，或SetDisabledImageList来指定图像列表。 
给按钮使用字符串标签，通过调用AddString和/或AddStrings来将字符串添加到工具条中。
4. 通过调用AddButtons将按钮结构添加到工具条中。
5. 如果你希望在一个不是CFrameWnd的属主窗口中的工具条具有工具提示，则你必须在工具条的属主窗口中处理TTN_NEEDTEXT消息，就像在CToolBarCtrl处理工具提示通知中描述的一样。如果工具条的父窗口是由CFrameWnd派生而来的，则你不用作任何额外的努力就可以显示工具提示，因为CFrameWnd提供了一个缺省的处理函数。
6. 如果你希望能够让用户定制工具条，则在属主窗口中处理定制通知消息，就像在CToolBarCtrl：处理定制通知中描述的一样。
你可以使用SaveState来将一个工具条控件的当前状态保存在注册表中，用RestoreState来根据注册表中先前保存的信息恢复工具条的状态。除了在应用程序的使用之间保存工具条的状态，通常在用户开始定制该工具条之前应用程序会保存工具条的状态，以防用户后来想将工具条恢复到它的最初的状态。
为Internet Explorer 4.0或更新版提供的支持
要支持在Internet Explorer 4.0或更新版之后引入的性能，MFC提供了图像列表支持，为工具条提供了透明和平坦风格。
一个透明的工具条允许在工具条下的客户被透过工具条显示出来。要创建一个透明的工具条，要同时使用TBSTYLE_FLAT和TBSTYLE_TRANSPARENT风格。透明的工具条具有热点跟踪的特色；就是说，当鼠标指针移动到工具条的一个热点按钮上时，按钮的外观改变。只用TBSTYLE_FLAT风格创建的工具条将包含不透明的按钮。
图像列表支持使控件的缺省行为具有更大的灵活性，并支持热点图像和无效的图像。对透明的工具条使用GetImageList，GetHotImageList和GetDisabledImageList可以根据它的状态来操纵图像。
有关使用CToolBarCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CToolBarCtrl”。
#include <afxcmn.h>
请参阅：CToolBar
CToolBarCtrl类成员
构造CToolBarCtrl::CToolBarCtrl：构造一个CToolBarCtrl 对象
CToolBarCtrl::Create：创建一个工具栏控件并将它附加到 CToolBarCtrl 对象。属性CToolBarCtrl::IsButtonChecked：指示在工具栏控件的指定的按钮是否已选中。 CToolBarCtrl::IsButtonEnabled ：指示在工具栏控件的指定的按钮是否启用。 CToolBarCtrl::IsButtonHidden ：指示在工具栏控件的指定的按钮是否为隐藏的。 CToolBarCtrl::IsButtonHighlighted ：检查工具栏按钮的突出显示状态。 CToolBarCtrl::IsButtonIndeterminate ：通知指定的按钮的状态在工具栏控件是否是不确定的(灰色）。 CToolBarCtrl::IsButtonPressed ：指示在工具栏控件的指定的按钮是否按。
CToolBarCtrl::SetState：设置指定的按钮的状态在工具栏控件。
CToolBarCtrl::GetState ：检索有关指定的按钮的状态信息在一个工具栏控件，例如是否已启用，按下或签出。
CToolBarCtrl::GetButton ：检索有关指定的按钮的信息在工具栏控件。 CToolBarCtrl::GetButtonCount ：当前检索按钮的计数在工具栏控件
CToolBarCtrl::GetItemRect：检索一个按钮的边框在工具栏控件的。
CToolBarCtrl::GetRect ：检索一个指定的工具栏按钮的边框。
CToolBarCtrl::SetButtonStructSize ：指定 TBBUTTON 结构的大小。
CToolBarCtrl::GetButtonSize ：检索当前宽度和高度工具栏按钮，以像素为单位。
CToolBarCtrl::GetButtonSize：检索当前宽度和高度工具栏按钮，以像素为单位。
CToolBarCtrl::SetButtonSize：设置要添加的按钮的大小到工具栏控件。
CToolBarCtrl::SetBitmapSize：设置要添加的数字复制图像的大小到工具栏控件。
CToolBarCtrl::GetToolTips：检索工具提示控件的句柄，如果有，与工具栏控件。
CToolBarCtrl::SetToolTips ：关联工具提示控件与工具栏控件。
CToolBarCtrl::SetOwner ：设置窗口接收从工具栏控件的通知消息。
CToolBarCtrl::SetRows ：设置要在工具栏上显示的按钮。
CToolBarCtrl::GetRows：检索行数工具栏当前显示的按钮。
CToolBarCtrl::SetCmdID：指定的按钮时，设置要发送的命令ID给所有者窗口。
CToolBarCtrl::GetBitmapFlags ：获取标志与工具栏的位图。
CToolBarCtrl::GetDisabledImageList ：检索图像列表工具栏控件使用显示禁用的按钮。
CToolBarCtrl::GetHotImageList：检索图像列表工具栏控件使用显示“快捷”按钮。 当鼠标指针悬停在上时，一个快捷按钮突出显示。
CToolBarCtrl::GetImageList：检索图像列表工具栏控件使用显示在其默认状态的按钮。
CToolBarCtrl::GetStyle ：检索样式将用于工具栏控件。
CToolBarCtrl::GetMaxTextRows：检索文本行的最大数在工具栏按钮公开的。
CToolBarCtrl::SetButtonWidth：设置在工具栏控件的最小值和最大值按钮宽度。
CToolBarCtrl::SetDisabledImageList：设置图像列表工具栏控件将使用显示禁用的按钮。
CToolBarCtrl::SetHotImageList：设置图像列表工具栏控件将使用显示“快捷”按钮。
CToolBarCtrl::SetImageList：设置图像列表工具栏将使用显示其默认状态的按钮。
CToolBarCtrl::GetDropTarget：检索工具栏控件的 IDropTarget 接口。
CToolBarCtrl::SetIndent ：将第一个按钮的缩进在工具栏控件。
CToolBarCtrl::SetMaxTextRows ：设置文本行的最大数在工具栏按钮公开的。
CToolBarCtrl::SetStyle：设置工具栏控件的样式。
CToolBarCtrl::GetAnchorHighlight：检索设置为工具栏的定位点突出显示。
CToolBarCtrl::SetAnchorHighlight：设置为工具栏的定位点突出显示。
CToolBarCtrl::GetHotItem ：检索快捷项的索引工具栏上的。
CToolBarCtrl::SetHotItem ：设置工具栏上的快捷项目。
CToolBarCtrl::GetInsertMark：检索工具栏的当前插入标记。
CToolBarCtrl::SetInsertMark ：设置工具栏按钮的当前插入标记。
CToolBarCtrl::GetMaxSize：检索所有的总大小可见按钮和分隔符在工具栏。
CToolBarCtrl::InsertMarkHitTest：检索点插入标记信息在工具栏。
CToolBarCtrl::GetExtendedStyle ：检索工具栏控件的扩展样式。
CToolBarCtrl::SetExtendedStyle ：设置工具栏控件的扩展样式。
CToolBarCtrl::GetInsertMarkColor：检索使用的颜色绘制工具栏中插入标记。
CToolBarCtrl::SetInsertMarkColor ：设置用于的颜色绘制工具栏中插入标记。
CToolBarCtrl::MapAccelerator：映射快捷键字符为工具栏按钮。
CToolBarCtrl::MoveButton ：从索引按钮移动到另一个。
CToolBarCtrl::HitTest ：确定一个点位置。工具栏控件。操作CToolBarCtrl::EnableButton：启用或禁用了toolbar控件的指定的按钮。
CToolBarCtrl::CheckButton：选中或清除在工具栏控件的特定按钮。
CToolBarCtrl::GetButtonInfo ：检索一个按钮的信息在工具栏。
CToolBarCtrl::SetButtonInfo：将现有按钮的信息在工具栏。
CToolBarCtrl::PressButton ：按或版本在工具栏控件的指定的按钮。
CToolBarCtrl::SetDrawTextFlags ：将Win32函数 DrawText，的标志用于绘制在指定的矩形的文本，已设置基于标志如何设置。
CToolBarCtrl::HideButton ：隐藏或显示在工具栏控件的指定的按钮。
CToolBarCtrl::Indeterminate：设置或清除指定的按钮不确定的(灰色)状态在工具栏控件的。
CToolBarCtrl::AddBitmap：添加一个或多个位图按钮图像到按钮图像列表可用于工具栏控件。
CToolBarCtrl::AddButtons ：添加一个或多个按钮添加到工具栏控件。
CToolBarCtrl::DeleteButton：从控件中删除工具栏按钮。
CToolBarCtrl::InsertButton ：插入工具栏中的按钮控件。
CToolBarCtrl::CommandToIndex ：检索按钮的从零开始的索引与指定的顺序标识符。
CToolBarCtrl::RestoreState ：还原工具栏控件的状态。
CToolBarCtrl::MarkButton ：设置特定按钮的突出显示状态。工具栏控件的。
CToolBarCtrl::LoadImages ：加载位图到工具栏控件的图像中列出。
CToolBarCtrl::SaveState：保存工具栏控件的状态。
CToolBarCtrl::AddString：添加一个新字符串，作为资源ID，为内部的工具栏上的列表的字符串。
CToolBarCtrl::AddStrings ：加一个新字符串，通过，为Null分隔的字符串缓冲区的指针，对内部的工具栏上的列表的字符串。
CToolBarCtrl::AutoSize ：调整工具栏控件。
CToolBarCtrl::Customize ：显示自定义工具栏"对话框。
消息处理
工具提示通知当你指定工具条具有TBSTYLE_TOOLTIPS风格时，该工具条创建并管理一个工具提示控件。一个工具提示是一个小的弹出窗口，该窗口包含了一行用于描述一个工具条按钮的文本。通常该工具提示是被隐藏的，只有当用户将光标放在一个工具条按钮上并停留大概半秒时间时它才显示出来。工具提示显示在光标的附近。
在工具提示被显示之前，TTN_NEEDTEXT通知消息被发送给该工具条的属主窗口，以获取对应于该按钮的描述文本。如果该工具条的属主窗口是一个CFrameWnd窗口，则不需要任何额外的工作就会显示工具提示，因为CFrameWnd有一个缺省的TTN_NEEDTEXT通知处理函数。如果该工具条的属主窗口不是由CFrameWnd派生而来的，比如是一个对话框或格式视，则你必须在你的属主窗口的消息映射中添加一项，并在消息映射中提供一个通知处理函数。下面就是要被添加到你的属主窗口的消息映射：
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, memberFxn )
memberFxn 当这个按钮的文本需要显示时将被调用的成员函数。
注意，一个工具提示的id总是0。
除了TTN_NEEDTEXT通知，一个工具提示控件可以向一个工具条控件发送下列通知：通知消息含义 
TTN_NEEDTEXTA：工具提示控件需要 ASCII 文本 (仅限 Windows 95)。TTN_NEEDTEXTW：工具提示控件需要 UNICODE 文本 (仅限 Windows NT)。TBN_HOTITEMCHANGE：指示快捷 (显示的) 项目已更改。 NM_RCLICK ：指示用户使用了鼠标右键单击按钮。 TBN_DRAGOUT：指示用户单击按钮并拖动的指针按钮。 它允许应用程序实现从工具栏按钮的拖放。 在收到此通知时，应用程序将启动拖放操作。 TBN_DROPDOWN：指示用户单击以使用 TBSTYLE_DROPDOWN 样式的按钮。 TBN_GETOBJECT ：指示用户移动了在使用 TBSTYLE_DROPPABLE 样式的按钮的指针。
处理函数的例子和有关使能工具提示的更多信息，参见“Visual C++程序员指南”中的“工具提示”。自定义通知一个Windows工具条通用控件具有内在的定制特征，包括一个系统定义的定制对话框，用来让用户插入、删除，或重新安排工具条按钮。应用程序决定定制是否有效，并控制用户对该工具条定制的限度。
你可以通过给予工具条CCS_ADJUSTABLE风格来使这些定制特征对于用户来说是可用的。此定制特征允许用户将一个按钮拖动到一个新的位置，或通过拖动按钮离开工具条来删除这个按钮。另外，用户可以双击工具条来显示Customize Toolbar对话框，让用户添加、删除，或重新安排工具条按钮。应用程序可以通过使用Custoimize成员函数来显示对话框。
在定制过程中的每一步，工具条控件都向父窗口发送通知消息。如果用户按住SHIFT键并开始拖动一个按钮，则工具条自动处理这个拖动操作。工具条发送TBN_QUERYDELETE通知消息给父窗口，以确定是否应该删除该按钮。如果父窗口返回FALSE，则这个拖动操作结束。否则，工具条捕捉鼠标输入并等待用户释放鼠标按钮。
当用户释放鼠标按钮时，工具条控件确定鼠标光标所在的位置。如果该光标的位置是在工具条之外，则按钮被删除。如果光标位于另一个工具条按钮上，则工具条向其父窗口发送TBN_QUERYINSERT通知消息，以确定是否要将一个按钮插入在给定按钮的左边。如果父窗口返回TRUE，则该按钮被插入；否则，不插入。工具条发送TBN_TOOLBARCHANGE通知来表示拖动操作结束。
如果用户在没有按下SHIFT键的情况下开始一次拖动操作，则工具条控件发送TBN_BEGINDRAG通知消息给属主窗口。一个实现了自己的按钮拖动代码的应用程序可以使用这个消息作为开始一次拖动操作的信号。工具条发送TBN_ENDDRAG通知消息来表示拖动操作结束。
当用户通过使用Customize Toolbar对话框来定制一个工具条时，该工具条控件发送通知消息。在用户双击工具条之后，但在对话框被创建之前，该工具条发送TBN_BEGINADJUST通知消息。然后，工具条开始发送一系列TBN_QUERYINSERT消息，以确定该工具条是否允许插入按钮。当父窗口返回TRUE时，该工具条停止发送TBN_QUERYINSERT通知消息。如果父窗口没有对任何按钮返回TRUE，则工具条销毁该对话框。
接着，工具条控件通过为工具条中的每一个按钮发送一个TBN_QUERYDELETE通知消息来确定是否可以从工具条中删除某个按钮。父窗口返回TRUE则表示可以删除该按钮；否则，父窗口返回FALSE。工具条将所有的按钮都添加到对话框中，但是将那些不能删除的按钮变灰。
不管什么时候，当工具条控件需要有关Customize Toolbar对话框中的某个控件的信息时，它就发送TBN_GETBUTTONINFO通知信息，并指定它想获取其信息的按钮的索引，以及一个TBNOTIFY结构的地址。父窗口必须用相关的信息填充该结构。
Customize Toolbar对话框还包括一个Help按钮和一个Reset按钮。当用户选择Help按钮时，工具条控件发送TBN_CUSTHELP通知消息。父窗口应该通过显示帮助信息来作出响应。当用户选择Reset按钮时，对话框发送TBN_RESET消息。这个消息表示工具条要再次初始化这个对话框。
这些消息都是WM_NOTIFY消息，通过向你的属主窗口的消息映射中添加下列形式的消息映射项，你可以在你的属主窗口中处理它们。
ON_NOTIFY(wNotifyCode, idControl,memberFxn)
wNotifyCode 通知消息标识符代码，例如 TBN_BEGINADJUST。 idControl 发送通知的控件的标识符。 memberFxn 将调用成员函数，当此接收通知。 您的成员函数是声明一个具有以下原型:
afx_msg void memberFxn( NMHDR* pNotifyStruct, LRESULT* result );
如果通知消息的处理函数返回一个值，则处理函数应该将这个值存放在由result指向的LRESULT中。
对每一个消息，pNotifyStruct指向一个NMHDR结构或一个TBNOTIFY结构。
这些结构被描述如下：NMHDR结构包含了下列成员：
typedef struct tagNMHDR
{
HWND hwndFrom; // 发送消息的控件的句柄
UINT idFrom; // 发送消息的控件的标识符
UINT code; // 通知代码，参见下面
} NMHDR;
备注：
hwndFrom 发送通知控件的窗口句柄。 若要将此处理为 CWnd 指针，请使用 CWnd::FromHandle。  idFrom 发送通知的控件的标识符。  code 通知代码。 
此成员可为值特定于某个控件类型，如 TBN_BEGINADJUST 或 TTN_NEEDTEXT，也可以是下面所列的一个常见通知值:  NM_CLICK：用户单击控件内的鼠标左键。
NM_DBLCLK： 用户双击了在控件内鼠标左键。 NM_KILLFOCUS： 控件失去输入焦点。 
，因为不可用，足够的内存NM_OUTOFMEMORY 控件无法完成操作。  NM_RCLICK： 用户单击控件内的鼠标右键。  NM_RDBLCLK： 用户双击了在控件内鼠标右键。 NM_RETURN：控件具有输入焦点，因此，用户按下了 enter 键。 NM_SETFOCUS： 控件接收输入焦点。 TBNOTIFY 结构包含以下成员: typedef struct { NMHDR hdr; // information common to all WM_NOTIFY messages int iItem; // index of button associated with notification TBBUTTON tbButton; // info about button associated withnotification int cchText; // count of characters in button text LPSTR lpszText;// address of button text } TBNOTIFY, FAR* LPTBNOTIFY;备注 ： hdr 信息共有的所有 WM_NOTIFY 消息。  iItem 按钮索引与通知。  tbButton 包含 有关工具栏按钮的信息的TBBUTTON 结构与该通知。  cchText 计数在按钮文本的字符。  lpszText 按文本的指针。
工具条发送下列信息：
TBN_BEGINADJUST 
发送到用户启动时自定义工具栏控件。 指针指向 NMHDR 包含有关该通知的信息的结构。 处理程序不需要返回任何特定值。 
TBN_BEGINDRAG
发送到用户开始拖动到工具栏控件的按钮。 指针指向 TBNOTIFY 结构。 iItem 成员包含所拖动的按钮的从零开始的索引。 处理程序不需要返回任何特定值。 TBN_CUSTHELP 
发送到用户何时选择在自定义工具栏 " 对话框的 " 帮助 " 按钮。 不返回值。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。 TBN_ENDADJUST 
发送到用户何时停止自定义工具栏控件。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。
TBN_ENDDRAG 
发送到用户何时停止拖动到工具栏控件的按钮。 指针指向 TBNOTIFY 结构。 iItem 成员包含所拖动的按钮的从零开始的索引。 处理程序不需要返回任何特定值。TBN_GETBUTTONINFO 
发送到用户在自定义一个工具栏控件。 工具栏使用此通知消息检索自定义工具栏 " 对话框需要的信息。 指针指向 TBNOTIFY 结构。 iItem 成员指定按钮的从零开始的索引。 pszText 和 cchText 成员在字符指定该地址和长度，，当前按钮文本。 应用程序应当由有关按钮的信息加载机制。 返回否则 TRUE ，如果按钮信息复制到了结构，或 FALSE 。
TBN_QUERYDELETE 
发送时，用户自定义工具栏按钮时确定是否可以从工具栏控件被删除。 指针指向 TBNOTIFY 结构。 iItem 成员包含要删除的按钮的从零开始的索引。 返回 TRUE 允许按钮删除或 FALSE 防止按钮被删除。TBN_QUERYINSERT 
发送时，用户自定义一个工具栏控件时确定按钮是否可以在特定按钮左侧插入。 指针指向 TBNOTIFY 结构。 iItem 成员包含要插入的按钮的从零开始的索引。 返回 TRUE 允许按钮在特定按钮或 FALSE 前面插入防止按钮插入。 ，当用户重置自定义工具栏 " 对话框的内容时，TBN_RESET 发送的。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。 ，在用户自定义一个工具栏控件之后，TBN_TOOLBARCHANGE 发送的。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。[1-3]