2010-01-25 102 views
6

我在想如何Visual Studio联系MFC CDialog派生类与其对应的对话框资源。我对运行时的连接方式不感兴趣(如here),而是在设计时。visual studio如何将mfc对话框类与对话框资源相关联?

当我将消息处理程序添加到对话框时,它如何知道要将处理程序添加到哪个类。 另外,是否有可能有几个CDialog派生类与相同的对话框资源相关联,反之亦然?

...我已经寻找了IDD_SOMEDIALOG字符串的项目目录,但只发现它在SomeDialog.hresource.hProject.rc在预期的地方,所以我想它在某种程度上推断,从这些文件中SomeDialog.h连接,最有可能的枚举:

// in class CSomeDialog: 
    enum { IDD = IDD_SOMEDIALOG }; 

我这样问,主要是出于好奇。

回答

4

这取决于dev studio的版本。

在VS6中它全部保存在CLW(类向导文件)中。

在新版本的开发工作室它不再使用CLW,我不知道具体如何知道,但我怀疑它是一个实时解析,而不是使用缓存的CLW。

至于有多个派生的对话使用相同的资源,它可以手动完成。您可以复制创建的类文件并重命名它们,并从头中删除枚举,并将源文件中IDD枚举的使用编辑为实际的对话资源ID(IDD_SOMEDIALOG)。

AFAIK Dev Studio一次只能“愉快地”处理一个类到一个对话框。根据我的经验,尝试重新使用这样的对话资源,最终只会在与MFC & Dev Studio的争斗中结束,因为他们不打算这样做。

+0

这看起来确实如此,请参阅我的更新以获取更多详细信息。 – 2010-01-26 09:17:32

2

为了增加红润的回答是:

我发现我的一些对话框类中,我更换了enum { IDD }static const int IDD没有任何再与其对话资源相关联。恢复到枚举重新关联它们。所以Visual Studio似乎会解析源代码来确定关系。

至于资源共享,对于哪个类应该接收事件处理程序代码将是不明确的。类似共享似乎是不可能的,因为它依赖于IDD,它不能同时分配给IDD_SOMETHINGIDD_SOMETHING_ELSE