00. 目录

 

 

01. 案例概述

多选效果就是指工具栏按钮有按下的效果,这种按钮再次按动时才能弹起,不具备自动弹起的功能。多选效果在应用软件中经常遇到,例如WORD软件中,文本是否具有粗体、斜线和下划线的效果,通过工具栏按钮的多选效果可以一目了然,给用户带来便捷。按钮效果如下图所示。

【MFC】工具栏按钮多选效果本_多选按钮

温馨提示

工具栏中的按钮与消息处理函数映射好之后才可以使用,否则是灰色的按钮。

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. 秘笈心法

复选按钮状态的记录

对于选中的复选按钮应使用布尔变量进行记录,每一个按钮对应一个布尔变量,最后通过对布尔变量的判断可以得到哪些按钮已经被按下,如果两个复选按钮不能同时按下,此时就可以进行判断。