MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏

news2024/11/24 16:22:19

自己在学习工具栏的时候,做的笔记
请添加图片描述

1 实现基本工具栏

1.1 在Dlg.h文件中声明变量和定义资源ID

#define ID_BUTTONS 501

CToolBar m_toolbar;  //工具栏
CImageList m_imageList;  //工具栏图片
CImageList m_hotImageList;  //工具栏热点图片
CReBar m_Rebar;  //可以在位图上显示子窗口口 用来显示背景
CString str;  //用于鼠标停留时的消息

1.2 在资源视图中导入Bitmap资源图片

请添加图片描述
可以在右击资源符号中查看具体ID值

请添加图片描述

1.3 在Dlg.cpp文件中的OnInitDialog()方法中导入Bitmap与按钮ID

//大小要一致
m_imageList.Create(70, 70, ILC_COLOR24 | ILC_MASK, 1, 1);
m_hotImageList.Create(70, 70, ILC_COLOR24 | ILC_MASK, 1, 1);

CBitmap bmp;

bmp.LoadBitmap(IDB_BITMAP2);
m_imageList.Add(&bmp, RGB(255, 255, 255));
bmp.DeleteObject();

bmp.LoadBitmap(IDB_BITMAP3);
m_hotImageList.Add(&bmp, RGB(255, 255, 255));
bmp.DeleteObject();

//按钮ID列表
UINT nArray[1];
nArray[0] = ID_BUTTONS;

m_toolbar.CreateEx(this);
m_toolbar.EnableToolTips();  //开启消息提示
m_toolbar.SetButtons(nArray,1); //注入按钮
m_toolbar.SetButtonText(0, _T("0")); //设置索引为0的按钮文本为"0"
m_toolbar.SetSizes(CSize(90, 90),CSize(80, 80)); //设置工具栏的大小 前一个CSize必须比后一个大!!!
m_toolbar.GetToolBarCtrl().SetImageList(&m_imageList); //设置图片列表
m_toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList); //设置热点图片列表
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST0,0); //自适应放置工具栏

1.4 开启鼠标停靠信息提示

先在Dlg.h中增加函数声明

BOOL OnDisplay(UINT id,NMHDR* pNMHDR,LRESULT* pResult);

再Dlg.cpp中实现

TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//获取工具栏按钮ID
UINT nIndex=m_toolbar.CommandToIndex(nID);//根据按钮ID获取索引
str.Format(_T("工具栏按钮%d"),nIndex);
pTTT->lpszText=str.GetBuffer(str.GetLength());//设置按钮提示信息
pTTT->hinst=AfxGetResourceHandle();
return TRUE;

增加消息映射宏开启提示

 ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnDisplay)

1.5 效果呈现

请添加图片描述
请添加图片描述

请添加图片描述

2 重绘窗口

2.1 新建一个Dialog资源

请添加图片描述

2.2 新建一个类继承CDialogEx

请添加图片描述

2.3 声明按钮资源ID宏和自定义消息ID

#define MESSAGE_CAD WM_USER+100
#define ID_CHILD_BUTTON_CAD 1001

2.4 声明工具栏和图片列表

CToolBar m_child_toolbar;
CImageList m_child_imageList;

2.5 声明WorkForCAD()函数并实现

void WorkForCAD();
m_child_imageList.Create(50,28,ILC_COLOR24 | ILC_MASK , 1, 1);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2);
m_child_imageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
UINT nArray[1];
for(int i = 0 ; i < 1; i++){
	nArray[1] = ID_CHILD_BUTTON_CAD + i;
}
m_child_toolbar.CreateEx(this);
m_child_toolbar.SetButtons(nArray,1);
m_child_toolbar.SetButtonText(0, _T("0"));
m_child_toolbar.SetSizes(CSize(80,80),CSize(70,70));
m_child_toolbar.GetToolBarCtrl().SetImageList(&m_child_imageList);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

2.6 增加按键消息声明并实现

void OnBnClickForCAD1();
CString s = _T("成功");
//向主界面发送MESSAGE_CAD消息
::PostMessage(AfxGetMainWnd()->m_hWnd , MESSAGE_CAD,(WPARAM)_T(""),(LPARAM)&s);

2.7 增加按键消息映射宏

ON_COMMAND(ID_CHILD_BUTTON_CAD,&CChildDlg::OnBnClickForCAD1)

3 带工具栏弹出窗口

3.1 导入CChildDlg

#include "ChildDlg.h"

3.2 声明线程函数并实现

friend UINT ThreadForCAD(LPVOID lpParameter);
CMyToolbarDlg* pDlg = (CMyToolbarDlg*)lpParameter;
CChildDlg* pTestDlg = new CChildDlg();
pTestDlg->Create(IDD_DIALOG1,NULL);
pTestDlg->SetWindowTextW((LPCTSTR)_T("0"));
pTestDlg->WorkForCAD();
pTestDlg->MoveWindow(680,420,600,200,FALSE);
pTestDlg->ShowWindow(SW_SHOW);
MSG msg = {0};
while(GetMessage(&msg,NULL,0,0)){
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

3.3 声明自定义消息ID

#define MESSAGE_CAD WM_USER+100

3.4 重写WindowProc函数

if(message == MESSAGE_CAD){
	AfxMessageBox(_T("成功"));
	//接收到消息后就发送关闭线程消息,将窗口关闭
	PostThreadMessage(m_thread->m_nThreadID,WM_QUIT,0,0);
}
return CDialogEx::WindowProc(message,wParam,lParam);

请添加图片描述

3.5 声明事件变量和线程变量

CEvent g_hEvent;
CWinThread* m_thread;

3.6 增加消息映射函数声明并实现

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);
SetEvent(g_hEvent);
if(m_thread==NULL){
	m_thread = AfxBeginThread(ThreadForCAD, (LPVOID)this,THREAD_PRIORITY_NORMAL,0 , NULL,NULL);
}
else{
	//如果上一个线程还没有关闭,则发送关闭线程消息,先将前一个窗口关闭,再生成新的窗口
	PostThreadMessage(m_thread->m_nThreadID,WM_QUIT,0,0);
	m_thread = AfxBeginThread(ThreadForCAD, (LPVOID)this,THREAD_PRIORITY_NORMAL,0 , NULL,NULL);
}
WaitForSingleObject(g_hEvent,INFINITE);
MSG msg;
while(::PeekMessageA(&msg, m_hWnd,WM_USER + 100, WM_USER +100,PM_REMOVE)){
	if(msg.message == MESSAGE_CAD){
		WindowProc(msg.message,msg.wParam,msg.lParam);
		break;
	}
}

3.7 增加按钮消息映射宏

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);

TIP:

  1. m_imageList创建的时候cx,cy参数很重要,图片列表add图片时,初始化设置大 ,加小图片会不显示,反之则显示不完全;
  2. m_toolbar.SetSizes(CSize(90,90),CSize(80,80)) 前一个CSize必须比后一个大,不然会报错;

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

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

相关文章

Jenkins安装以及部署

本文基于war包形式部署的 需要提前下载Jenkins的war包 Jenkins 的安装和设置下载内容 https://mirrors.jenkins.io/war 版本对应 目录 1.初始化环境 2.安装jdk 安装git Maven配置 安装Jenkins 使用DockerFile的方式进行部署 1.初始化环境 mkdir -p /home/soft 2.安装…

Python零基础入门(一)——Python简介与基础语法

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

智慧食堂如何建造?手把手教你

智慧食堂是现代科技与餐饮行业相结合的创新应用。随着技术的不断发展&#xff0c;许多企业和机构正积极采用智慧收银系统来改进食堂管理和收银流程。 引入智慧收银系统不仅可以提高企业食堂的运营效率&#xff0c;降低错误率&#xff0c;还能为企业带来更多的商机和竞争优势。 …

开源客户沟通平台Chatwoot

什么是 Chatwoot &#xff1f; Chatwoot 是一个开源客户沟通平台&#xff0c;可帮助公司在其网站、Facebook 页面、Twitter、Whatsapp、SMS、电子邮件等上吸引客户。 它是 Intercom、Zendesk、Salesforce Service Cloud 等的开源替代品。 很多网站的右侧或者右下角&#xff0c;…

中银国际在以太坊上发行代币化票据?三种可能,扑朔迷离!

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了一篇内参文章&#xff0c;《内参&#xff1a;对币本位高抛低吸策略的一点儿思考》&#xff08;次条&#xff09;&#xff0c;以及一篇原创文章《他提案将SEC主席Gary Gensler撤职》&#xff08;…

加速44%!RT-DETR量化无损压缩优秀实战

RT-DETR 模型是飞桨目标检测套件 PaddleDetection 最新发布的 SOTA 目标检测模型。其是一种基于 DETR 架构的端到端目标检测器&#xff0c;在速度和精度上均取得了 SOTA 性能。在实际部署中&#xff0c;为了追求“更准、更小、更快”的效率能力&#xff0c;本文使用飞桨模型压缩…

单元测试:构建可靠软件的关键步骤

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; 引言&#xff1a; 在当今快节奏的软件开发环境中&#xff0c;构建可靠的软件是至关重要的。单元测试作为软件开发过程中的关键步骤之一&#xff0c;能够帮助开发者发现…

006、体系结构之TiKV读取和Coprocessor

TiKV读取和Coprocessor 1、数据的读取1.1、ReadIndex Read1.2、Follower Read 协同处理器(Coprocessor) 1、数据的读取 1.1、ReadIndex Read 例如此时要读取 key 1 的内容&#xff0c;它不能直接去kv中读取&#xff0c;因为它是分布式的&#xff0c;它经过TiDB Server 收到读…

认识ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示&#xff0c;IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

机器学习笔记 - 基于深度学习的多种目标跟踪检测框架简述

一、 目标跟踪 对象跟踪是执行一组初始对象检测的任务,为每个初始检测创建唯一的 ID,然后在每个对象在视频中的帧中移动时跟踪它们,从而维护 ID 分配。最先进的方法涉及融合来自RGB和基于事件的相机的数据,以产生更可靠的对象跟踪。仅使用RGB图像作为输入的基于CNN的模型也…

【JUC基础】17. 并发编程常见问题

目录 1、前言 2、上下文切换问题 2.1、什么是上下文切换 2.2、上下文切换过程 2.3、上下文切换的原因 2.4、上下文切换的开销和影响 2.5、注意事项和改进策略 3、死锁问题 3.1、什么是死锁 3.2、死锁示例 3.3、改进策略 4、竞态条件 5、内存可见性 6、小结 1、前言…

Hinton:我对“青蛙”创造出“人”这件事的后果很紧张丨全文整理+视频

假如青蛙创造了人&#xff0c;那现在是青蛙控制人类&#xff0c;还是人类控制青蛙&#xff1f;我不知道如何防止这种情况发生。我老了&#xff0c;希望像你们这样年轻而才华横溢的研究人员弄清楚如何拥有这些超级智能&#xff0c;并使我们的生活在不受超级智能控制的情况下变得…

Servlet+jsp+Layui图书管理系统

项目介绍 介绍 使用到了jsp&#xff0c;servlet&#xff0c;Mysql&#xff0c;Java&#xff0c;layui。 大致功能 关于用户&#xff1a; 登录&#xff0c;申请注册&#xff0c;查看搜索图书&#xff0c;查看有关用户的借阅记录&#xff0c;丢失记录&#xff0c;预借记录。对…

详解3DMAX室内建筑效果图的制作渲染过程

如果你并不了解室内、建筑效果图的制作渲染过程,本文将可能对你有一些帮助。 ​什么是 3DMax 渲染? 渲染是利用3dmax软件创建与原始建筑设计或模型精确的 3D 图片的技术。最终效果图在逼真度、精度、细节和真实性方面准确地反映了真实材料和光线。具有经验和专业知识的室内…

Elastic 8.8 版引入了全新的 Learned Sparse Encoder 模型,并宣布正式推出合成监测

作者&#xff1a;Brian Bergholm 2023年5月25日 今天&#xff0c;我们非常高兴地宣布 Elastic 8.8 版正式发布。 新增功能 Elastic 企业搜索可帮助开发人员利用 Elasticsearch 实现强大的现代搜索和发现体验。 请在 “Elastic 企业搜索亮点” 博文或 8.8 版发行说明中&#…

HarmonyOS学习路之开发篇—Java UI框架(TableLayout)

TableLayout TableLayout使用表格的方式划分子组件。 支持的XML属性 TableLayout的共有XML属性继承自&#xff1a;Component TableLayout的自有XML属性见下表&#xff1a; 属性名称 中文描述 取值 取值说明 使用案例 alignment_type 对齐方式 align_edges 表示TableL…

AI实战营第二期 第八节 《MMSegmentation代码课》——笔记9

AI实战营第二期 第八节 《MMSegmentation代码课》 【课程链接】https://www.bilibili.com/video/BV1uh411T73q/ 【讲师介绍】张子豪 OpenMMLab算法工程师 【学习形式】录播社群答疑 【作业布置】本次课程为实战课&#xff0c;需提交笔记作业。 课程大纲&#xff1a; 环境配…

5--Gradle入门 - junit 的使用

5--Gradle入门 - junit 的使用 Gradle 对测试支持 测试任务自动检测并执行测试源集中的所有单元测试。测试执行完成后会生成一个报告。支持JUnit 和 TestNG 测试。 默认测试目录及标准输出 Junit 使用 Gradle 对于Junit4.x 支持 dependencies {testImplementation group: jun…

你们把我当领路人,而你们才是我最大的 “财富“

文章目录 前言一、追忆往昔二、关于编程语言三、算法的重要性四、我是学生&#xff0c;为什么要收我钱&#xff1f;五、视频教程 前言 看到星友的反馈&#xff0c;我觉得做这件事情是我有生以来&#xff0c;做的最正确的一次决策。你们把我当领路人&#xff0c;而实际上你们才是…

YOLOv5/v7 添加注意力机制,30多种模块分析④,CA模块,ECA模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、CA模块1、CA模块的原理2、实验结果3、应用示例 三、ECA模块1、ECA模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;…