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

news2024/11/28 2:50: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;
int x = 0;

2.5 重载OnInitDialog()函数

增加

if(x==0){
	m_child_imageList.Create(50,38,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[2];
	for(int i = 0 ; i < 1; i++){
		nArray[i] = 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);
}
CRect tempRect;
::GetWindowRect(AfxGetMainWnd()->m_hWnd, tempRect);
MoveWindow(tempRect.left, tempRect.top + 125, 600, 200, FALSE);

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)

2.8 实现窗口不能移动

声明OnNcLButtonDown()方法

afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);

实现OnNcLButtonDown()方法

if (HTCAPTION == nHitTest)
{
    return;
}
CDialog::OnNcLButtonDown(nHitTest, point);

增加消息映射

 ON_WM_NCLBUTTONDOWN()

3 带工具栏弹出窗口

3.1 导入CChildDlg

#include "ChildDlg.h"

3.2 声明自定义消息ID

#define MESSAGE_CAD WM_USER+100

3.3 重写WindowProc函数

if(message == MESSAGE_CAD){
	AfxMessageBox(_T("成功"));
}
return CDialogEx::WindowProc(message,wParam,lParam);

请添加图片描述

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

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);
CChildDlg dlg;
dlg.x = 0;
dlg.DoModal();

3.7 增加按钮消息映射宏

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);

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

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

相关文章

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4&#xff0c;在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

Jenkins-pipeline自动化构建Java应用

本实验操作需要&#xff1a;Jenkins&#xff0c;git代码仓库&#xff08;如gitlab&#xff0c;gitee等都可以&#xff09;&#xff0c;maven&#xff0c;docker&#xff0c;docker镜像仓库&#xff08;habor&#xff0c;nexus或者阿里云ACR等&#xff09;以及k8s环境。 前期准…

nginx特点以及安装

目录 1.特点 2.nginx和apache的区别 3.nginx应用场景 4.安装nginx 5. 更新nginx版本 6.总结 1.特点 高性能 轻量级web服务软件 稳定性高 系统自选消耗低 对http并发链接处理能力高 #处理并发连接能力 1.cup个数 2.本地服务器最大文件打开数 2.nginx和apache的区别 ng…

chatgpt赋能python:打包Python应用程序成deb包

打包Python应用程序成deb包 随着Python编程语言的不断发展&#xff0c;越来越多的开发者使用Python编写应用程序。然而&#xff0c;将Python程序打包并制作成deb包以进行安装可能仍然是一个难点。本文将介绍如何使用Debian打包工具&#xff0c;将Python应用程序制作成deb包。 …

chatgpt赋能python:Python扩展库介绍

Python扩展库介绍 Python是一种广泛使用的编程语言&#xff0c;它的易用性和可扩展性是许多开发者选择它的原因之一。这个语言有着丰富的扩展库&#xff0c;让开发者能够更加高效地编写代码。在这篇SEO文章中&#xff0c;我们将介绍几个与Python相关的扩展库。 NumPy NumPy是…

RPC远程调用

简介 PRC是一种调用方式而不是一种协议 在本地调用方式时由于方法在同一个内存空间&#xff0c;所以程序中可以直接调用该方法&#xff0c;但是浏览器端和服务端程序是不在一个内存空间的&#xff0c;需要使用网络来访问&#xff0c;就需要使用TCP或者UDP协议&#xff0c;由于…

使用frp工具实现内网穿透以及配置多个ssh和web服务

frp简介 FRP 项目地址 https://github.com/fatedier/frp/blob/master/README_zh.md frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 环境准备 ssh连接 1. 需要一台可以直接访问…

简要介绍 | 交叉熵损失:原理和研究现状

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对交叉熵损失进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 交叉熵损失&#xff1a;原理、研究现状与未来展望 Under…

Web3 是什么?为何应该关注?

当我开始我的职业生涯时&#xff0c;“Web2.0”还是一个热门的新事物。 当我开始我的职业生涯时&#xff0c;正值互联网快速发展的时期&#xff0c;人们谈论的是“Web2.0”&#xff0c;这一概念引发了许多关于用户参与、社交媒体和在线合作的讨论。然而&#xff0c;随着时间的推…

SQL优化--如何分析优化呢?

目录 一个SQL语句执行很慢, 如何分析&#xff1f; ​编辑 重要属性 possible_key key key_len Extra type 面试回答 框架 范例 例&#xff1a; 上面三种查询我们都可以通过执行计划找到查询慢的原因&#xff0c;并且提供解决方案 比如聚合查询可以新增临时表&…

【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】

Leetcode Leetcode -563.二叉树的坡度c Leetcode -563.二叉树的坡度 题目&#xff1a;给你一个二叉树的根节点 root &#xff0c;计算并返回 整个树 的坡度 。 一个树的 节点的坡度 定义即为&#xff0c;该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树…

leetcode数据库题第五弹

leetcode数据库题第五弹 1141. 查询近30天活跃用户数1148. 文章浏览 I1158. 市场分析 I1164. 指定日期的产品价格1174. 即时食物配送 II1179. 重新格式化部门表1193. 每月交易 I1204. 最后一个能进入电梯的人1211. 查询结果的质量和占比1251. 平均售价小结 1141. 查询近30天活跃…

chatgpt赋能python:Python打开文件目录:入门指南

Python打开文件目录&#xff1a;入门指南 打开文件目录是编程中常见的操作之一。Python 作为一种优秀的脚本语言&#xff0c;提供了众多的实用方法来操作文件系统。在本文中&#xff0c;我们将介绍如何使用 Python 打开文件目录&#xff0c;同时提供一些对 SEO 优化有帮助的技…

NodeJS 生成APIDOC⑩①

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言API 文档生成工具 APIDOC特点 APIDOC使用步骤0、 运行命令1、 安装插件3、 配置演示4、 ApidocJson配置文件5、效果图 总结 ✨文章有误请指正&#x…

Storm forming 风雨欲来 | 经济学人20230325版社论高质量双语精翻

本期精翻为2023年3月25日《经济学人》周报封面文章&#xff1a;《风雨欲来》&#xff08;Storm forming&#xff09;。 Storm forming 风雨欲来 As video games grow, they are eating the media 随着电子游戏的发展&#xff0c;它们正在蚕食媒体 The games business has lesso…

计算机网络概论

计算机网络概论 组成 客户端&#xff1a;就像蟹堡王的顾客一样。服务端&#xff1a;类似于蟹堡王的分店。路由器&#xff1a;扮演着转发分店的角色。网络协议&#xff1a;像转发表格一样帮助数据在网络中传输。 计算机网络基础 网络组成部分 主机&#xff1a;客户端和服务端…

AVL树原理以及插入代码讲解(插入操作画图~细节)

原理 AVL 树是一种平衡搜索二叉树&#xff0c;得名于其发明者的名字&#xff08; Adelson-Velskii 以及 Landis&#xff09;。&#xff08;可见名字长的好处&#xff0c;命名都能多占一个字母出来&#xff09;。在搜索树的前提下平衡搜索二叉树还定义如下&#xff1a; 左右子…

JVM知识点梳理

什么是JVM&#xff1f; JVM是java虚拟机的缩写 &#xff0c;也是java程式可以实现跨平台的关键。 JVM部分需要知道什么东西&#xff1f; JVM的结构和功能、参数配置、GC回收机制、GC回收器极其优缺点。 JVM结构&#xff08;栈&#xff0c;程序计数器&#xff0c;方法区&#xf…

0009-TIPS-SLAB入门与观察

极简&#xff0c;但是能快速上手 slub算法 这篇文章简洁直观&#xff0c;推荐 linux 内核 内存管理 slub算法 &#xff08;一&#xff09; 原理 感受slub堆漏洞 需要下载 https://github.com/De4dCr0w/green-dill &#xff0c;使用其中的测试程序做实验 UAF 如果看完上面链…

F407/103启动文件and启动过程

STM32 启动文件简介 STM32 启动文件由 ST 官方提供&#xff0c;在官方的固件包里。 startup_stm32f40_41xxx.s 启动文件由汇编编写&#xff0c;是系统上电复位后第一个执行的程序。 启动文件主要做了以下工作&#xff1a; 1 、初始化堆栈指针 SP _initial_sp 2 、初始…