WEB开发网
开发学院软件开发VC 对话框模板 RegexTest 阅读

对话框模板 RegexTest

 2006-07-19 11:31:19 来源:WEB开发网   
核心提示: 为了使用这个类,你只需实例化然后调用 Init 和 DoModal 即可:CStringDialog dlg;dlg.Init(_T("Hi"), _T("Please enter your name:"));if (dlg.DoModal()==I

为了使用这个类,你只需实例化然后调用 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 对话框模板

对话框模板有点像汇编语言编程手册中的内容,现在就让我们穿上蹩脚的工作制服,立即从 DLGTEMPLATE 开始吧。

假设你分配了一块足够大的内存来存放整个对话框模板,首先要做的事情就填写 DLGTEMPLATE 结构域。这一部分不难:

WORD* pTempl = new WORD[1024];
DLGTEMPLATE& dt = *((DLGTEMPLATE*)pTempl);
dt.style = WS_POPUPWINDOW|DS_MODALFRAME|WS_DLGFRAME;
dt.cdit = 3; // # dlg items
dt.x = 100; // in dlg units
// etc.

DLGTEMPLATE 结构域是自扩展的,对此我不再做进一步说明。紧跟着该结构后面的域是变长域:菜单,对话框类和标题。每一项都不能超过一个 WORD。它可以是一个空结尾的 Unicode 字符串以标示某个 MENU 资源的名字,对话框类名或标题。此外,菜单和类名可以用特殊值 0xFFFF 后跟一个 16位 的 ID——即可以是菜单资源的 ID,也可以是预定义系统窗口类的序数。在大多数情况下,类名都应该使用 0x0000(空串),它告诉 Windows 操作系统使用默认的对话框类(#32770)。多数对话框都没有菜单,所以菜单也是 0x0000(空串)。在代码中是这样写的:

上一页  1 2 3 4 5 6 7  下一页

Tags:对话框 模板 RegexTest

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接