Windows学习笔记-08(关于如何使用Dialog资源的简单说明)

1、添加Dialog资源

资源文件->添加->资源->Dialog:

可右键该Dialog->属性,从而对其进行更改、查看其ID:

2、编写基础的主函数和Dialog的过程函数

cpp 复制代码
#include <Windows.h>
#include <CommCtrl.h>
#include "resource.h"


INT_PTR CALLBACK Digproc(HWND hwnd,UINT uMsg,WPARAM wparam,LPARAM lparam)
{
	switch (uMsg)
	{
		case WM_INITDIALOG:
		{
			// 对话框初始化
            // 当前代码为空,实际应用中可能包含以下操作:
			// 1. 设置对话框图标
			// 2. 初始化对话框中的控件(如设置编辑框默认文本)
			// 3. 加载配置信息到控件
			// 4. 设置焦点到某个控件(返回TRUE表示系统设置焦点,FALSE表示手动设置)
			break;
		}
		case WM_CLOSE:
		{
            // 注意:对于模态对话框,使用EndDialog;对于非模态对话框,使用DestroyWindow
			EndDialog(hwnd,0);
			break;
		}
		default:
			return FALSE;
			break;

	}

	return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd)
{

	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Digproc);
	return 0;
}

对话框类型说明:

  • 模态对话框:阻塞父窗口,用户必须处理完当前对话框才能操作其他窗口

  • 非模态对话框:不阻塞父窗口,用户可以同时操作多个窗口

本代码创建的是模态对话框,使用DialogBox函数。如果创建非模态对话框,需要使用:

cpp 复制代码
CreateDialog(hinstance, MAKEINTRESOURCE(IDD_DIALOG1), hwndParent, Digproc);
ShowWindow(hDlg, SW_SHOW);

3、在Dialog上添加控件

视图->工具箱:

可将工具箱内的控件拖拽至Dialog中,并可在右上角的工具栏处设置控件的对齐方式:

4、控件的使用

  1. 控件被用户操作的时候,会给父窗口发送消息,需要我们根据用户的动作去实现一些功能。
  2. 需要使用代码控制控件去千一些事情,一般情况都用GetDlgItem函数获取窗口句柄,根据子 控件ID获取到子控件,再通过SendMessage发送消息控制控件的行为。
cpp 复制代码
HWND GetDlgItem(
  HWND hDlg,        // 对话框或窗口句柄
  int  nIDDlgItem   // 控件ID
);

注意:不知道如何使用的函数和消息参数,可以选中后按F1进行查看。

5、简单的示例

cpp 复制代码
#include <Windows.h>
#include <CommCtrl.h>
#include "resource1.h"


INT_PTR CALLBACK Digproc(HWND hwnd,UINT uMsg,WPARAM wparam,LPARAM lparam)
{
	switch (uMsg)
	{
		case WM_INITDIALOG:
		{
			// 对话框初始化
			//第一种:
			//HWND check1 = GetDlgItem(hwnd, IDC_CHECK1);
			//SendMessageW(check1,BM_SETCHECK, BST_CHECKED,0);
			//第二种:
			SendDlgItemMessage(hwnd, IDC_CHECK1, BM_SETCHECK, BST_CHECKED, 0);
			break;
		}
		case WM_COMMAND:
		{
			WCHAR ContrID = LOWORD(wparam);//控制标识符
			WCHAR MessCode = HIWORD(wparam);//控件定义的通知代码
			WCHAR buff[20] = { 0 };

			switch (ContrID)
			{
				case IDOK:
				{
					for (UINT CID = IDC_CHECK1; CID <= IDC_CHECK3; ++CID)//通过遍历来获取
					{
						UINT Checked = SendDlgItemMessageW(hwnd, CID, BM_GETCHECK, 0, 0);
						if (Checked == BST_CHECKED)
						{
							GetDlgItemTextW(hwnd, CID, buff, 20);
							MessageBox(hwnd, buff, L"提示", MB_OK);
						}

					}
				}
			}
			break;
		}
		case WM_CLOSE:
		{
			EndDialog(hwnd,0);
			break;
		}
		default:
			return FALSE;
			break;

	}

	return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd)
{

	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Digproc);
	return 0;
}
相关推荐
曼巴UE52 分钟前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
昌原的儿子LEO3 分钟前
IMX6ULL 时钟系统与 EPIT/GPT 定时器原理与配置
arm开发·学习
百事牛科技4 分钟前
PPT只读怎么取消?四种情况分别处理
windows·powerpoint
乌暮13 分钟前
Java 抽象类与接口详解:半成品图纸 vs 能力合同
java·开发语言·后端·学习
AAA代码批发商20 分钟前
Days 47 IMX6ULL 裸机开发:按键轮询实验 + 外部中断原理剖析(上)
笔记·学习·imx6ull·裸机开发·#arm中断
一条破秋裤24 分钟前
Hi3516CV610 20S V4 开发板启动与调试流程
学习
sunoo-22928 分钟前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
景煜拾年1 小时前
RHCA-Docker知识点整理
运维·笔记
P.D.Wei1 小时前
[Leetcode 3524] 求出数组的X值I
python·学习
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day46|贯穿项目 2 思维导图复盘
java·开发语言·vue.js·学习·spring