MFC中如何利用CToolBarCtrl创建工具条

  本文讲述了如何利用MFC的CToolBarCtrl 类,在对话框上创建工具条。

1 使用CToolBarCtrl的步骤

  CToolBarCtrl 对象包含若干重要的内部数据结构:按钮图像位图或图像列表的列表、按钮标签字符串的列表,以及将图像和/或字符串与按钮的位置、样式、状态和命令 ID 相关联的 TBBUTTON 结构列表。这些数据结构的每个元素都由从零开始的索引引用。在使用 CToolBarCtrl 对象之前,必须设置这些数据结构。字符串列表只能用于按钮标签;无法从工具栏检索字符串。
  CToolBarCtrl 的使用步骤如下:

  1. 构建CToolBarCtrl 对象
  2. 用Create方法创建一个Windows工具条控件,并将其绑定到这个CToolBarCtrl对象上。可以限定工具条的样式,例如TBSTYLE_TRANSPARENT 表示透明工具条,TBSTYLE_DROPDOWN 表示具有下拉列表功能的按钮。
  3. 确定按钮如何显示在工具条上:
    a. 若要将位图图像用于按钮,请通过调用 AddBitmap 将按钮位图添加到工具栏。
    b. 若要将图像列表中显示的图像用于按钮,请通过调用 SetImageList、SetHotImageList 或 SetDisabledImageList 来指定图像列表。
    c. 若要对按钮使用字符串标签,请通过调用 AddString 和/或 AddString 将字符串添加到工具栏。
  4. 通过AddButtons将按钮结构体添加到工具条对象上。
  5. 如果需要在不是 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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值