【发布时间】:2010-09-25 19:35:24
【问题描述】:
我在现有资源文件中定义了一个新对话框及其控件。我还创建了一个新文件,它将处理从此对话框生成的事件。但我不确定如何将这两者联系起来。
声明enum { IDD=IDD_NEW_DIALOG }; 是否只需要连接两者?或者我们应该添加一些其他语句?
【问题讨论】:
我在现有资源文件中定义了一个新对话框及其控件。我还创建了一个新文件,它将处理从此对话框生成的事件。但我不确定如何将这两者联系起来。
声明enum { IDD=IDD_NEW_DIALOG }; 是否只需要连接两者?或者我们应该添加一些其他语句?
【问题讨论】:
这通常在 MFC 中完成的方式是在资源编辑器中定义一个对话框模板(就像您所做的那样),然后在 C++ 中从 CDialog 派生一个类并将其与对话框模板相关联(听起来像您已经完成了 - 这并不完全清楚)。
实际上将两者联系起来的是 CDialog 代码的构造函数。如果您查看 MFC 类向导自动生成的对话框相关代码,您会在构造函数实现中看到如下内容:
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlg::IDD, pParent)
其中 CMyDlg::IDD 被定义为具有新对话框模板标识符值的枚举。正是这一点使这一切发生,而不是枚举的声明。您可以将其修改为
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(IDD_NEW_DIALOG, pParent)
它仍然可以工作(假设 IDD_NEW_DIALOG 是资源中对话框的模板 ID),因为正在发生的只是对话框 ID 被传递到构造函数中。
一般来说,始终值得记住的是,尽管最初出现,MFC 并没有通过一些编译器魔法绑定到 Windows - 这一切都是通过 C++ 和一些宏完成的。
编辑:DIALOGEX 和 DIALOG 声明 Windows 理解的对话框资源格式略有不同:前者比后者更新。然而,至少从 Windows 95 开始,两者就已经存在,所以这不是一个非常显着的区别。
【讨论】:
当您通过对话框类(DoModal() 或 Create 用于非模态对话框)创建对话框时,这就是所需的全部,这是正常的方法。
您当然需要从 CDialog 继承,并添加一个消息映射来将消息路由到您的 ewvent 处理函数。
【讨论】:
使用类向导为新创建的对话框创建一个类。 ctrl+w 是 UI 资源视图的快捷键。
【讨论】: