AFX_DESIGN_TIME 的用途是什么,定义在哪里?

What is the purpose of AFX_DESIGN_TIME and where it is defined?

我在 VS2015 MFC 项目中找到了以下代码。

#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG1 };
#endif

我想了解这个预处理器的用途。 Google 没有给我足够的东西。如果您能对此有所了解,我将不胜感激。

显然,class 向导使用它来将对话框 ID(在您的情况下为 IDD_DIALOG1)映射到对话框 class(派生自 CDialoxEx)。

如果删除整个 #ifdef AFX_DESIGN_TIME / #endif 部分,程序仍然可以正常编译,但 class 向导将不再正常工作。

在旧版本的 Visual Studio 中,对话框的构造函数 class 如下所示:

CSomeDlg::CSomeDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSomeDlg::IDD, pParent)

所以CSomeDlg::IDD符号其实在编译的时候就用到了,并没有#ifdef AFX_DESIGN_TIME.

在 Visual Studio 的最新版本中(至少在 VS2017 中),对话框的构造函数 class 如下所示:

CSomeDlg::CSomeDlg(CWnd* pParent /*=NULL*/)
    : CDialog(IDD_DIALOG1, pParent)

因此 CSomeDlg::IDD 在编译期间不再有用,因此微软决定有条件地编译它。但这并不是绝对必要的,您可以将 #ifdef AFX_DESIGN_TIME 和相应的 #endif 一起删除,代码仍然可以编译并且 class 向导仍然可以正常工作。

顺便说一句,尝试用 enum { IDD = IDD_DIALOG123 }; 替换 enum { IDD = IDD_DIALOG1 }; 并调用 class 向导,您将收到此错误消息: