【问题标题】:What is the purpose of AFX_DESIGN_TIME and where it is defined?AFX_DESIGN_TIME 的目的是什么以及它是在哪里定义的?
【发布时间】:2018-09-15 23:29:24
【问题描述】:

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

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

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

【问题讨论】:

  • 这是默认项目吗? AFX_DESIGN_TIME 符号表明,当在资源编辑器中时,代码是有条件地启用的。不过这很奇怪,因为对话框的基类也使用enum { IDD = .... }; 在运行时从对话框模板资源构造对话框。
  • @IInspectable "since enum { IDD = .... }; 被对话框的基类使用":不再,至少在 VS2017 和新创建的 MFC 中没有项目。请参阅下面的答案。

标签: mfc dialog preprocessor


【解决方案1】:

显然,类向导使用它来将对话框 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 在编译过程中不再有用,因此微软决定有条件地编译它。但这不是绝对必要的,您可以将#ifdef AFX_DESIGN_TIME 和相应的#endif 一起删除,代码仍然可以编译,类向导仍然可以正常工作。

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

【讨论】:

  • 有道理。显然,类向导仍然是围绕一个非常精简的编译器构建的,它可以用常量符号IDD 识别enum,而不是尝试解析(自定义)构造函数调用。非常不幸的是,类向导现在可以不同意编译到可执行映像中的代码。这会引起一两个惊喜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2019-01-30
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多