如何在项目之间共享对话框

介绍 之后在两个或三个重大项目,你开始明白,很多应用程序包含共同的特征,组件和对话框。就像你经常使用的函数将设立一个共同的目录,您可以为其他常见组件做同样的事情。本文讨论了一种方法(还有其他-见下面的其他方法)之间共享对话框资源项目。 “共享一个对话框资源”到底意味着什么?首先有一个对话框资源定义,通常存储在一个.rc文件。然后将控制对话框,和这些控件将分别有一个ID,如IDC_NAME或IDI_MYICON。这些id必须伴随的定义的资源(.rc)文件的对话框。方便存储所有这些定义在一个. h文件,但它必须命名的一些独特的东西,并不能命名为resource.h。最后,对话框将一些代码,通常至少OnInitDialog (), DoDataExchange()和()两个函数可能位置。所以对于每一个对话框中,将有至少四个文件: Dialog.cpp——包含对话框的实现代码。 Dialog.h——包含类定义对话框。最初,这个文件和上面应该由Visual Studio生成,这样以后你可以使用类向导,以防你需要修改它。 对话框。rc -包含对话框资源模板,以一种可以通过Visual Studio的资源编辑器来编辑。 DialogRes.h -包含定义id用于资源模板。这个文件必须具有相同的格式作为标准资源。h, Visual Studio工具将能够阅读和修改它。 警告:你必须有一个DialogRes.h(或其他名称)为每一个rc文件。如果不这样做,Visual Studio将副resource.h rc文件,和你的原始resource.h将被覆盖。请做一个备份。 但它是不够的只是对话框的功能组织成四个文件。也是必要的,以确保任何应用程序,包括这些文件可以透明地:我的意思是说,它将不需要编辑或改变任何的四个文件。当满足这个要求的时候,你会真正的可共享的对话框。在本文的其余部分,我将讨论具体的事情必须做才能达到这个要求。 技巧 技巧# 1 实现透明实际上是在MSDN文档,但很少人使用它。我指的这一事实CDialog有三个构造函数:隐藏,复制Code

CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);

CDialog();

第一种形式,这是很重要的。我们正在试图做的是使应用程序的具体实现细节对话框。不幸的是,通常的Visual studio的头文件对话框有一个看起来像行:隐藏,复制Code

enum { IDD = IDD_ABOUTBOX };

这有效地关系对话框的应用程序,因为应用程序需要知道IDD_ABOUTBOX的价值要包括About.h。与标准枚举方法,应用或About.h必须包括AboutRes.h。这是非常不可取的,因为它意味着所有AboutRes.h中定义的id将可见到应用,整个应用程序,因此必须是唯一的。如果你是处理一个应用,数以百计的对话框,你会很快耗尽替代IDC_NAME之类的东西。 这就是第一个CDialog构造函数——,另外, 另一个技巧 这不是记录太好:唯一的资源id需要独特的是那些应用程序范围。这意味着对话id, id字符串资源,和其他几个人需要是唯一的。所有其他的(事实上,大多数)的id不需要独特的应用程序,只要他们是独一无二的在任何一个对话框。 把这些东西放在一起,我们知道,我们可以使用一个字符串作为对话框标识符。所以我们要做的是: 包括项目的四个文件——收集或生成上面提到的四个文件,为您希望包含在项目中所示的对话框。重要的是,这些文件的格式紧跟Visual Studio格式,允许使用Visual Studio工具。在FileView选项卡中,右键单击“项目文件”条目(在这个演示,它将“XDialogImport文件”)。选择“添加文件到项目…”然后选择四个文件(演示,那将是什么。cpp。rc,。h, AboutRes.h)。Visual Studio会抱怨。钢筋混凝土,因为已经有一个.rc文件在项目: 单击OK,约。rc将被包括在内。 添加到项目rc文件——去“视图|资源包括…”在列表框底部,向下滚动到最后。插入# include”。钢筋混凝土“# endif之前: 删除枚举About.h -不枚举,不需要包含AboutRes.h。注意IDD_ABOUTBOX不是AboutRes中定义。h,这样它将出现在引用时。rc资源ResourceView选项卡中查看: 当IDD_ABOUTBOX双击运行,从所示的对话框。rc将显示在资源编辑器: 使用第一个CDialog反对构造器——下面是CAboutDlg构造器的样子:复制CodeCAboutDlg::CAboutDlg(): CDialog(_T("IDD_ABOUTBOX")) { / / {{AFX_DATA_INIT (CAboutDlg) / /}} AFX_DATA_INIT } 在About.cpp中包含about .h—这对其他应用程序模块中定义的任何id都没有任何影响。 最后,这是 技巧# 3 如您所见,可以双击IDD_ABOUTBOX进入资源编辑器。然后,您可以更改对话框、添加控件等,就像其他任何对话框一样。但是有一件事你不能做:通常,你可以去查看| ClassWizard并为各种控件id添加变量。如果在演示中这样做,您将看不到任何控件标识符,比如IDC_ABOUT_EMAIL。这里是技巧:右键单击你在资源编辑器中看到的对话框,并选择ClassWizard…您将看到以下对话框: 单击取消。然后你会看到标准的类向导对话框,里面有所有的控制标识符: 提示 创建可共享对话框资源的关键是最小化与应用程序的耦合。以下是调试模式下的About对话框: 这是它在释放模式下的样子: 在这些数据中,每一个都有四条数据是从外部获取的: 应用程序的名称是从字符串资源加载的:Hide  复制CodeCString strTitle; 如果(! strTitle.LoadString (AFX_IDS_APP_TITLE)) strTitle.Empty (); 版本号和构建号是从VERSIONINFO资源加载的:复制代码字wFileVersion [4]; CVersion版本; version.Init (); version.GetFileVersion(和wFileVersion [0], , wFileVersion [1], , wFileVersion [2], , wFileVersion [3]); 版权声明从VERSIONINFO资源加载: 隐藏,复制CodeCString strCopyright (_T (" ")); version.GetLegalCopyright (strCopyright); m_Copyright.SetWindowText (strCopyright); 电子邮件地址从VERSIONINFO资源加载: 隐藏,复制CodeCString strEmail (_T (" ")); version.GetStringInfo (_T(“电子邮件”),strEmail); 除了以上内容之外,About.cpp还使用全局定义_DEBUG和BETA_VERSION来显示其他信息。 总之,为了有效地实现可共享的对话框,您必须结合良好的组织和深思熟虑的设计。在关于dialog的演示中,外部信息来自于应用程序中实现的字符串和版本资源。这工作得很好,但结果是,为了能够使用About对话框,每个应用程序都必须以同样的方式实现这些字符串和版本资源。当然,还可能有其他应用程序对话框接口,但关键是,当您选择了接口时,每个应用程序都必须以相同的方式实现接口。 如何使用 使用上面描述的方式包含的对话框和使用其他对话框没有什么不同:复制Code

void CXDialogImportDlg::OnButton1()
{
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
}

目标 当然,还有其他方法可以实现可共享对话框。在考虑各种方法的时候,我心里有几个我不想放弃的目标: 这种方法必须易于实现,并且成本不超过维护常规对话框的成本。 标准的Visual Studio工具(资源编辑器、类向导等)必须对生成的对话框可用。 对话框-应用程序耦合必须最小,以提高可重用性。 理想情况下,对话框的支持文件不应该被修改,从一个应用程序到下一个。 其他方法 记住以上目标,这里有一些其他的方法,你可能会考虑: 从DLL加载对话框-有很多例子说明如何做到这一点。缺点:你有另一个DLL与你的应用一起发布。 使用COM组件-在实践中,与前面相同。 如何包含一个对话框而不从。rc由Brad Bruce。缺点:你必须自己阅读这篇文章并决定这是否是你想要维护的东西。 对话框模板由Max McGuire。这个类允许您动态地创建dlgtemplate。缺点:您用GUI资源编辑器来交换大量代码。 致谢 在生产应用程序中,一个不可或缺的信息是构建号。在demo About对话框中,构建号来自版本资源。我使用Navi Singh的自动递增构建号来自动递增版本资源中的构建号。您所要做的就是将版本资源放在.rc2文件中,用字符串替换硬编码的版本(请参阅Navi的文章),并安装Navi的自动构建插件。在此之后,每次单击Build时,构建号都会增加。 修订历史 版本1.0 - 2003年6月18日 首次公开发行。 使用 这个软件是释放到公共领域。你可以自由使用它在任何你喜欢的方式。如果你修改或扩展了它,请考虑在这里发布新的代码供大家分享。本软件是“按原样”提供的,没有e一组或默示担保。我接受任何损害或损失不承担任何责任的业务,这个软件可能会导致。 本文转载于:http://www.diyabc.com/frontweb/news5327.html

posted @ 2020-08-09 14:30  Dincat  阅读(146)  评论(0编辑  收藏  举报