当前位置: 首页 > news >正文

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/120294.html

相关文章:

  • Springboot框架—单元测试操作
  • 【MATLAB例程】基于鲁棒卡尔曼滤波的弹性状态估计与欺骗攻击检测
  • Github 热点项目 ChartDB AI自动导表结构+迁移脚本,3分钟生成专业数据库关系图
  • 【安全】Web渗透测试(全流程)_渗透测试学习流程图
  • NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)
  • PG数据库中级证书含金量高吗
  • 鸿蒙NEXT开发资源工具类(ArkTs)
  • PHP+Vue 3实现增删改查(CRUD)
  • 网络安全小知识课堂(十二)
  • Java:学习进阶之路
  • 使用 JSON Schema 实现语言模型的结构化输出:跨平台实践指南
  • git clone(复制)下载
  • Nginx 499 错误的原因及解决方法
  • OpenCV--模板匹配
  • 使用Docker Desktop进行本地打包和推送
  • Kafka分区机制详解:原理、策略与应用
  • Docker+Jenkins+Gitee自动化项目部署
  • 详解 Redis repl_backlog_buffer(如何判断增量同步)
  • 2025年智能 ITSM产品推荐
  • Elasticsearch | ES索引模板、索引和索引别名的创建与管理
  • “图生生”AI生图优化升级,DeepSeek加持体验更优!
  • SAN及其ZONE
  • 【kind管理脚本-2】脚本使用说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本
  • JavaScript学习教程,从入门到精通,JavaScript 数据类型详解(7)
  • 《AI开发工具和技能实战》专栏规划:从工具到应用的全链路指南
  • IntelliJ IDEA使用技巧(json字符串格式化)
  • vue3+vue-router4的安装使用以及路由守卫
  • Android audio(2)-audioservice
  • 蓝桥杯-卡片
  • android wifi 连接流程(framework)