在工程名叫为Fr的 CFrDlg.h文件中的 enum { IDD = IDD_FR_DIALOG } 这个语句的 作用是什么

在工程名为为Fr的 CFrDlg.h文件中的 enum { IDD = IDD_FR_DIALOG } 这个语句的 作用是什么
本帖最后由 VisualEleven 于 2014-04-30 21:37:26 编辑
在工程名为Fr的   CFrDlg.h文件中的有以下语句

  // Dialog Data
   //{{AFX_DATA(CFrDlg)
    enum { IDD = IDD_FR_DIALOG };
   //}}AFX_DATA


有以下几个问题:
1、//{{AFX_DATA(CFrDlg) 和 //}}AFX_DATA 这两个语句  , 是只是注释, 还是有其他作用。

2、enum { IDD = IDD_FR_DIALOG }; (注:对话框资源的ID是:IDD_FR_DIALOG )
   这句话的作用是什么?



------解决方案--------------------
1. MFC自动生成的一些宏,自动添加一些辅助代码
2. 定义对话框ID
------解决方案--------------------
1.注释掉之后就没有其他用途了,等于删掉
2.IDD = IDD_FR_DIALOG将对话框资源的ID赋给IDD,通过CXXXDlg::IDD调用,参见该类的构造函数
------解决方案--------------------
关联一个对话框的模板资源
------解决方案--------------------
// FrDlg.h : header file
//

#if !defined(AFX_FRDLG_H__AD412C4B_5BF1_436C_8667_0E84BF32CB0D__INCLUDED_)
#define AFX_FRDLG_H__AD412C4B_5BF1_436C_8667_0E84BF32CB0D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CFrDlg dialog

class CFrDlg : public CDialog
{
// Construction
public:
CFrDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CFrDlg)
enum { IDD = IDD_FR_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFrDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CFrDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FRDLG_H__AD412C4B_5BF1_436C_8667_0E84BF32CB0D__INCLUDED_)

新建一个名为 Fr 的 基于对话框 的 MFC 工程,这是其中 FrDlg.h 文件的内容。
这里有几点值得注意:
1.注释块
从该类的定义部分可以看到,应用向导在类声明中生成了很多注释块,主要包括构造(Constructors)块、共性或属性(Attributes)块 、操 作(Operations)块、重载块(Overridables)以及实现块(Implementation)等,各个块都有自己的作用。
Constructors块:构造块,该块用于声明该类的C++构造函数,以及所需的各种初始化函数。例如,CWnd::Create位于构造函数块中,因为在使用CWnd对象之前,必须先调用C++构造函数,然后调用Create函数实际创建Windows窗口。
Attributes块:共性或属性块,该块用于包含对象的共性或属性。这些共性或属性通常是成员变量或Get/Set函数,“Get”和“Set”函数可以是虚函数或一般成员函数。其中,“Get”函数一般为const类型,因为通常情况下它们都没有副作用。不过,保护类型的属性和私有属性通常不在属性块中,而在Implementation块中。
Operations块:操作块,该块用于包含成员函数,可以通过对象调用这些函数,以使该对象执行需要的任务或操作。这些函数一般是非常量的,因为它们通常有副作用。这些函数可以为虚或者非虚,具体取决于类的需要。
Overridables块:重载块,该块用于包含虚函数,当需要更改基类的行为时,可以在派生类中重载这些函数。虚函数的名称通常以“On”开头(但不是必须要以On开头的)。此处的函数旨在被重载,并且常实现或提供某种类型的“回调”(一种函数调用类型)或“挂钩”(用户截取消息的一种处理方式)。
Implementation块:实现块,该块是MFC类声明中最重要的部分。实现块包括所有的实现信息,包括成员变量和成员函数。无论基类中的虚函数在哪一块中定义,该基类函数的重载版本都将出现在本块中,因为MFC将重载基类函数的实现视为实现的详细信息。
2.访问类型
从的头文件中还可以发现public、protected以及private等C++关键字。显而易见,这些关键字指定了成员的访问类型。奇怪的是,文件中竟有上述每种关键字的好几个。这是因为MFC是基于成员变量和函数的使用而非允许的访问类型来定义成员,换句话说,MFC是按照成员的功能或使用将成员逻辑分组,即使某些成员同属public类型,MFC也不会将它们置于同一个public下。但是,实践中可以打破MFC的这一规则。
3.分界符
从头文件中可以看到如 //{{AFX_DATA(CFrDlg) 和 //}}AFX_DATA 等标识符,实际上,类向导使用几种特殊的分界符,用以区分向导生成的代码和用户输入的代码,这些格式化的分界符以注释的形式出现在代码中,因此编译器在编译过程中会忽略它们,而且由它们标识的代码由类向导负责维护。

分  界  符   简 要 描 述
通用定界符
AFX_MSG       在头文件中标志与消息映射相关的ClassWizard实体
AFX_MSG_MAP   在实现文件的类的消息映射中标志消息映射的起止
AFX_VIRTUAL   在头文件中标志虚函数重载声明的起止
对话框定界符
AFX_DATA     在头文件中标志用于对话框数据交换(DDX)的成员变量声明的起止
AFX_DATA_INIT     在对话框类的构造函数中标志DDX的成员变量初始化的起止
AFX_DATA_MAP       在对话框类的DoDataExchange函数中标志DDX函数调用的起止
记录集定界符
AFX_FIELD   在头文件中标志用于数据库记录字段交换(RFX)的成员变量声明的起止
AFX_FIELD_INIT   在记录集类的构造函数中标志RFX的成员变量初始化的起止
AFX_FIELD_MAP   在记录集类的DoFieldExchange函数中标志RFX函数调用的起止
OLE定界符
AFX_DISP   在头文件中标志OLE自动化声明的起止
AFX_DISP_MAP   在实现文件中标志OLE自动化映射的起止
AFX_EVENT   在头文件中标志OLE事件声明的起止
AFX_EVENT_MAP   在实现文件中标志OLE事件的起止

从表中可以看到,每种分界符都表示某一种声明或者定义的起止,另外,从CChapter04View的头文件中也可以看到,分界符是成对出现的,第一个分界符表示起始位置,第二个分界符表示终止位置,以AFX_DATA为例,其通用格式如下:
//{{AFX_DATA(classname) 
... 
//}}AFX_DATA
 
可以看到,第一个分界符之后还紧随一个以括号包含的类名,如下代码所示:
// Dialog Data
//{{AFX_DATA(CFrDlg)
enum { IDD = IDD_FR_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

类向导正是通过注释块、访问类型以及分界符等实现了类成员的自动添加功能,同时,三者也是头文件结构的主要组成部分,并且有机地结合在一起。