本文讲述了如何利用MFC的CToolBarCtrl 类,在对话框上创建工具条。
1 使用CToolBarCtrl的步骤
CToolBarCtrl 对象包含若干重要的内部数据结构:按钮图像位图或图像列表的列表、按钮标签字符串的列表,以及将图像和/或字符串与按钮的位置、样式、状态和命令 ID 相关联的 TBBUTTON 结构列表。这些数据结构的每个元素都由从零开始的索引引用。在使用 CToolBarCtrl 对象之前,必须设置这些数据结构。字符串列表只能用于按钮标签;无法从工具栏检索字符串。
CToolBarCtrl 的使用步骤如下:
- 构建CToolBarCtrl 对象
- 用Create方法创建一个Windows工具条控件,并将其绑定到这个CToolBarCtrl对象上。可以限定工具条的样式,例如TBSTYLE_TRANSPARENT 表示透明工具条,TBSTYLE_DROPDOWN 表示具有下拉列表功能的按钮。
- 确定按钮如何显示在工具条上:
a. 若要将位图图像用于按钮,请通过调用 AddBitmap 将按钮位图添加到工具栏。
b. 若要将图像列表中显示的图像用于按钮,请通过调用 SetImageList、SetHotImageList 或 SetDisabledImageList 来指定图像列表。
c. 若要对按钮使用字符串标签,请通过调用 AddString 和/或 AddString 将字符串添加到工具栏。 - 通过AddButtons将按钮结构体添加到工具条对象上。
- 如果需要在不是 CFrameWnd类型的所有者窗口中显示工具栏按钮提示,则需要在工具栏的所有者窗口中处理TTN_NEEDTEXT消息。如果工具栏的父窗口派生自 CFrameWnd,则无需您执行任何额外操作即可显示工具提示,因为 CFrameWnd 提供了默认处理程序。
2 代码实现
创建一个MFC对话框工程,并在资源编辑器中添加工具条需要使用的位图(像素为32×16),将其ID设为IDB_TOOLBAR。
在对话框类中添加成员变量:
private:
CToolBarCtrl m_wndToolBar; //工具条控件类对象
CBitmap m_bmpToolBar; //位图
在对话框类中的OnInitDialog成员函数中添加以下代码
BOOL CAddToolBarNewDlg::OnInitDialog()
{
.......VS生成的代码省略
// TODO: 在此添加额外的初始化代码
UINT buttonID[] = { ID_SELECT_BORDER,ID_SELECT_INNER };
if (!m_wndToolBar.Create(WS_VISIBLE | WS_CHILD | CCS_BOTTOM | TBSTYLE_TOOLTIPS
| CCS_ADJUSTABLE, CRect(0, 0, 0, 0), this, IDB_TOOLBAR))
{
TRACE0("failed to create toolbar\n");
return -1;
}
const int iButtonNum = 2;
TBBUTTON *pIndex, *pRTF_Button = new TBBUTTON[iButtonNum];
pIndex = pRTF_Button;
for (long lIndex = 0; lIndex < iButtonNum; lIndex++)
{
memset(pIndex, NULL, sizeof(TBBUTTON));
pIndex->iBitmap = lIndex;
pIndex->idCommand = buttonID[lIndex];
pIndex->fsStyle = TBSTYLE_CHECKGROUP;
pIndex->fsState = TBSTATE_ENABLED;
pIndex++;
}
CSize size(16, 16);
m_wndToolBar.SetButtonSize(size);
m_wndToolBar.AddButtons(iButtonNum, pRTF_Button);
delete[] pRTF_Button;
m_wndToolBar.SetBitmapSize(size);
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT);
//请注意下面这句注释掉的代码,后文有解释
//m_wndToolBar.AddBitmap(2, IDB_TOOLBAR); //这种方式对24位位图无效
m_bmpToolBar.LoadBitmap(IDB_TOOLBAR); //这种方式对24位位图有效
m_wndToolBar.AddBitmap(iButtonNum, &m_bmpToolBar);
UpdateData(FALSE);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
这里特别要说明一点,在工具条对象m_wndToolBar加载位图时,有两种方式
int AddBitmap( int nNumButtons, UINT nBitmapID );
int AddBitmap( int nNumButtons, CBitmap* pBitmap );
第一种方式直接加载位图的资源ID,但是经过实验发现无法加载24位位图,猜测原因是方法本身不支持24位位图。所以,这里采取了迂回的方式解决了,首先用CBitmap对象加载24位位图,然后调用AddBitmap方法的第二种形式加载位图对象,由于位图对象需要在工具条显示的周期内都存在,所以位图对象是类的成员变量。
m_bmpToolBar.LoadBitmap(IDB_TOOLBAR);
m_wndToolBar.AddBitmap(iButtonNum, &m_bmpToolBar);