无资源对话框
如何使用 Trilobyte-Solutions.nl 的无资源对话框工具包在 WTL 中创建无资源对话框。
引言
如果你设计了一个对话框并想与其他人分享,就会出现一个问题。例如:我正在考虑创建一个典型的“每日提示”对话框,能够读取 XML 文件。我想与任何需要它的人分享。问题是:如何在不处理多个资源脚本的情况下分发代码?我在互联网上搜索了一段时间,找到了一些关于 Windows API 的信息。这相当简单,但有一些需要注意的讨厌的地方。例如,所有数据都必须对齐到 DWORD
边界。我发现没有对话框编辑器很难创建对话框,所以我编写了一个小工具,能够解析资源脚本并从中导出对话框。我将这两件事放在一起,无资源对话框工具包就诞生了。
使用代码
我花了几小时创建文档和教程,所以我想向你展示一个演示代码如何工作的类。
class CSampleDlg: public CResourcelessDlg<CSampleDlg>, public CWinDataExchange<CSampleDlg> { public: BEGIN_MSG_MAP(CSampleDlg) MSG_WM_INITDIALOG(OnInitDialog) CHAIN_MSG_MAP(CResourcelessDlg<CSampleDlg>) END_MSG_MAP() BEGIN_DDX_MAP(CSampleDlg) END_DDX_MAP() // Dialog function void CreateDlg() { CreateDlgTemplate("About", DS_SETFONT|DS_MODALFRAME |WS_CAPTION|WS_SYSMENU, 0, 0, 0, 186, 138, 8, "MS Sans Serif", "", ""); AddStatic("Dialog Extractor v1.0", 0, 0, 60, 20, 67, 8, IDC_STATIC); AddStatic(IDR_MAINFRAME, SS_ICON, 0, 20, 20, 20, 20, 18); AddButton("", 0 | BS_GROUPBOX, 0, 7, 7, 172, 103, IDC_STATIC); AddStatic("(c) Copyright 2004", 0, 0, 60, 30, 58, 8, IDC_STATIC); AddStatic("By: Trilobyte-Solutions", 0, 0, 60, 41, 70, 8, IDC_STATIC); AddStatic("Updates and additional information about" " this program can be found at the Trilobyte Solutions website.", 0, 0, 60, 59, 113, 26, IDC_STATIC); AddStatic("www.Trilobyte-Solutions.nl", 0, 0, 60, 94, 84, 8, IDC_STATIC); AddButton("OK", 0|BS_DEFPUSHBUTTON, 0, 67, 117, 50, 14, IDOK); } LRESULT OnInitDialog(HWND, LPARAM) { DoDataExchange(false); CenterWindow(GetParent()); return IDOK; } };正如你所见,使用这段代码非常简单。更多信息可以在工具包内的文档和教程中找到。
如果你想了解其底层技术,请在 MSDN 中查找以下项目:DLGTEMPLATE
、DLGITEMTEMPLATE
、CreateDialogIndirectParam
和 DialogBoxIndirectParam
。如果收到足够多的请求,我会写一篇关于 Windows 对话框 API 的文章。
每日提示对话框
我在本文前面提到的对话框尚未完成。下周末它可能就准备好了。
历史
代码版本为 1.0。工具版本为 1.1,发现了一些错误。
附加信息
有关更多信息、问题和错误报告,请访问我的网站:http://www.trilobyte-solutions.nl/,或通过 bertwillems@trilobyte-solutions.nl 与我联系。