对话框模板RegexTest

对话框模板

RegexTest

我想用MFC和C++ 创建一个基于对话框的程序(主窗口本身是个对话框)。我不想使用资源(.rc)文件,而是想在内存中动态创建对话框。我在 MSDN 中找到一些线索,但没有发现代码例子。我了解到 DLGTEMPLATE和DLGITEMTEMPLATE 结构以及 InitModalIndirect 函数或许可以用来创建模式对话框,但我不知道从何入手。请问如何不依赖资源文件动态创建对话框?

Thomas Zeitlberger

从理论上讲,动态创建对话框很简单,但实际上那样做很危险。就是内存中创建正确的结构并调用一系列 Indirect 对话框创建函数之一:用CDialog::CreateIndirect 创建非模式对话框,或者用CDialog::InitModalIndirect 创建模式对话框(然后调用DoModal 运行)。它们分别对应着 Win32 API 函数 ::CreateDialogIndirect和::DialogBoxIndirect。不管用什么方法,你都得在内存中传递一个指向对话框模板的指针。

从概念上讲,创建对话框模板很简单,就是在内存中建立并初始化相关结构。其具体细节是有讲究的,因为这些结构有点奇奇怪怪,很诡诈,你不得有一点差错,只要有一个字节的偏差,那么你的程序便会莫名其妙地垮掉。控件的位置和大小计算也会出现混乱,原因是对话框不使用像素,而是用对话框单位(units),它依赖对话框的字体。

要完整地讨论包含所有类型控件的对话框模板不是本专栏所能胜任的。但我可以提供一个简单的例子,它至少包含一个控件。我写了一个类:CStringDialog,它显示一个对话框,请求用户输入一个字符串,如图 Figure 1 所示。

Figure 1 String Dialog

为了使用这个类,你只需实例化然后调用Init和DoModal 即可:

CStringDialog dlg;
dlg.Init(_T("Hi"), _T("Please enter your name:"));
if (dlg.DoModal()==IDOK) {
  CString name = dlg.m_str;
  // do something with it...
}

CStringDialog 的样子和行为类似于所有基于对话框资源的CDialog 派生类,所不同的是该对话框用其自身模板在内存中动态生成。

那么对话框模板到底是个什么东西呢?对话框模板其实就是一个描述对话框的内存结构。这个模板之所以复杂并容易出错,是因为它并非像 CREATESTRUCT和WNDCLASS 一样是个定长结构。它是一个变长结构,其中包含有定长结构元素 DLGTEMPLATE 以及 DLGITEMTEMPLATE 结构数组,其每个数组元素对应着一个对话框控件项。DLGTEMPLATE和DLGITEMTEMPLATE 两者都包含一些跟在 C 结构后面非常很特别的变长域。这些结构如 Figure 2 所示,Figure 3 是整个结构的布局。

Figure 3 对话框模板

时间: 2025-01-20 23:04:20

对话框模板RegexTest的相关文章

不使用资源文件动态创建对话框的做法

一般而言,在 Windows编程中创建对话框需要先定义一个对话框资源.我想能不能不用资源文件单纯通过代码创建对话框呢?晚上搜索了一些资料,研究了一下,基本实现了.   我写了一个KDialog,代码如下(代码中有一些注释,相信大家能基本看懂): 头文件的代码: [cpp] view plaincopy <span style="font-size:16px;">// kdialog.h   #ifndef KDIALOG_H_INCLUDED   #define KDIAL

MFC教程(12)-- 对话框和对话框类CDialog(1)

对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对话框 一个模式对话框是一个有系统菜单.标题栏.边线等的弹出式窗口.在创建对话框时指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME风格.即使没有指定WS_VISIBLE风格,模式对话框也会被显示. 创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS_SETF

汇编教程之以对话框为主要界面的应用程序

现在我们开始学习一些有关GUI编程的有趣的部分, 即:以对话框为主要界面的应用程序.我们将分两课来讲述这一过程 理论: 如果您仔细关注过前一个程序就会发现:您无法按TAB键从一个子窗口控件跳到另一个子窗口控件,要想转移的话只有 用鼠标一下一下地去点击.对用户来说这是不友好的.另一件事是如果您象前一课中那样把主窗口的背景色从白色改成 灰色,为了子窗口控件无缝地作相应地改变,您必须细分类所有子窗口. 造成上述诸多不便的原因是子窗口控件本来是为对话框而设计的,象子窗口控件的背景色是灰色的,而对话框的背

GUI编程中以对话框为主要界面的应用程序

现在我们开始学习一些有关GUI编程的有趣的部分, 即:以对话框为主要界面的应用程序.我们将分两课来讲述这一过程 理论:如果您仔细关注过前一个程序就会发现:您无法按TAB键从一个子窗口控件跳到另一个子窗口控件,要想转移的话只有 用鼠标一下一下地去点击.对用户来说这是不友好的.另一件事是如果您象前一课中那样把主窗口的背景色从白色改成 灰色,为了子窗口控件无缝地作相应地改变,您必须细分类所有子窗口. 造成上述诸多不便的原因是子窗口控件本来是为对话框而设计的,象子窗口控件的背景色是灰色的,而对话框的背景

Windows SDK笔记(六):使用对话框资源建立窗口

Ⅰ.使用对话框资源建立主窗口 一.概述 在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法. 使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样. 我们知道,对话框是系统预先定义的"窗口类",它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数. 但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数"嫁接"

Windows SDK笔记(五):非模式对话框

一.概述 使用DialgBox建立的对话框是"模式对话框",只有关闭对话框后,程序的其他窗口才能进行操作. 与此相对应,存在"非模式对话框",对话框建立后,并不强制要求用户立即反应,而是与其他窗口同时接受用户操作. 二.建立 非模式对话框使用CreateDialg建立. 可以在WinMain中建立主窗口后建立,对话框句柄保存备用. hDlgModeless = CreateDialog ( hInstance, TEXT ("ColorScrDlg&quo

Windows SDK笔记(四):模式对话框

一.概述 对话框是一种特殊的窗口,它依据对话框模板资源而建立. 它与一般的窗口有些不同,很多过程由系统完成了,虽然用户还是要提供一个消息处理函数,但在此消息处理函数中,不需要将不关心的消息交由缺省消息处理函数. 实际上,调用缺省处理的过程又系统完成. 二.对话框消息处理函数 对话框也需要用户提供一个消息处理函数,但这个处理函数没有普通窗口的消息处理函数"权利大". 对话框是一种系统定义的"窗口类",它已经定义好了对应的消息处理函数.客户所作的消息处理函数,并不是直接

公共对话框——OPENFILENAME结构

OPENFILENAME结构包含了GetOpenFileName和GetSaveFileName函数用来初始化打开或另存为对话框的信息.在用户关闭对话框后,系统返回关于用户的选择信息到这个结构中. typedef struct tagOFN { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCTSTR lpstrFilter; LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DW

cdialog 1.1-20110630发布 屏幕显示对话框基类

Chttp://www.aliyun.com/zixun/aggregation/16497.html">Dialog类是在屏幕上显示的对话框基类.对话框有两类:模态对话框和非模态对话框.模态对话框在应用继续进行之前必须关闭.非模态对话框允许用户执行另外的操作而不必取消或删除该对话框. 一个CDialog对象是对话框模板与一个CDialog派生类的组合.使用对话框编辑器创建对话框并存入资源之中,然后使用ClassWizard创建一个CDialog派生类. 同其它窗口一样,对话框从Windo