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

这篇具有很好参考价值的文章主要介绍了【windows编程之对话框】对话框原理,对话框的创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

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

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

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

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

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

一.对话框原理

1.对话框的分类

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

2.对话框的基本使用

  • 1.对话框消息处理函数
    我们在前面的章节中讲解过在系统内核中,局部窗口类,全局窗口类,系统窗口类的保存方式,这个对话框处理函数,就是保存于系统窗口类,我们给出一张图来帮助大家理解:
    【windows编程之对话框】对话框原理,对话框的创建
    我们来看看对话框窗口处理函数的过程:
    我们来通过一段伪代码来讲解:
缺省函数(。。。){
.....       //系统定义好的处理过程
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编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源
    文章中学习。
    【windows编程之对话框】对话框原理,对话框的创建
  • 2.创建了菜单资源后,我们还需要做出一个i对话框资源:
    添加->资源->Dialog资源
    这里我就使用程序初始化时的模式对话框了,至于模式对话框之后的创建按钮,我们后续会讲到
    【windows编程之对话框】对话框原理,对话框的创建
  • 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;
	}

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

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函数来关闭对话框。

今天的分享就到这里,如果文章中有错误之处,还请大家指出来,我会非常虚心地学习,希望我们共同进步!!!文章来源地址https://www.toymoban.com/news/detail-438171.html

到了这里,关于【windows编程之对话框】对话框原理,对话框的创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC基于对话框——仿照Windows计算器制作C++简易计算器

    目录 一、界面设计 二、设置成员变量 三、初始化成员变量  四、初始化对话框 ​五、添加控件代码 1.各个数字的代码(0~9) 2.清除功能的代码 3.退格功能的代码 4.加减乘除功能的代码 5.小数点功能的代码 6.正负号功能的代码 7.等于功能的代码 六、源码领取方式 制作好之后

    2024年02月05日
    浏览(70)
  • .net-----Windows 窗体应用程序包括控件,对话框,多重窗体,绘制图形,菜单和工具栏

    Windows窗体应用程序概述;  使用Visual Studio开发Windows窗体应用程序;  窗体和控件概述;  使用常用Windows窗体控件;  通用对话框;  菜单和工具栏;  多重窗体;  多文档界面;  绘制图形 Windows窗体应用程序是运行在用户计算机本地的基于Windows的应用程序,

    2024年02月04日
    浏览(65)
  • python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 Entry 单行输入框 用户可输入内容 Frame 容器 用于装载其他GUI组件 Label 标签 用于显示不可编辑

    2024年02月12日
    浏览(47)
  • 对话框之模式对话框与无模式对话框以及自定义消息

    模式对话框 创建模式对话框步骤 创建模式对话框模板 IDD_COptionsDialog 构造一个CDialog对象,并封装对话框模板 调用CDialog:Domal()显示对话框 无模式对话框 创建对话框模板 IDD_COptionsDialog 构造一个CDialog对象,并封装进对话框模板 单击菜单项显示无模式对话框

    2024年02月10日
    浏览(53)
  • 【Qt】对话框QDialog类,模态对话框和非模态对话框

    QDialog类是所有对话框窗口类的基类。对话框窗口是一个用来完成短小任务或和用户进行简单交互的 顶层窗口 。 按照运行对话框时是否还可以和该程序的其它窗口进行交互,将它分为两类:模态(modal)对话框和非模态(modaless)对话框。 模态对话框 先看一个例子: 创建一

    2024年02月05日
    浏览(62)
  • MFC 通用对话框之文件对话框

    CFileDialog 类 封装了Windows通用文件对话框,Windows通用文件对话框提供了轻松实现与Windows标准一致的打开文件、保存文件、另存文件对话框的方法。 当我们用CFileDialog类的构造函数生成一个对象后就修改 m_ofn 结构体对象里的值, m_ofn 的类型为 OPENFILENAME。 CFileDialog类构造函数的

    2024年02月05日
    浏览(66)
  • MFC 通用对话框之颜色对话框

    CColorDialog类封装了颜色对话框,此类允许您将颜色选择对话框合并到应用程序中。颜色对话框就像画家的调色板一样,可显示系统定义的颜色列表,用户可以从列表中选择或创建特定颜色。构造一个CColorDialog类对象后,可用 DoModal( ) 函数来显示颜色对话框。 CColorDialog 的构造

    2024年02月06日
    浏览(56)
  • Qt对话框——QInputDialog输入对话框

    Qt对话框——QInputDialog输入对话框 在Qt开发中,我们有时需要通过一个对话框获取用户的输入,而QInputDialog就是Qt框架提供的一种方便地弹出输入对话框并获取用户输入数据的方式。 QInputDialog使用非常简单,我们可以通过访问不同的接口来弹出输入对话框获取多种类型的返回

    2024年02月12日
    浏览(51)
  • Qt标准对话框:8大对话框详解

    颜色对话框类 QColorDialog 提供了一个可以获取指定颜色的对话框的对话框部件: 这里使用 QColorDialog 的静态函数 getColor () 来获取颜色,执行时弹出颜色选择对话框: 返回的是一个 QColor 类型的数据: 这四个数值分别代表:透明度(alpha)、Red、Green、Blue。它们的默认值都是

    2024年02月03日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包