对话框与子窗口控件(写给大忙人看的快速复习掌握)

news2024/11/25 14:41:43

对话框与子窗口控件(写给大忙人看的快速复习掌握)

    • 1、对话框的概念
    • 2、控件的概念
      • 我更喜欢称控件为预定义的窗口类
    • 3、我们一步一步写代码熟悉常用的预定义的窗口类
      • 3.1 什么叫模板呢?
      • 3.2 什么是资源文件
    • 4、消息处理函数(有这么几个消息比较重要)
      • 4.1 对于对话框里面到底是返回TRUE好呢还是返回FALSE呢?
      • 4.2 什么叫ID号呢?
        • ID号有什么作用呢?ID号本质是啥呢?
    • 5、讲解子窗口的WM_COMMAND消息的原理
      • 5.1 原理
      • 5.2 关于VC6静态文本的一个BUG


1、对话框的概念

在这里插入图片描述
模态对话框就是这个对话框你给它打开了,你要先把它给关闭你才能干其他事,不然这个对话框一直在这挡着你,不让你干其他事;
非模态对话框正好跟模态对话框相反,就是你给它打开了你也可以干其他事,你也可以在上面点来点去的,它不影响你使用其它的。

例如:
非模态对话框就是那种我们在word上按Ctrl+F弹出的查找对话框,你可以点击该查找对话框后面的页面编辑文字,也可以随时点击该查找对话框搜索内容。
模态对话框就是那种我们在word上按Ctrl+O弹出的打开对话框,鼠标点这个对话框后面的东西点不动(会发出声音提醒),你非得把它关闭了才会允许你干其他事(编辑文字)。


2、控件的概念

在这里插入图片描述

我更喜欢称控件为预定义的窗口类

我不喜欢控件这个词,因为控件这个概念有点抽象,很容易让人摸不到头脑(控件到底是什么东西,它跟窗口有什么关系呢?),我更喜欢叫它预定义的窗口类。
大家还记得么,我们在Windows 程序设计应用开发(上部) 第四章 windowsSDK编程给大家写的精简的windows窗口程序的时候,里面有一个窗口类,你先定义个WNDCLASS那个类之后,注册一下,然后你在后面调用CreateWindow创建窗口的时候,你根本就没有用WNDCLASS那个类的变量的相关东西,你只是在CreateWindow的第一个参数里面提供了一个类名。

在这里插入图片描述
在这里插入图片描述
从上面MSDN的介绍中我们可以看到:
CreateWindow函数的第一个参数是个字符串,即类名。

在这里插入图片描述
WNDCLASS最后一个成员也是这个类名,当时说了用RegisterClass跟操作系统注册一下这个类名,注册之后这个类名就被操作系统给保存起来了,然后你通过CreateWindow传入这个类名给第一个参数的时候,操作系统就知道你需要使用的是哪个类了;

这个类有什么作用呢?
我们可以根据这个类找到它的窗口回调函数、以及其他相关的内容(如窗口背景颜色等信息)。

总之,预定义的窗口类(控件)就是已经把WNDCLASS结构体做好了,它也跟操作系统注册过了,你直接用就可以了,同时预定义的窗口类也提供了窗口回调函数,我们只要直接用它就行了。

3、我们一步一步写代码熟悉常用的预定义的窗口类

1、建一个空的Win32 Application项目

在这里插入图片描述
在这里插入图片描述
我们注意到调用的DialogBox函数的第4个参数也是一个回调函数,跟我们之前的WNDCLASS里面的窗口回调函数是一个意思。

DialogBox:从对话框模板资源创建模式对话框。 在指定的回调函数通过调用 EndDialog 函数终止模式对话框之前,DialogBox 不会返回控件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们复制该回调函数的定义到我们的代码中:

在这里插入图片描述
此时还差一个东西,DialogBox函数的第二个参数:对话框模板资源。

3.1 什么叫模板呢?

给我们的win32程序插入一个对话框:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个就是模板,模板有个好处就是,所见即所得。
我们可以把这个模板保存为资源脚本Script1.rc:

在这里插入图片描述
在这里插入图片描述
然后把头文件resource.h给添加进来,再把资源文件Script1.rc给添加进来。
(注意,这是VC6的情况,如果是新的VS版本,会自动生成resource.h和相应的.rc资源文件)

在这里插入图片描述
我们看到Dialog第二个参数,要通过MAKEINTRESOURCE宏进行转换,这是为什么呢?我们看MSDN的解释:

第二个参数[in] lpTemplate,类型: LPCTSTR。
对话框模板。 此参数是指向指定对话框模板名称的以空字符结尾的字符串的指针,或者是指定对话框模板的资源标识符的整数值。 如果参数指定了资源标识符,则其高位字必须为零,其低位字必须包含该标识符。 你可以使用 MAKEINTRESOURCE 宏来创建此值。

也就是说,此时需要将新建的对话框模板的ID号通过MAKEINTRESOURCE宏进行转换。
我们复制该对话框模板的ID号以便进行转换:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译运行效果如上图,我们发现还有很多问题,显示不正常,还有就是只能通过任务管理器强制关闭该对话框等问题。

3.2 什么是资源文件

我们打开Script1.rc资源脚本文件:

在这里插入图片描述
DialogBox根据ID号(IDD_DIALOG1)拿到这个资源文件,进行解析。

在这里插入图片描述
通过这个资源文件我们可以看到,这个对话框的坐标、长宽、这个对话框窗口的类型、标题、字体,以及两个按钮(一个OK、一个Cancel),这个DialogBox函数会自动解析这个文本,然后根据这个文本把这个窗口给创建出来。

在这里插入图片描述
VC6解析该资源文件为图形方式的效果如上图所示。

4、消息处理函数(有这么几个消息比较重要)

WM_INITIDIALOG(对话框初始化消息)
这个消息就是对话框已经创建出来了,但是还没有显示出来,你可以在对话框里面做一些初始化的动作,比如说设置一些文本的信息,设置一些初始化的选项等等。

WM_COMMAND(命令消息)
命令消息里面又对按钮进行划分(例如IDOK、IDCANCEL)

在这里插入图片描述

4.1 对于对话框里面到底是返回TRUE好呢还是返回FALSE呢?

如果这个消息你已经处理了,那你就返回TRUE,操作系统一看这个消息已经处理了就不需要动它了;
如果返回FALSE表示这个消息你并没有处理,那么操作系统就会帮你处理。

4.2 什么叫ID号呢?

在这里插入图片描述
这个对话框有一个ID号,这个按钮控件也是个窗口,它也有一个ID号。

ID号有什么作用呢?ID号本质是啥呢?

ID就是窗口唯一的标识,它就是一个整型的数字。
我们打开resource.h文件:

在这里插入图片描述
该文件中没有OK和CANCEL两个按钮,因为这两个按钮是在插入Dialog对话框的时候,对话框默认的。
此时你可以将这两个默认按钮删除,自己在拖放上两个按钮,如下图:

在这里插入图片描述
保存后resource.h就有这两个新放上去的按钮了:

在这里插入图片描述
我们给这两个按钮起有意义的ID号和标题:

在这里插入图片描述
在这里插入图片描述
修改回调函数,对这两个按钮的点击事件进行处理:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时点右上角的X是退不了的,只能点退出按钮正确关闭该对话框,那么现在就想通过X这个关闭按钮来关,怎么办呢?
添加WM_CLOSE消息的处理代码即可:

在这里插入图片描述
在这里插入图片描述
不想让该对话框一直显示在左上角,可以在对话框属性里面设置坐标X Pos和Y Pos即可。

5、讲解子窗口的WM_COMMAND消息的原理

在这里插入图片描述

5.1 原理

按钮也是一个窗口,我用鼠标点击它的时候,它的窗口回调函数会被调用,因为按钮是预定义的窗口类,预定义的窗口类里面已经把窗口回调函数全部设置好了,我鼠标在按钮上面点的时候,操作系统肯定会调用按钮的回调函数,它的回调函数很简单,就是给按钮的父窗口(是上图中的标题为Dialog的窗口)发送一个命令消息WM_COMMAND消息。
父窗口Dialog拿到WM_COMMAND消息后,它是怎么区分显示标题和退出这两个按钮发来的消息呢?
就是靠父窗口回调函数中的wParam参数,wParam参数低2个字节就可以区分各个子窗口按钮,wParam参数低2个字节就是子窗口按钮的ID号

5.2 关于VC6静态文本的一个BUG

我们再添加一个按钮和静态控件(用来显示一些文本):

在这里插入图片描述
在这里插入图片描述
设置静态控件的字体居中显示:

在这里插入图片描述
修改新增按钮的ID和标题:

在这里插入图片描述
为了设置静态文本框的内容,怎么获得静态文本框的句柄呢?
我们可以通过GetDlgItem函数传入静态文本框的ID号,就可以获得它的句柄,但是我们也可以一步到位,直接通过SetDlgItemText函数设置该控件的文本内容:

在这里插入图片描述
但是此时点击修改内容按钮,静态文本框内容没变化,为什么不显示呢?下个断点,单步调试找原因,也没发现问题所在,怎么回事呢?
我们换一种方式来设置试试:

在这里插入图片描述
我们发现还是不行,到底是怎么回事呢?你们以后也可能会遇到这种问题。
再拖一个Static控件放上去,并修改它的ID为ID_STATICWND

在这里插入图片描述
在这里插入图片描述
重新编译运行程序,这个新增的控件IDC_STATICWND上面的文本就正常显示了;我们再换回SetDlgItemText函数设置这个新放置上去的Static控件里的内容也没有问题。

为了查找此问题的原因,我们查看resource.h头文件:

在这里插入图片描述
我们发现此ID的值竟然是-1。
我们再拖放上去一个Static控件,再查看resource.h头文件以进行对比分析:

在这里插入图片描述
我们发现没有变化,通过这些操作我想表达的是:
什么叫静态控件,就是只显示文本,不参与你们任何的动作,你开始把它的文本内容设定好了,那么你为什么还要修改它呢,你就不要再改它了,它就是这么一个目的。

在这里插入图片描述
它不需要被改变,所以我们这里的几个Static控件的ID就都给弄成一样的了,ID都是IDC_TEXTSHOW。
(注意,这里的问题也是VC6的BUG,在新版的VS中已经解决了,不管你复制static控件还是拖进新的static控件,它们的ID会自动增加)
你如果想让该Static控件显示文本的话,很简单,如下面所做:

在这里插入图片描述
在这里插入图片描述
先把它的ID给删了不要它,然后自己给它起个新的ID:

在这里插入图片描述
在这里插入图片描述
这个问题是一大巨坑!微软这样做是别有用意的,就是上面所说的目的(它不需要被改变,所以这里的几个Static控件的ID就都给弄成一样的了)。

在这里插入图片描述

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

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

相关文章

护眼灯哪些牌子好?2023护眼灯品牌推荐

护眼灯就是保护眼睛的,很多人长时间工作和学习,主要还是光的刺激和错误的坐姿,会引起眼睛的近视,导致视觉疲劳的主要原因就是灯光的频闪,而护眼灯就能很好减少频闪。 特别是青少年们的视力发育为成熟,视力…

使用Sentieon加速甲基化WGBS数据分析

全基因组甲基化测序(WGBS)是一种研究DNA甲基化的方法,以全面了解在基因组水平上的表观遗传变化。在进行WGBS数据分析时,通常需要使用专门的比对工具,因为这些工具需要能够处理亚硫酸盐转化后的数据。 以下是四个不同的WGBS比对分析流程&…

ADIDAS阿里纳斯励志广告语

系列文章目录 精选优美英文短文1——Dear Basketball(亲爱的篮球)精选优美英文短文2——Here’s to the Crazy Ones(致疯狂的人)“我祝你不幸并痛苦”——约翰罗伯茨毕业致辞“亲爱的波特兰——CJ麦科勒姆告别信” Hi, I’m Gilb…

七、Django进阶:第三方库Django-extensions的开发使用技巧详解(附源码)

Django-extensions是 Django 的扩展应用,给django开发者提供了许多便捷的扩展工具(extensions),它提供了许多有用的工具和命令行工具,帮助 Django 开发者更高效地进行开发和调试。它的作用包括: - 提供了更多的Django命令&#x…

循环依赖详解及解决方案

介绍 上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办法完整创建造成失败. 循环依赖代码演示 public class Demo {public static void main(String[] args) {new Demo1();} }class Demo1…

电子信息工程有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是电子信息工程领域的一些SCI期刊推荐: IEEE Transactions on Information Theory: 该期刊由IEEE出版,专注于信息理论领域的研究,包括编码理论、信道编码、信息传输、信息论应用等方面的研究。 IEEE Transactions on Signal…

Apache网页与安全优化

系列文章目录 文章目录系列文章目录一、1.构建虚拟web主机2.一、基于域名的虚拟主机二、Apache 日志分割1.三、Apache的网页优化总结一、 1.构建虚拟web主机 虚拟Web主机指的是在同一台服务器中运行多个Web站点,其中每一个站点实际上并不独立占用整个服务器&#…

天选姬 - 桌面宠物

天选姬 - 桌面宠物前言下载使用更新设置右键菜单人机交互系统状态闹钟壁纸前言 桌面宠物顾名思义指在电脑桌面的宠物,可以是各种动物或Q版人物。可以进行交互并拥有各种各样的功能,本文介绍一款适用于各种电脑的桌面宠物,天选姬,…

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存血崩) Redis两种持久化方案详情对比(RDB、AOF)

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存血崩) & Redis两种持久化方案详情对比(RDB、AOF)1)Redis 面试题1.1.高频面试题:缓存穿透、缓存击穿、缓存血崩1.2.低频面试题&a…

电脑0X000000D1蓝屏错误U盘重新安装系统教学

电脑0X000000D1蓝屏错误U盘重新安装系统教学。最近有用户遇到了电脑桌面变成了0X000000D1错误代码的蓝屏界面了,无法继续操作使用。那么这个问题怎么去进行系统U盘重装呢?来看看以下的详细解决方法吧。 准备工作: 1、U盘一个(尽量…

智慧城市我国发展现状怎样?

智慧城市从概念提出到落地实践,历经十多年的建设与发展,我国智慧城市建设数量持续增长。我国智慧城市整体建设和发展情况总结如下。 北京智汇云舟科技有限公司成立于2012年,专注于创新性的“视频孪生(实时实景数字孪生)”技术研发与应用。目前…

江南爱窗帘十大品牌,怎么合理的搭配窗帘配色

窗帘行业圈:窗帘行业内部交流圈,窗帘从业者的交流内部圈。 当阳光照进房间的那一刻, 光线给空间带来了无限的可能。 窗边的帘帐既是美丽的风景 又是可爱的魔术师。 在光影变幻的时空里 让你的生活布满温馨和奇幻。 1.窗帘材质怎么选 窗帘的材…

DataSecurity Plus如何阻止数据泄露

随着互联网的发展,数据泄露事件时有发生,给个人和企业造成了巨大的损失。为了保护数据安全,企业需要采取一系列的安全措施,而其中一项重要的措施就是使用数据安全工具。DataSecurity Plus 是一款功能强大的数据安全工具&#xff0…

苹果AirPods耳机推送新固件更新,TWS耳机与Find My可实现智能防丢

苹果推送 iOS / iPadOS 16.5 Beta 2 更新的同时,原本还为 AirPods 耳机推送了固件更新 5E133。苹果在临时撤回之后,再次向用户推送了本次更新, 苹果官方表示当你的 AirPods 在充电且在 iPhone、iPad 或 Mac 的蓝牙通信范围内时,…

【LeetCode:(每日一题1023. 驼峰式匹配) -> 剑指 Offer II 097. 子序列的数目 | 暴力递归=>记忆化搜索=>动态规划】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…

iOS 吸顶效果

项目中,在列表向上滚动时,有时需要将某个控件置顶,这就是我们常见的吸顶效果。 1. UITableView 吸顶效果 UITableView是自带吸顶效果,我们把需要置顶的控件设置为SectionHeaderView,这样在滚动时,该控件会…

360城市全景,开启全新城市探索方式

引言 360城市全景技术的出现和发展,让我们的生活方式和观念发生了革命性的变化。在过去,我们只能通过实地旅行、图片和视频来了解不同城市的文化、建筑和风景。现在,通过360城市全景技术,我们可以像亲临现场一样,透过…

Vue实现自动化平台(四)--接口管理页面的实现

上一章: Vue实现自动化平台(三)_做测试的喵酱的博客-CSDN博客 github地址:https://github.com/18713341733/vuemiaotest 这个目前只是用来练手的,项目还没成型。等以后我写完了,再更新一下项目链接。 …

软件测试——概念篇

目录 一、软件的生命周期 二、瀑布模型(Waterfall Model) 优点: 缺点: 三、螺旋模型(Spiral Model) ​编辑优点: 缺点: 四、增量、迭代 区别: 五、敏捷 scrum…

windows下如何搭建属于自己的git服务器

前一阵子公司需要,领导让我给我们技术部搭建一个git服务器。以前看过教程,但自己没动手做过,开始按照网上的教程来,但搭建过程中发现还是不够详细,今天给大家一个比较详细的,希望对大家有帮助。 高能预警&…