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 工具栏实现