【windows编程之对话框】对话框原理,对话框的创建

news2024/12/27 2:26:42

文章目录

  • 引言
  • 一.对话框原理
    • 1.对话框的分类
    • 2.对话框的基本使用
    • 2.自定义对话框窗口消息处理函数
  • 二.模式对话框
    • - 1.创建对话框
    • - 2.对话框的关闭
    • - 3.对话框消息
  • 三.模式对话框创建过程实践
  • 四.无模式对话框

引言

在本章节中我们来讲解Windows/Win32编程中对话框的原理和对话框的创建,我们在前几篇章节中讲解到了普通窗口中回调函数的处理,在普通窗口的窗口消息处理函数(回调函数)中,系统会首先调用我们自己写的回调函数,我们自己编写的回调函数没有处理的消息,才会交给系统的缺省函数处理,但是对话框中消息处理机制不同,系统会首先调用系统中的回调函数,在缺省函数中没有处理的消息,才会寻找我们自己写的回调函数去处理。简单来说,在普通窗口中是我们自己写的回调函数调用系统缺省回调函数,而在对话框中,是系统的缺省函数调用我们字节写的回调函数。

我们来编写一段伪代码来帮助大家理解:
普通窗口:

WndProc(...){
	...    //我们自己写的回调函数过程
	DefWinsowsProc(...);     //之后调用系统缺省回调函数
}

而在对话框中,是系统的缺省函数调用我们写的回调函数:

缺省函数( ... ){
 	...     //系统写好的处理过程
 	自定义回调函数;    //我们自己写的回调函数
}

一.对话框原理

1.对话框的分类

  • 模式对话框
    当对话框显示时,会禁止其他窗口和用户进行交互
  • 无模式对话框/非模式对话框
    当窗口显示后,其他窗口仍可以与用户进行交互

2.对话框的基本使用

  • 1.对话框消息处理函数
    我们在前面的章节中讲解过在系统内核中,局部窗口类,全局窗口类,系统窗口类的保存方式,这个对话框处理函数,就是保存于系统窗口类,我们给出一张图来帮助大家理解:
    系统内核
    我们来看看对话框窗口处理函数的过程:
    我们来通过一段伪代码来讲解:
缺省函数(。。。){
.....       //系统定义好的处理过程
if(DigProc){
我们自己写的窗口消息处理函数。
return 。。。;
}
......        //后续的缺省消息处理过程

};
  • 2.注册窗口类(程序员一般不适用)
  • 3.创建对话框
  • 4.对话框的关闭

2.自定义对话框窗口消息处理函数

既然我们可以自己定义回调函数,那么我们来看看在对话框中我们到底该怎么编写回调函数:
MSDN官方文档解释DigProc回调函数

  • 应用程序定义的回调函数与CreateDialoc函数和DialocBox函数系列一起使用(我们后文会讲到)。它处理发送到模式或无模式对话框的消息。DLGPROC类型定义指向此回调函数的指针。
  • 语法:
    INT_PTR DlgProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){...}
    其中,hWnd指定对话框的句柄,uMsg是消息,wParam和lParam都是消息的附加信息。
    一般情况下,如果此回调函数(我们自定义的回调函数)处理了消息,则对话框过程应返回TURE,如果未处理,则返回FALSE。如果对话框过程返回FALSE,对话管理器将执行默认对话操作以响应消息。

二.模式对话框

- 1.创建对话框

通过DialogBox函数来创建,我们来看看这个函数:
MSDN官方文档解释DialogBox函数

  • 函数功能:从对话框模板资源创建模式对话框

语法:

void DialogBox(
	HINSTANCE hInstance,          //包含对话框模板的模块的句柄
	LPCTSTR lpTemplate,           //对话框模板
	HWND hWndparent,              //拥有对话框的窗口句柄
	DIGPROC lpDialogFunc          //指向对话框过程的指针
};

DialogBox函数是一个阻塞函数,只有当对话框关闭后,才会返回,执行后续代码
返回值通过EndDialog函数设置

- 2.对话框的关闭

关闭模式对话框,使用EndDialog函数,不能使用DwstroyWindow函数(原因我们后文会讲到)。
MSDN官方文档解释EndDialog函数

  • 函数功能:销毁模式对话框,导致系统结束对对话框的任何处理
  • 语法:
BOOL EndDialog(
	HWND hDlg,              //要销毁的对话框的句柄
	INT_PTR nResult         //要从创建对话框的函数返回到应用程序的值
);

注意这里的nResult参数,它是DialogBox函数退出时的返回值,我们前面讲到DialogBox是一个阻塞函数,我们可以通过EndDialog函数来设置DialogBox函数返回的值,通过不同的返回值,我们可以做不同的事。

- 3.对话框消息

WM_INITDIALOG–对话框创建之后,在对话框显示之前,通知对话框窗口处理函数的消息,我们可以在此消息中完成自己初始化相关的工作。

三.模式对话框创建过程实践

我们来带领大家一步一步创建模式对话框:

  • 1.我们需要模式对话框,首先我们肯定需要一个菜单资源,我这里用的是之前文章内容中的菜单资源,怎样添加资源,如果大家不会的话可以到Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源
    文章中学习。
    菜单资源
  • 2.创建了菜单资源后,我们还需要做出一个i对话框资源:
    添加->资源->Dialog资源
    这里我就使用程序初始化时的模式对话框了,至于模式对话框之后的创建按钮,我们后续会讲到
    模式对话框
  • 3.做好前两步之后,我们来到普通窗口回调函数来处理消息,我们的需求是当点击菜单中的关于按钮后,出现这个模式对话框
    我们先来到普通窗口的回调函数来处理点击帮助按钮的消息:这里给出的是命令消息的全部处理,帮助按钮的消息处理在第三个分支
case WM_COMMAND: {
		switch(LOWORD(wParam)) {
			case MY_OPEN: {
				sprintf(output, "打开按钮被点击,请到回调函数中做具体处理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case MY_QUIT: {
				sprintf(output, "退出按钮被点击,请到回调函数中做具体处理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case IDM_ABOUT: {
				sprintf(output, "帮助按钮被点击,请到回调函数中做具体处理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				int nResult = DialogBox(hIns, (char*)IDD_ABOUTBOX, hwnd, DiaLogProc);
				if (nResult == 100) {
					MessageBox(hwnd, "Success", "Infor", MB_OK);
				}
			}
			case MY_NEWFILE: {
				sprintf(output, "打开新文件按钮被点击,请到回调函数中做具体处理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case MY_LASTTIMEFILE: {
				sprintf(output, "上次打开文件按钮被点击,请到回调函数中做具体处理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
		}
		break;
	}

我们来看看处理效果:
对话框处理效果
我们在程序运行起来之后,我们发现一个问题:程序无法退出,这时候我们就需要来到模式对话框的回调函数来处理这个关闭模式对话框的消息了:

INT CALLBACK DiaLogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg){
	case WM_SYSCOMMAND:{
		if (wParam = WM_CLOSE) {
			EndDialog(hwndDlg, 100);
		}
		break;
		}
	}
	return FALSE;
}

这时候我们发现就可以正常退出程序了。

四.无模式对话框

  • 创建对话框:
HWND CreateDialog(
	HINSTANCE hInstance,          //包含对话框模板的模块句柄
	LPCTSTR lpTemplate,           //对话框模板
	HWND hWndParent,              //拥有对话框的窗口句柄
	DLGPROC lpDialogFunc          //指向对话框过程的指针
);

MSDN官方文档解释CreateDialog函数
该函数为非阻塞函数,创建成功后返回窗口句柄,需要使用ShowWindow函数来显示对话框

  • 非模式对话框的关闭:
    关闭非模式对话框,需要使用DestroyWindow函数来销毁窗口,不能使用EndDialog函数来关闭对话框。

今天的分享就到这里,如果文章中有错误之处,还请大家指出来,我会非常虚心地学习,希望我们共同进步!!!

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

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

相关文章

Ajax请求,基于JSON的数据交换 实例

前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>发送Ajax GET请求 展示学生信息列表</title> <script type"text/javascript"> w…

camunda任务监听器如何使用

在Camunda工作流引擎中&#xff0c;任务监听器是一种机制&#xff0c;用于在业务任务执行期间捕获特定事件并执行相应的操作。它们可以帮助您实现一些重要的任务&#xff0c;例如&#xff1a; 1、记录或更新业务数据&#xff1a;当任务完成或取消时&#xff0c;您可以使用任务…

本地搭建wamp服务器并内网穿透实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 转载自cpolar极点云的文章&#xff1a;无公网IP&#xff1f;教你在外远程访问本地Wamp服务器「…

【C++】入门基础

文章目录 1、命名空间1.1、命名空间的概念1.2、命名空间的定义1.3、命名空间的使用 2、初识cout和cin2.1、标准输入输出对象简介2.2、缓冲区2.3、cout2.4、cin 3、缺省参数3.1、全缺省参数3.2、半缺省参数3.3、注意事项 4、函数重载4.1、函数重载的概念4.2、函数重载的定义4.3、…

OpenCV实战——根据立体图像计算深度信息

OpenCV实战——根据立体图像计算深度信息 0. 前言1. 立体视觉系统2. 计算深度信息3. 完整代码相关链接 0. 前言 人类可以用两只眼睛构建三个维度世界&#xff0c;而为机器人配备两个摄像头时&#xff0c;机器人同样也可以做到这一点&#xff0c;这称为立体视觉 (stereo vision…

exe4j

exe4j是一种用于将Java程序打包成可执行文件&#xff08;.exe&#xff09;的软件工具。使用exe4j&#xff0c;开发人员可以将Java程序打包成可独立运行的.exe文件&#xff0c;并将所需的Java虚拟机&#xff08;JVM&#xff09;包含在内。exe4j提供了许多配置选项&#xff0c;可…

五、FM1288调试方案-调试原理

本篇只讲述调试原理,侧重流程、理论,不涉及细节,比如应该调哪一块、哪些寄存器这些。 文章目录 1. 结构框图1.1 回声消除原理1.2 硬件结构2. 调试方案2.1 uart串口调试2.2 I2C调试1. 结构框图 1.1 回声消除原理 回声消除的详细原理,牵涉到算法相关的东西,不太了解,只描…

二项分布的参数p的检验

设某事件发生的概率为p&#xff0c;做m次的独立检验&#xff0c;以X为发生的次数&#xff0c;则X服从二项分布B(m, p)&#xff0c;则针对X可以做出假设 定义一个合理的检验,&#xff0c;设置一个阈值C&#xff1a; F : 当 X < C时&#xff0c;接受H0&#xff0c;否则拒绝H0 …

[亲测有效] 如何实现vivo图案解锁

vivo是最受欢迎的智能手机品牌之一&#xff0c;拥有庞大的客户群。但是在使用vivo手机的过程中&#xff0c;难免会出现意外。其中最常见的是忘记密码。那么&#xff0c;如果您忘记了密码&#xff0c;如何解锁 vivo 手机呢&#xff1f;这是您需要知道的一切。本文将向您展示5种轻…

云原生应用环境中的权限提升

对于如今的现代数字应用程序&#xff0c;在操作事件期间管理访问权限对于确保企业的生产环境和基础架构安全都至关重要。一个被大家认可的基本安全原则是最小权限原则&#xff0c;基于该原则开发人员和运维人员应该具备尽可能小的权限&#xff0c;只访问必须的生产环境及数据&a…

牛客网剑指offer|中等题day2|JZ22链表中倒数最后k个结点(简单)、JZ35复杂链表的复制(复杂)、JZ77按之字形顺序打印二叉树(中等)

JZ22链表中倒数最后k个结点(简单) 链接&#xff1a;链表中倒数最后k个结点_牛客题霸_牛客网 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指…

CRM系统的在线演示是什么?有什么作用?

CRM系统在线演示的作用是帮助企业选择适合的CRM系统。在线演示可以让企业更好地了解CRM系统是如何工作的&#xff0c;以及它如何能使他们的业务受益。在线演示实质上是CRM系统的虚拟演示&#xff0c;您可以清楚的知道它是如何工作的&#xff0c;以及如何通过定制来满足某些业务…

解释水波特效处理

这篇博文译自以下这篇文章——The Water Effect Explained 由于这篇文章主要用Pascal语言进行描述的。因此我后面会添加一些注释&#xff0c;并结合Apple提供的ripple相关的Demo给出一些额外的遵守GNU11规范的C代码。 介绍 在计算机图形中的许多特效中&#xff0c;水特效是一…

ResourceManager HA 原理

简介 为了解决 Yarn 中 ResourceManager 的单点故障问题&#xff0c;在 Hadoop 2.4 中新增了 ResourceManager HA 的能力&#xff0c; 该文章基于 Hadoop 3.1.1 进行讲解。 1.1. 名词定义 全称简称备注ResourceManagerRmZookeeperZK ResourceManager Ha 架构 ResourceMana…

Linux shell编程 数组 ^ 数组排序

数组定义 数组内数据类型可以为数值也可以为字符串。 若字符串类型需要使用 " " 包含以免空格扰乱数组。 方法1 空格分隔直接定义数组 arr(10 20 30 40 50) arr1(zhangsan lisi wangwu) 方法2 指定元素下标定义&#xff0c;若跳过元素不设置会显示为空 arr([0]1…

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…

震惊!如果患上植物神经紊乱,就会诱发胃肠神经功能紊乱!

植物神经系统和胃肠系统是人体内重要的调节系统&#xff0c;它们分别负责着许多生物过程的调控。当这两个系统出现紊乱时&#xff0c;会对人体健康产生不良影响。本文将从植物神经紊乱与胃肠神经功能紊乱的关系、症状、治疗办法和生活预防方法四个方面进行探讨。 一、植物神经紊…

GoAccess 网站日志分析

GoAccess是一个开源且免费的网站日志分析和交互式WEB日志查看器&#xff0c;可在 Linux 系统的终端中或通过浏览器运行。使用它可让系统管理员视化的查看统计报告&#xff0c;这对于SEO以及运维来说非常有价值。 GoAccess支持几乎所有Web 日志格式&#xff0c;包含&#xff1a;…

数据结构-图的遍历和应用(DAG、AOV、AOE网)

目录 *一、广度优先遍历(BFS) 广度优先生成树 广度优先生成森林 *二、深度优先遍历 深度优先生成树 深度优先生成森林 二、应用 2.1最小生成树 *Prim算法 *Kruskal算法 2.2最短路径 *BFS算法 *Dijkstra算法 *Floyd算法 *2.3有向无环图(DAG网) *2.4拓扑排序(AOV网)…

Java之线程安全

目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…