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 向导,您将收到此错误消息:
我在 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 向导,您将收到此错误消息: