MFC工具栏CToolBar从专家到小白

CToolBar m_wndTool;
//创建控件
m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC);
//加载工具栏资源
m_wndTool.LoadToolBar(IDR_TOOL_LOAD)  //在.rc中定义:IDR_TOOL_LOAD	BITMAP	"res\\tool_load.bmp"

//工具栏中单个按钮的样式、大小
CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);

//设置按钮文字
SetButtonText();

//设置样式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));
DWORD olddwStyle = dwStyle;
DWORD tempStyle  = dwStyle;
tempStyle |= TBSTYLE_CHECK;  //支持复选框行为。常用于选中状态切换,如点击后保持按下(选中)状态,再次点击时恢复原状。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);

//删除控件
m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR_3));

//隐藏控件
m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR_4, TRUE);

//显示工具栏控件
m_wndTool.ShowWindow(SW_SHOW);
//重新定位和调整工具栏和其他控件栏的大小
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

创建控件CToolBar::CreateEx()

virtual BOOL CreateEx(
    CWnd* pParentWnd,
    DWORD dwCtrlStyle = TBSTYLE_FLAT,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
    CRect rcBorders = CRect(0, 0, 0, 0),
    UINT nID = AFX_IDW_TOOLBAR);

CWnd* pParentWnd:父窗口的指针。
DWORD dwCtrlStyle:工具栏控件的样式。
DWORD dwStyle:窗口的扩展样式。这些样式来自Windows SDK,定义了窗口的行为和外观。
CRect rcBorders:工具栏边框的尺寸。
UINT nID:工具栏的ID。AFX_IDW_TOOLBAR是MFC预定义的一个ID,用于默认的工具栏。

CToolBar 类
工具栏控件和按钮样式

加载工具栏资源

1.在资源文件中增加Toolbar资源文件
在这里插入图片描述

2.在.rc文件中定义资源路径映射

IDR_TOOL_1	BITMAP	"res\\tool_1.bmp"

3.加载资源

m_wndTool.LoadToolBar(IDR_TOOL_LOAD)

设置按钮大小

CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);

获取按钮个数GetButtonCount()

int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();

设置、获取按钮信息GetButtonInfo()

//设置。TBBS_BUTTON:标准按键
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_1, TBBS_BUTTON, 0);

//获取
UINT nID, nStyle;
int nImage;
m_wndTool.GetButtonInfo(i, nID, nStyle, nImage); 

按钮类型

工具栏控件样式

设置按钮文字

/**加载语言文件**/
int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();
UINT nID, nStyle;
int nImage;
for (int i = 0; i < nCount; i++)
{
    m_wndTool.GetButtonInfo(i, nID, nStyle, nImage);  //获取按钮信息nID,用于关联语言文件
    sLoader = tr(nID);  //从语言文件加载
    m_wndTool.SetButtonText(i, sLoader);
}
/**绘制文字到按钮上**/
CImageList*	cImageList = NULL;
cImageList = m_ImgList;

CBitmap		cBitmap;
BITMAP		bmBitmap;
if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_TOOL_1), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) ||
    !cBitmap.GetBitmap(&bmBitmap))  //附加图片资源
	return FALSE;

//按钮图片上输出文本
CDC  memDc;
CDC* pDC = GetDC();
memDc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap;
pOldBitmap = memDc.SelectObject(&cBitmap);
memDc.SetBkMode(TRANSPARENT);
memDc.SetTextColor(RGB(0,0,0));

CRect rcButton(0, 32, 0, 32 + nBtnWidth);
int nCount = GetToolBarCtrl().GetButtonCount();
int i;
CString sText;
UINT nID, nStyle;;
int nImage;
for ( i = 0; i < nCount; i++)
{
	GetButtonInfo(i, nID, nStyle, nImage);
	GetButtonText(i, sText);
	rcButton.left	= i*nBtnWidth;
	rcButton.right	= (i+1)*nBtnWidth;
	memDc.DrawText(sText, rcButton, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
memDc.SelectObject(pOldBitmap);
memDc.DeleteDC();
ReleaseDC(pDC);

BOOL bFlag = FALSE;
if ( cImageList )
{
	cImageList->DeleteImageList();
	delete cImageList;
	bFlag = TRUE;
}
//按钮图片上输出文本
CSize		cSize(bmBitmap.bmWidth, bmBitmap.bmHeight); 
int			nNbBtn	= cSize.cx/nBtnWidth;
RGBTRIPLE*	rgb		= (RGBTRIPLE*)(bmBitmap.bmBits);
COLORREF	rgbMask	= RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue);
cImageList = new CImageList;
m_ImgList = cImageList;
if (!cImageList->Create(nBtnWidth, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 0))  //创建多个图标区
	return FALSE;

if (cImageList->Add(&cBitmap, rgbMask) == -1)  //将位图分割为多个图标并添加到图像
	return FALSE;
SendMessage(TB_SETIMAGELIST, 0, (LPARAM)cImageList->m_hImageList);  //向工具栏控件发送消息,设置新的图像列表。
cBitmap.DeleteObject();
cBitmap.Detach();

cImageList->Add(&cBitmap, rgbMask):图像列表会根据初始化时指定的图标尺寸(nBtnWidth x cSize.cy),​从左到右依次切割位图,每个子区域作为一个图标添加到列表中。

工具栏用途

TB_SETIMAGELIST:设置工具栏用于显示处于默认状态的按钮的图像列表。
TB_SETHOTIMAGELIST:设置工具栏控件将用于显示热按钮的图像列表
TB_SETDISABLEDIMAGELIST:设置工具栏控件将用于显示禁用的按钮的图像列表。

TB_SETIMAGELIST 消息

按钮样式设置

//获取按钮样式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));

//设置按钮样式
DWORD olddwStyle = dwStyle;
DWORD tempStyle  = dwStyle;
tempStyle |= TBSTYLE_CHECK;  //支持复选框行为。常用于选中状态切换,如点击后保持按下(选中)状态,再次点击时恢复原状。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);

RepositionBars()

重新定位和调整工具栏和其他控件栏的大小。

RepositionBars的用法和参数的意义
MFC状态栏之RepositionBars

隐藏控件

m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR, TRUE);

禁用控件

m_wndTool.GetToolBarCtrl().EnableButton(IDS_TOOLBAR, FALSE);

删除控件

m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR));

设置按钮状态

DWORD dwState = m_wndTool.GetToolBarCtrl().GetState(IDS_TOOLBAR_1);
m_wndTool.GetToolBarCtrl().SetState(IDS_TOOLBAR_2, dwState);

绑定按钮的点击事件

m_wndTool.SetButtons(NULL, 3);  //设置按钮数量
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_0, TBBS_BUTTON, 0);
m_wndTool.SetButtonInfo(1, IDS_TOOLBAR_1, TBBS_BUTTON, 1);
m_wndTool.SetButtonInfo(2, IDS_TOOLBAR_2, TBBS_BUTTON, 2);
m_wndTool.Invalidate();  //强制刷新

MFC 工具栏实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值