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.mzph.cn/bicheng/76262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识 引言 在当今的微服务架构中&#xff0c;分布式事务处理和性能优化是面试中经常被问及的高频话题。随着系统规模的扩大&#xff0c;如何保证数据一致性和系统性能成为了开发者…

【动态规划】 深入动态规划—两个数组的dp问题

文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开&#xff0c;旨在通过对这两个数组元素间关系的分析&#xff0c;找出…

【C++面向对象】封装(上):探寻构造函数的幽微之境

每文一诗 &#x1f4aa;&#x1f3fc; 我本将心向明月&#xff0c;奈何明月照沟渠 —— 元/高明《琵琶记》 译文&#xff1a;我本是以真诚的心来对待你&#xff0c;就像明月一样纯洁无瑕&#xff1b;然而&#xff0c;你却像沟渠里的污水一样&#xff0c;对这份心意无动于衷&a…

JavaScript性能优化(下)

1. 使用适当的算法和逻辑 JavaScript性能优化是一个复杂而重要的话题&#xff0c;尤其是在构建大型应用时。通过使用适当的算法和逻辑&#xff0c;可以显著提高代码的效率和响应速度。以下是一些关键策略和实践&#xff0c;用于优化JavaScript性能&#xff1a; 1.1. 采用适当…

蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造

张冯君&#xff08;远远&#xff09; Koupleless PMC 蚂蚁集团技术工程师 就职于蚂蚁集团中间件团队&#xff0c;参与维护与建设蚂蚁 SOFAArk 和 Koupleless 开源项目、内部 SOFAServerless 产品的研发和实践。 本文 3488 字&#xff0c;预计阅读 11 分钟 业务背景 基于开源 A…

使用pycharm社区版调试DIFY后端python代码

目录 背景 前置条件 DIFY使用的框架 API服务调试配置步骤&#xff08;基于tag为0.15.3的版本&#xff09; 1.配置.env文件 2.关闭docker里面的docker-api-1服务 3.使用DOCKER启动本地环境需要用到的中间件&#xff0c;并暴露端口 注意事项一&#xff1a; 注意事项二&#xff1a…

从 macos 切换到 windows 上安装的工具类软件

起因 用了很多年的macos, 已经习惯了macos上的操作, 期望能在windows上获得类似的体验, 于是花了一些时间来找windows上相对应的软件. 截图软件 snipaste​​​​​​ windows和macos都有的软件, 截图非常好用 文件同步软件 oneDrive: 尝试了不同的同步软件, 还是微软在各…

MySQL体系架构(一)

1.1.MySQL的分支与变种 MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。 1.1.1.Drizzle Drizzle是真正的M…

【项目实训项目博客】prompt初版实践

通过对camel技术的理解&#xff0c;我们向其中添加了市场营销角色的prompt 初版设计如下&#xff1a; chatchainconfig.json { "chain": [ { "phase": "DemandAnalysis", "phaseType": "SimplePhase", "max_turn_step…

[Bond的杂货铺] CKS 证书也到货咯

最近比较忙&#xff0c;忘记写Blog了&#xff1a;&#xff09; 一年前黑五去官网蹲了一手Cyber Monday&#xff0c;买了英文考试券bundle&#xff0c;当时只考了cka,后来cks差点都忘记了。将近一年后&#xff0c;无意中收到官方的提醒邮件&#xff0c;说考试券本已过期&#x…

【回眸】Linux 内核 (十五) 之 多线程编程 上

前言 进程和线程 区别 线程API 1.创建线程 2.线程退出 3.线程等待 4.线程脱离 5. 线程ID获取及比较 6.创建及销毁互斥锁 7.创建及销毁条件变量 8. 等待 9.触发 多线程编程 后记 前言 高产的几天。 进程和线程 区别 进程——资源分配的最小单位&#xff0c;线…

127.0.0.1本地环回地址(Loopback Address)

127.0.0.1 是计算机网络中的一个特殊IPv4地址&#xff0c;称为本地环回地址&#xff08;Loopback Address&#xff09;&#xff0c;主要用于以下用途&#xff1a; 1. 基本定义 本地主机&#xff08;Localhost&#xff09;&#xff1a;该地址始终指向当前正在使用的计算机本身&a…

S7-1200 PLC热电偶和热电阻模拟量模块

热电偶和热电阻模拟量模块 S7-1200 PLC有专用用于对温度进行采集的热电偶模块SM1231 TC和SM 1231RTD。热电偶模块有4AI和8AI两种&#xff0c;下面以SM1231 TC 4AI为例看一下接线图。 该模块一共有4个通道&#xff0c;每个通道有两个接线端子&#xff0c;比如0&#xff0c;0-。…

深度了解向量引论

今天去研究了一个基本数学原理 这个其实需要证明 今天推导了一下这个公式&#xff0c;感觉收获挺大 下面是手工推导过程

Feign修仙指南:声明式HTTP请求的优雅之道

各位在微服务世界摸爬滚打的道友们&#xff01;今天要解锁的是Spring Cloud的绝世神通——Feign&#xff01;这货堪称HTTP界的"言出法随"&#xff0c;只需定义接口&#xff0c;就能自动生成HTTP请求代码&#xff01;从此告别手动拼装URL的苦日子&#xff0c;让你的代…

UDP学习笔记(四)UDP 为什么大小不能超过 64KB?

&#x1f310; UDP 为什么大小不能超过 64KB&#xff1f;TCP 有这个限制吗&#xff1f; 在进行网络编程或者调试网络协议时&#xff0c;我们常常会看到一个说法&#xff1a; “UDP 最大只能发送 64KB 数据。” 这到底是怎么回事&#xff1f;这 64KB 是怎么来的&#xff1f;TCP…

LabVIEW 中串口设备与采集卡的同步精度

在 LabVIEW 项目开发中&#xff0c;常涉及多种设备协同工作&#xff0c;如通过串口设备采集温度&#xff0c;利用采集卡&#xff08;如 NI 6251&#xff09;采集压力。此时&#xff0c;设备间的同步精度至关重要&#xff0c;它直接影响系统数据的准确性与可靠性。下面&#xff…

DP_AUX辅助通道介绍

DisplayPort&#xff08;简称DP&#xff09;是一个由PC及芯片制造商联盟开发&#xff0c;视频电子标准协会&#xff08;VESA&#xff09;标准化的数字式视频接口标准。该接口免认证、免授权金&#xff0c;主要用于视频源与显示器等设备的连接&#xff0c;并也支持携带音频、USB…

[GESP202312 五级] 平均分配

文章目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 提交链接提示解析参考代码 题目描述 小杨认为&#xff0c;所有大于等于 a a a 的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运…

[Mysql]buffersize修改

1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld