当前位置: 首页 > article >正文

windows对话框

windows对话框有以下几种:

HWND CreateDialogParamA(
  [in, optional] HINSTANCE hInstance,
  [in]           LPCSTR    lpTemplateName,
  [in, optional] HWND      hWndParent,
  [in, optional] DLGPROC   lpDialogFunc,
  [in]           LPARAM    dwInitParam
);
HWND CreateDialogIndirectParamA(
  [in, optional] HINSTANCE       hInstance,
  [in]           LPCDLGTEMPLATEA lpTemplate,
  [in, optional] HWND            hWndParent,
  [in, optional] DLGPROC         lpDialogFunc,
  [in]           LPARAM          dwInitParam
);
void CreateDialogIndirectA(
  [in, optional]  hInstance,
  [in]            lpTemplate,
  [in, optional]  hWndParent,
  [in, optional]  lpDialogFunc
);
void CreateDialogA(
  [in, optional]  hInstance,
  [in]            lpName,
  [in, optional]  hWndParent,
  [in, optional]  lpDialogFunc
);
INT_PTR DialogBoxParamA(
  [in, optional] HINSTANCE hInstance,
  [in]           LPCSTR    lpTemplateName,
  [in, optional] HWND      hWndParent,
  [in, optional] DLGPROC   lpDialogFunc,
  [in]           LPARAM    dwInitParam
);

从winuser.h中可得,CreateDialogA是一个宏,调用了CreateDialogParamA。

#define CreateDialogA(hInstance, lpName, hWndParent, lpDialogFunc) \
CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
#define CreateDialogW(hInstance, lpName, hWndParent, lpDialogFunc) \
CreateDialogParamW(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define CreateDialog  CreateDialogW
#else
#define CreateDialog  CreateDialogA
#endif // !UNICODE

#define CreateDialogIndirectA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
CreateDialogIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#define CreateDialogIndirectW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define CreateDialogIndirect  CreateDialogIndirectW
#else
#define CreateDialogIndirect  CreateDialogIndirectA
#endif // !UNICODE

因此,主要有三个函数:

CreateDialogParamA

CreateDialogIndirectParamA

DialogBoxParamA

其中,DialogBoxParamA是模态对话框,另外两种是非模态对话框。

模态对话框的意思就是,调用者直接调用就可以创建对话框,不需要像窗口那样分发消息。而非模态对话框需要手动实现消息传递和分发消息。

模态对话框调用后,系统自动提供消息分发机制,程序会自动进入消息分发机制循环,所以程序会卡在这一行。点击关闭按钮后,对话框被销毁,程序从下一行继续运行。我的建议是使用DialogBoxParamA这种模态对话框,消息处理中需要注意的细节太多,可能会有各种意外的发生。

如下代码是非模态对话框的消息分发机制:

	MSG msg;
	while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {

		if (ret == -1) {
			return -1;
		}

		if (ret == 0)
		{
			break;
		}

 		ret = IsDialogMessage(dialog->m_hwnd, &msg);
		if (ret)
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

而模态对话框就不需要这样做。

CreateDialogIndirectParamA和CreateDialogParamA的区别在于,CreateDialogIndirectParamA函数需要调用者提供对话框的模板。对话框模板是如下数据结构:

typedef struct {
  DWORD style;
  DWORD dwExtendedStyle;
  WORD  cdit;
  short x;
  short y;
  short cx;
  short cy;
} DLGTEMPLATE;

扩展模板结构如下:

typedef struct {
  WORD      dlgVer;
  WORD      signature;
  DWORD     helpID;
  DWORD     exStyle;
  DWORD     style;
  WORD      cDlgItems;
  short     x;
  short     y;
  short     cx;
  short     cy;
  sz_Or_Ord menu;
  sz_Or_Ord windowClass;
  WCHAR     title[titleLen];
  WORD      pointsize;
  WORD      weight;
  BYTE      italic;
  BYTE      charset;
  WCHAR     typeface[stringLen];
} DLGTEMPLATEEX;

http://www.kler.cn/a/137080.html

相关文章:

  • curl也支持断点续传
  • linux系统编程(五)
  • Unity 3D饼状图效果
  • Leetcode Hot 100 【二叉树】104. 二叉树的最大深度
  • 【TF-IDF】Hugging Face Model Recommendation System
  • 圣诞快乐(h5 css js(圣诞树))
  • 字节8年经验之谈 —— 10大自动化测试框架总结!
  • 深入 Django 的 URL 分发器
  • 国产化区块链平台-FISCO BCOS 区块链
  • 代码随想录算法训练营第25天|216.组合总和III 17.电话号码的字母组合
  • 关于“研发效能冷思考”的冷思考 | IDCF
  • 【Linux】 线程
  • CSS中常用的伪元素选择器
  • 机器学习第11天:降维
  • 场景中的解剖学方向标记_vtkAnnotatedCubeActor
  • 外贸干货|深度剖析外贸出口各国操作细节
  • 每日一题 2216. 美化数组的最少删除数(中等,贪心)
  • Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具
  • 每日一练 | 华为认证真题练习Day134
  • SQL基础理论篇(七):多表关联的连接算法
  • 『亚马逊云科技产品测评』活动征文|借助AWS EC2搭建服务器群组运维系统Zabbix+spug
  • 软考高项知识点 安全技术
  • 【Linux】指令详解(二)
  • 如何将MBR转换为GPT?原来操作这么简单!
  • milvus数据库搜索
  • 隐私计算迎来千亿级风口,一文讲清它的技术理论基础