00. 目录
01. 案例概述
多选效果就是指工具栏按钮有按下的效果,这种按钮再次按动时才能弹起,不具备自动弹起的功能。多选效果在应用软件中经常遇到,例如WORD软件中,文本是否具有粗体、斜线和下划线的效果,通过工具栏按钮的多选效果可以一目了然,给用户带来便捷。按钮效果如下图所示。
温馨提示
工具栏中的按钮与消息处理函数映射好之后才可以使用,否则是灰色的按钮。
02. 开发环境
系统环境:Windows 10
开发环境:Visual Studio 2019
03. 关键技术
同实现工具栏按钮单选效果的方法相同,多选效果任然通过类CToolBar的SetButtonInfo方法实现,只要将nStyle参数的取值设置为TBBS_CHECKBOX,工具栏上的按钮就具有多选效果了。
04. 程序设计
(1)新建一个基于单文档视图结构的应用程序。
(2)在CMainFrame类中声明一个CToolBar对象和CImageList对象。
protected: // 控件条嵌入成员
//CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
CToolBar m_ToolBar;
CImageList m_ImageList;
int m_PosY = 0;
(3)在CMainFrame类的OnCreate函数中创建工具栏,函数实现代码如下。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | CBRS_FLOATING
| WS_VISIBLE | CBRS_ALIGN_TOP | TBSTYLE_FLAT
))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
//创建图像列表
m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 0);
CString strPath;
HICON hIcon;
for (int i = 1; i < 10; i++)
{
strPath.Format(TEXT(".\\res\\toolbar\\%02d.ico"), i);
hIcon = (HICON)LoadImage(NULL, strPath, IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
m_ImageList.Add(hIcon);
}
//设置工具栏按钮
m_ToolBar.SetButtons(NULL, 9);
//设置工具栏按钮样式集资源ID
m_ToolBar.SetButtonInfo(0, ID_ADDDATA, TBBS_CHECKBOX, 0);
m_ToolBar.SetButtonText(0, TEXT("优化"));
m_ToolBar.SetButtonInfo(1, ID_UPDATEDATA, TBBS_CHECKBOX, 1);
m_ToolBar.SetButtonText(1, TEXT("调试"));
m_ToolBar.SetButtonInfo(2, ID_DELETEDATA, TBBS_CHECKBOX, 2);
m_ToolBar.SetButtonText(2, TEXT("平台"));
m_ToolBar.SetButtonInfo(3, ID_FIRSTDATA, TBBS_CHECKBOX, 3);
m_ToolBar.SetButtonText(3, TEXT("编码"));
m_ToolBar.SetButtonInfo(4, ID_PREVIOUSDATA, TBBS_CHECKBOX, 4);
m_ToolBar.SetButtonText(4, TEXT("语言"));
m_ToolBar.SetButtonInfo(5, ID_NEXTDATA, TBBS_CHECKBOX, 5);
m_ToolBar.SetButtonText(5, TEXT("移植"));
m_ToolBar.SetButtonInfo(6, ID_LASTDATA, TBBS_CHECKBOX, 6);
m_ToolBar.SetButtonText(6, TEXT("双核"));
m_ToolBar.SetButtonInfo(7, ID_SAVEDATA, TBBS_CHECKBOX, 7);
m_ToolBar.SetButtonText(7, TEXT("64位"));
m_ToolBar.SetButtonInfo(8, ID_CANCELDATA, TBBS_CHECKBOX, 8);
m_ToolBar.SetButtonText(8, TEXT("内存"));
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
//设置工具栏按钮大小
m_ToolBar.GetToolBarCtrl().SetButtonSize(CSize(60, 55));
m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);
m_PosY = 80;
return 0;
}
(4)设置工具栏按钮和处理函数映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND_RANGE(ID_ADDDATA, ID_ADDDATA + 9, OnMenuClick)
END_MESSAGE_MAP()
void CMainFrame::OnMenuClick(UINT nItemID)
{
CString str, strResult;
CDC* pDC = GetDC();
m_ToolBar.GetButtonText(nItemID - ID_ADDDATA, str);
strResult = TEXT("您选择了: " + str);
pDC->TextOutW(10, m_PosY, strResult);
m_PosY += 20;
}
05. 秘笈心法
复选按钮状态的记录
对于选中的复选按钮应使用布尔变量进行记录,每一个按钮对应一个布尔变量,最后通过对布尔变量的判断可以得到哪些按钮已经被按下,如果两个复选按钮不能同时按下,此时就可以进行判断。