Windows SDK(八)模态对话框与非模态对话框

news2024/11/16 0:49:31

对话框的创建

对话框分为模态对话框和非模态对话框两种形式

模态对话框:自建消息循环,并且通过EnableWindow禁用了父窗口的键盘鼠标输入达到阻塞父窗口的功能。当有对话框,父窗口阻塞时,透过对话框是无法对父窗口进行操作的,这也就是父窗口堵塞的结果

非模态对话框:与父窗口共用消息循环,没有父窗口堵塞,其余和模态对话框一致

在应用前,我们手动在Windows桌面程序创建的窗口的顶层菜单上做出如下修改

并将模态对话框ID修改为ID_DLG1,非模态对话框ID修改为ID_DLG2

同样的,对话框我们也可以在资源文件中手动创建一个模态对话框并修改ID为IDD_DIALOG_ONE,一个非模态对话框并修改ID为IDD_DIALOG_TWO

现在我们对这模态对话框进行一个应用。该应用在case WM_COMMAND消息中处理

    case WM_COMMAND:
	{ 		
		switch (LOWORD(wParam)) //判断菜单的选择
		{
		case ID_DLG1: //选择模态对话框
		{
			//开始创建模态对话框
			//GetWindowLongPtr(hWnd,GWLP_HINSTANCE) 该函数只能作为子窗口获取模块句柄的方式,因为参数中有父窗口句柄,而父窗口本身是没有父窗口的
			//GetModuleHandle(NULL)常用于作为父窗口获取模块句柄的方式,也可获取子窗口句柄。填NULL获取主模块句柄
			//MODULE实际上就是HINSTANCE的封装,本质上就是模块基址
			// MAKEINTRESOURCE()将对话框ID转换为指向对话框的指针
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_ONE), hWnd, Dialog1WndProc);//创建模态对话框并可直接显示。注意参数四是该对话框的窗口过程,需要我们自行创建,和正常的窗口过程没有区别
			break;
		}
		case ID_DLG2://选择非模态对话框
		{
			HWND hDlg2 = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_TWO), hWnd, Dialog2WndProc);//每个对话框都需要再创建一个窗口过程函数。创建好对话框以后不会直接显示
			ShowWindow(hDlg2, SW_SHOW);//显示非模态对话框
			break;
		}
		default:
			break;
		}
	}
INT_PTR CALLBACK Dialog1WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //自行创建的对话框的窗口过程函数,注意返回值
{
	switch (message)
	{
	case WM_INITDIALOG:
	{
		return (INT_PTR)TRUE;
	}
	case WM_CLOSE:
	{
		EndDialog(hWnd, 0);
		break;
	}
	default:
		break;
	}
	return 0;
}
INT_PTR CALLBACK Dialog2WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)//非模态对话框的窗口过程函数
{
	switch (message)
	{
	case WM_INITDIALOG:
	{
		return (INT_PTR)TRUE;
	}
	case WM_CLOSE:
	{
		EndDialog(hWnd, 0);
		break;
	}
	default:
		break;
	}
	return 0;
}

完成以上过程以后,我们运行程序点击模态对话框,就会出现一个对话框了。点击非模态对话框时,也是如下相同的对话框

对话框的优点

对话框最好的优点便是我们在手动设置对话框时,可以直接在工具箱中拖动在对话框添加相关的东西。注意将对话框的属性view改为report

下图便是我们实践的结果

此时该模态对话框便有了如上图的控件,每个控件都有自己的ID,我们只需要对其进行应用而不用再次创建。

对话框设置

该对话框是通过点击父窗口菜单模态对话框选项实现的,现在我们使它通过运行程序后直接就是父窗口:

我们直接做出如下修改即可:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

  /* HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      750, 400, 500, 800, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
*/
   DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_ONE), NULL, Dialog1WndProc);
   return TRUE;
}

对话框应用

INT_PTR CALLBACK Dialog1WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //自行创建的对话框的窗口过程函数,注意返回值
{
	switch (message)
	{
	case WM_CREATE:
	{
		break;
	}
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
		case ID_MSG:
		{
			MessageBox(NULL, L"Msg", L"Msg", MB_OK);
			break;
		}
		default:
			break;
		}
		break;
	}
	case WM_INITDIALOG: //对控件的应用在此消息中
	{
		HWND hTreeWnd = GetDlgItem(hWnd, IDC_TREE1);// IDC_TREE1就是对话框中树控件的ID
		HTREEITEM hRoot1 = CreateTreeNode(hTreeWnd, TVI_ROOT, L"RootNode1");
		HTREEITEM h1SubNode1 = CreateTreeNode(hTreeWnd, hRoot1, L"hSubNode1");
		CreateTreeNode(hTreeWnd, h1SubNode1, L"hSubNode1Sub1");
		CreateTreeNode(hTreeWnd, h1SubNode1, L"hSubNode1Sub2");
		HTREEITEM h1SubNode2 = CreateTreeNode(hTreeWnd, hRoot1, L"hSubNode2");
		HTREEITEM hRoot2 = CreateTreeNode(hTreeWnd, TVI_ROOT, L"RootNode2");
		HTREEITEM h2SubNode1 = CreateTreeNode(hTreeWnd, hRoot2, L"hSubNode1");
		HTREEITEM h2SubNode2 = CreateTreeNode(hTreeWnd, hRoot2, L"hSubNode2");
		HTREEITEM hRoot3 = CreateTreeNode(hTreeWnd, TVI_ROOT, L"RootNode3");
		HTREEITEM h3SubNode1 = CreateTreeNode(hTreeWnd, hRoot3, L"hSubNode1");
		HTREEITEM h3SubNode2 = CreateTreeNode(hTreeWnd, hRoot3, L"hSubNode2");
		break;

		return (INT_PTR)TRUE;
	}
	case WM_CLOSE:
	{
		EndDialog(hWnd, 0);
		break;
	}
	default:
		break;
	}
	return 0;
}

作业

封装自己的界面库

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

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

相关文章

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布,2.0版本迎来第一个稳定版本,同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架,可以让你使用前端技术来构建桌面…

Redis7基础篇(六)

redis复制 目录 redis复制 前引 概念 能干嘛 怎么玩 基本操作 案例演示 前期配置 实操 常用三招 一主二仆 薪火相传 反客为主 复制原理和工作流程 复制的缺点 前引 redis复制这一篇有承上启下的作用 前面的 redis几乎是单机版 一台redis 概念 能干嘛 水平扩容…

收银系统源码-购物卡与会员卡的区别

很多门店都会推出一些只有指定商品才可以使用的购物卡或不同额度、不同折扣的消费卡,用来进行一些商品的促销或会员储值。如今时代实体卡容易丢失,很多人出门不愿意带钱包卡包。如果您有这样的功能需求,快来看看千呼新零售2.0购物卡功能吧&am…

[FSCTF 2023]寻找蛛丝马迹

点一下,看到只有页面背景颜色变化 查看一下页面源码吧,发现第一段flag 访问一下styles.css,看到顶部有一串乱码(应该是flag一部分)我们用火狐的修复文字编码工具 进行修复后显示 然后再访问script.js,依旧是乱码,同样…

数据湖之Delta Lake

Delta Lake:数据湖存储层概述 Delta Lake 是一种开源的存储层技术,构建在 Apache Spark 的基础之上,旨在解决传统数据湖的可靠性、性能和数据一致性问题。它通过引入 ACID 事务、数据版本控制、时间旅行和统一的批处理与流处理等特性&#x…

【SCI/EI/SCOPUS/CNKI】第三届先进材料与装备制造国际会议(AMEM2024)

会议日期:2024年12月28-30日 会议地点:中国-云南省-昆明市 会议官网:https://www.iaast.cn/meet/home/Bx93wRT 出版检索:EI、Scopus等数据库收录 【主办单位】 国际应用科学与技术协会(IAAST) 【主讲嘉宾】 【论文出版与检…

20 数据可视化

20 数据可视化 本章概述一. `elasticsearch`实现数据统计1.1 创建用户信息索引1.1.1 控制台创建`aggs_user`索引1.1.2 `aggs_user`索引结构初始化1.1.3 创建`aggs_user`索引的`EO`对象1.1.4 用户类型枚举1.1.5 数据初始化****************************************************…

引入本地iconfont图标

iconfont-阿里巴巴图标库官网,搜索想要的图标 1、加入购物车 2、添加至项目 头部的资源管理,点我的项目 找到对应的项目,点击 下载至本地,是个zip压缩包 解压缩一下,copy一下文件,放到项目里,…

打印空心正方形(c语言)

1.//KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“* ”组成的“空心”正方形图案。 //输入描述 : //多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“…

PCBlayout什么意思

PCB (Printed Circuit Board) layout 是指在设计印制电路板的过程中,对电子元器件及导电路径进行合理布置的过程。这个过程对于确保电路板的功能性和可靠性至关重要。下面是一些 PCB layout 的基本概念和步骤: 元件放置: 元件放置是 PCB 设计…

AI在线免费数学工具:Qwen2-Math

1、Qwen2-Math https://huggingface.co/spaces/Qwen/Qwen2-Math-Demo

python中使用gurobi遇到强不等式约束(只有大于或者小于而不是大于等于或者小于等于的形式)的解决办法

文章目录 情况分析与解决思路数学模型严格不等式约束转化后的约束形式带入具体的 ϵ \epsilon ϵ 值 python代码总结 情况分析与解决思路 在gurobi求解数学优化问题时&#xff0c;标准的约束形式通常是大于等于&#xff08; >&#xff09;或小于等于&#xff08;<&…

nginx简介及功能介绍

目录 niginx与apache niginx特点 nginx模块介绍 nginx的编译安装 nginx的平滑升级及版本回滚 niginx的常用参数 nginx独立文件编写 location匹配用法 自定义日志 文件检测 nginx中的长链接管理 nginx下载服务器设置 nginx的状态页面 nginx的数据压缩功能 nginx的…

客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

制造业正经历着前所未有的变革&#xff0c;其中客车制造行业作为传统制造业的重要组成部分&#xff0c;正积极拥抱5G、工业物联网及数字孪生等先进技术&#xff0c;推动生产模式的全面升级与数字化转型。 客车制造5G智能工厂工业物联数字孪生平台的出现&#xff0c;不仅为行业…

Datawhale X 魔搭 AI夏令营-大模型技术(微调)-大模型评分

大语言模型&#xff08;LLMs&#xff09;在自动化复杂评分任务和增强决策过程方面展示了巨大的潜力。从作文评分到信用风险评估&#xff0c;LLMs 已表现出卓越的文本理解和分析能力。然而&#xff0c;要充分利用LLMs的潜力&#xff0c;必须探索如何将它们与其他AI形式&#xff…

Python数据分析项目实战01_票房榜单分析和pyecharts大屏可视化

一&#xff1a;最终大屏效果展示 由于生成了html网页只能在本地上显示&#xff0c;这个大屏是动态的&#xff0c;只能显示其中的图片。如果要分享给他人使用&#xff0c;就需要将html源码转为网页。 生成的html源码入口&#xff1a;‬​‍​‌‌​⁠​​​‌‍​​​​​‬&a…

百日筑基第五十七天-虚拟线程

百日筑基第五十七天-虚拟线程 前提 JDK19于2022-09-20发布GA版本&#xff0c;该版本提供了虚拟线程的预览功能。下载JDK19之后翻看了一下有关虚拟线程的一些源码&#xff0c;跟早些时候的Loom项目构建版本基本并没有很大出入&#xff0c;也跟第三方JDK如鹅厂的Kona虚拟线程实…

Leetcode JAVA刷刷站(58)最后一个单词的长度

一、题目概述 二、思路方向 要解决这个问题&#xff0c;你可以通过遍历字符串 s 并从后往前计数的方式来实现。但更简洁且易于理解的方法是&#xff0c;首先去除字符串尾部的空格&#xff08;如果有的话&#xff09;&#xff0c;然后找到最后一个单词的起始位置&#xff0c;并计…

I2C学习:传输速率

一&#xff0e;内容简介 I2C总线根据传输速度不同&#xff0c;可以划分为5种速度模式&#xff0c;见下列表格。 速度模式 最高速率 备注 标准模式Sm 100Kbps 双向传输 向下兼容 快速模式Fm 400Kbps 快速模式增强Fm 1Mbps 高速模式HSm 3.4Mbps 超快速模式UFm 5Mbp…

解决在移动端css使用100vh底部被遮盖的问题

原文引用&#xff1a;https://blog.csdn.net/hw_happy/article/details/132421653 移动端下&#xff0c;若使用100vh单位&#xff0c;那么高度不会是浏览器可视区域的高度&#xff0c;而是会高于可视区域&#xff0c;所以居底部的元素会被遮盖住&#xff1a; 如果是chrome浏览…