AFX_DESIGN_TIME的目的是什么?它在何处定义?

时间:2018-04-06 02:18:53

标签: mfc dialog preprocessor

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

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

我想了解这个预处理器的用途。谷歌没有给我任何足够的东西。如果你能对它有所了解,我将不胜感激。

1 个答案:

答案 0 :(得分:6)

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

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

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

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

因此在编译期间实际使用了CSomeDlg::IDD符号,并且没有#ifdef AFX_DESIGN_TIME

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

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

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

BTW,尝试用enum { IDD = IDD_DIALOG1 };替换enum { IDD = IDD_DIALOG123 };并调用类向导,您将收到以下错误消息:

enter image description here