使用 MFC 源文件

Microsoft基础类 (MFC) 库提供完整的源代码。 头文件 (.h) 位于 \atlmfc\include 目录中。 实现文件(.cpp)位于 \atlmfc\src\mfc 目录中。

本文介绍 MFC 用于注释每个类的各个部分、这些注释的含义以及每个部分中应查找的内容的约定。 Visual Studio 向导使用它们为你创建的类的类似约定,你可能会发现这些约定适用于你自己的代码。

你可能熟悉 public关键字 protectedprivate C++关键字。 在 MFC 头文件中,你会发现每个类可能有多个此类。 例如,公共成员变量和函数可能属于多个 public 关键字。 这是因为 MFC 根据成员变量和函数的使用(而不是允许的访问类型)来分隔成员变量和函数。 MFC 谨慎使用 private 。 即使是被视为实现细节的项目也经常 protected如此,而且很多次都是 public。 尽管不建议访问实现详细信息,但 MFC 会决定你。

在 MFC 源文件和 MFC 应用程序向导创建的头文件中,你将在类声明中找到类似这些注释(通常按以下顺序):

// Constructors

// Attributes

// Operations

// Overridables

// Implementation

注释示例

以下部分类 CStdioFile 列表使用 MFC 在其类中使用的大多数标准注释,以按它们的使用方式划分类成员:

/*============================================================================*/
// STDIO file implementation

class CStdioFile : public CFile
{
    DECLARE_DYNAMIC(CStdioFile)

public:
// Constructors
    CStdioFile();

    // . . .

// Attributes
    FILE* m_pStream;    // stdio FILE
                        // m_hFile from base class is _fileno(m_pStream)

// Operations
    // reading and writing strings
    virtual void WriteString(LPCTSTR lpsz);
    virtual LPTSTR ReadString(_Out_writes_z_(nMax) LPTSTR lpsz, _In_ UINT nMax);
    virtual BOOL ReadString(CString& rString);

// Implementation
public:
    virtual ~CStdioFile();
#ifdef _DEBUG
    void Dump(CDumpContext& dc) const;
#endif
    virtual ULONGLONG GetPosition() const;
    virtual ULONGLONG GetLength() const;
    virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

    // . . .

protected:
    void CommonBaseInit(FILE* pOpenStream, CAtlTransactionManager* pTM);
    void CommonInit(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM);
};

这些注释一致地标记包含类似类成员的类声明的各个部分。 请记住,它们是 MFC 约定,而不是设置规则。

构造函数注释

// Constructors MFC 类声明的节声明构造函数(在C++意义上),以及真正使用对象所需的任何初始化函数。 例如,在构造函数节中,CWnd::Create因为在使用CWnd对象之前,必须先调用C++构造函数,然后调用函数来“完全构造”。Create 通常,这些成员是公共成员。

例如,类 CStdioFile 有五个构造函数,其中一个构造函数显示在 注释示例下的列表中。

属性注释

// Attributes MFC 类声明的节包含对象的公共属性(或属性)。 属性通常是成员变量或 Get/Set 函数。 “Get”和“Set”函数可能不是虚拟函数。 “Get”函数通常是 const,因为在大多数情况下,它们没有副作用。 这些成员通常公开。 保护属性和专用属性通常在实现部分中找到。

在类 CStdioFile的示例列表中,在 注释示例下,列表包含一个成员变量, m_pStream。 类 CDC 列出此注释下的近 20 个成员。

注释

大型类(如 CDCCWnd)可能有多个成员,这些成员只需列出一个组中的所有属性就不会增加太多。 在这种情况下,类库使用其他注释作为标题来进一步描述成员。 例如, CDC 使用 // Device-Context Functions// Drawing Tool Functions使用 // Drawing Attribute Functions等。 表示属性的组将遵循上述常规语法。 许多 OLE 类都有一个名为 <a0/> 的实现部分。

作注释

// Operations MFC 类声明的节包含成员函数,你可以调用该函数以使其执行作或执行作(执行作)。 这些函数通常是非函数,const 因为它们通常具有副作用。 它们可能是虚拟的或非虚拟的,具体取决于类的需求。 通常,这些成员是公共成员。

在类 CStdioFile的示例列表中,在 注释的一个示例中,该列表包括以下注释下的三个成员函数: WriteString 以及两个 ReadString重载。

与属性一样,可以进一步细分作。

可重写的注释

// Overridables MFC 类声明的节包含可在需要修改基类行为时在派生类中重写的虚拟函数。 它们通常以“On”开头命名,尽管这不是绝对必要的。 此处的函数旨在重写,通常实现或提供某种“回调”或“挂钩”。通常,这些成员受到保护。

在 MFC 本身中,纯虚拟函数始终放在本节中。 C++中的纯虚拟函数采用以下形式:

virtual void OnDraw( ) = 0;

在类 CStdioFile的示例列表中,在 注释示例中,该列表不包含可重写部分。 另一方面,类 CDocument列出大约 10 个可重写的成员函数。

在某些类中,还可以看到注释 // Advanced Overridables。 这些函数是仅高级程序员应尝试重写的函数。 你可能永远不需要重写它们。

注释

本文中所述的约定也适用于自动化(以前称为 OLE 自动化)方法和属性。 自动化方法类似于 MFC作。 自动化属性类似于 MFC 属性。 自动化事件(支持 ActiveX 控件(以前称为 OLE 控件)类似于 MFC 可重写的成员函数。

实现注释

// Implementation 部分是任何 MFC 类声明最重要的部分。

本部分包含所有实现详细信息。 成员变量和成员函数都可以出现在本节中。 此行下方的所有内容在 MFC 的未来版本中可能会更改。 除非无法避免,否则不应依赖行下方 // Implementation 的详细信息。 此外,在实现行下方声明的成员是无证的,尽管技术说明中讨论了一些实现。 基类中虚拟函数的重写驻留在此部分中,而不考虑基类函数在哪个节中定义。 当函数重写基类实现时,它被视为实现详细信息。 通常,这些成员受到保护,但并非总是受到保护。

CStdioFile注释示例下的列表中,注释下方// Implementation声明的成员可以声明为publicprotectedprivate。 仅请谨慎使用这些成员,因为它们将来可能会更改。 将一组成员声明为 public 类库实现正常运行所必需的。 但是,这并不意味着可以安全地使用声明的成员。

注释

可以在注释的上方或下方 // Implementation 找到剩余类型的注释。 在任一情况下,它们都描述下面声明的成员类型。 如果这些成员出现在注释下方 // Implementation ,则应假定成员可能会在将来的 MFC 版本中更改。

另请参阅

常规 MFC 主题