对话框模板RegexTest
2010-07-11 20:44:51 来源:WEB开发网对话框模板有点像汇编语言编程手册中的内容,现在就让我们穿上蹩脚的工作制服,立即从 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(空串)。在代码中是这样写的:
*pTempl++ = 0; // 菜单 (无)
*pTempl++ = 0; // 对话框类 (使用标准的对话框类)
接下来是标题,一个空结尾的Unicode 字符串:
USES_CONVERSION;
LPCWSTR wszText = T2W(_T("My Dialog"));
wcscpy((WCHAR*)pTempl, wszText);
pTempl += wcslen(wszText)+1;
这段代码支持 Unicode 或者 ASCII,因为定义了 _UNICODE,T2W是一个串转换宏。不要忘了增加模板指针 pTempl 的增量值,将其指到串后面的下一个 WORD。如果对话框具有 DS_SETFON 式样,在第四个字段:16位的字体大小后跟 Unicode 字体名,例如:“Verdana”。
最后,我要指出对话框模板有一个扩展版本 DLGTEMPLATEEX,它可以让你指定更多的域,如字体点数和重量、是否用斜体、字符集、字体名。想了解更多信息请参考文档。这里我仅描述一个简单版本,因为通过在 OnInitDialog 处理例程中调用SetFont 来设置字体是很容易的事情。(对于对话框中的控件项也有一个 DLGITEMTEMPLATEEX 扩展版本)。
讲了这么多 DLGTEMPLATE。下面该看看控件。对话框中的每个控件项都是通过一个模板来描述的(DLGITEMTEMPLATE),其值不能超过一个 DWORD:
pTempl = AlignDWORD(pTempl);
DLGITEMTEMPLATE& it = *((DLGITEMTEMPLATE*)pTempl);
it.x = 0;
it.y = 0;
// etc.
与 DLGTEMPLATE 类似,DLGITEMTEMPLATE 结构后面有三个变长域。即类名,文本和“”创建数据(creation data)。类名也是空结尾的Unicode 字符串指定窗口类名(例如,“SysListView32”或者“MyFancyControl”),或者 0xFFFF 后跟特定的原子码之一,这些编码如 Figure 4 所示,它们都用于标准的预定义系统控件。例如,下面的代码示范了如何创建一个静态的文本控件:
// class immediately after DLGITEMTEMPLATE
*pTempl++ = 0xFFFF; // next WORD is atom:
*pTempl++ = 0x0082; // static control
类名后面是标题。它既可以是Unicode 字符串,也可以是特定的0xFFFF 后跟 16位的资源 ID。你还可以用0xFFFF + ID 的格式来为某个具备 SS_ICON 或 SS_BITMAP 式样的静态控件指定一个图标或位图。CStringDialog 使用字符串形式来创建其提示:
USES_CONVERSION;
LPCWSTR wszTest = T2W(_T("My Dialog"));
int maxlen = /* don''t overflow! */
wcsncpy((WCHAR*)pTempl, wszText, maxlen); pTempl += wcslen(wszText)+1;
最后,“creation data”可以是任何你想要的数据。第一个 WORD 是数据长度,如果没有数据,其值可以是零。Windows 用LPARAM 将一个指向数据的指针传递给 WM_INITDIALOG(模式对话框)或者 WM_CREATE(无模式对话框)。在此我不推荐使用创建数据,因为将任何你想要的数据成员添加到对话框类中,并用对话框的构造函数或 OnInitDialog 处理例程初始化它们的做法要容易得多。但你仍然得提供一个 0 WORD 来告诉 Windows 没有创建数据:
*pTempl++ = 0; // no creation data
更多精彩
赞助商链接