Поделиться через


Использование файлов с исходным кодом MFC

Библиотека классов Microsoft Foundation (MFC) предоставляет полный исходный код. Файлы заголовков (.h) находятся в каталоге \atlmfc\include . Файлы реализации (CPP) находятся в каталоге \atlmfc\src\mfc .

В этой статье описываются соглашения, которые MFC использует для комментариев различных частей каждого класса, значения этих комментариев и того, что следует ожидать в каждом разделе. Мастера Visual Studio используют аналогичные соглашения для классов, которые они создают для вас, и вы, вероятно, найдете эти соглашения, полезные для собственного кода.

Возможно, вы знакомы с publicprotectedключевое слово, а private также ключевое слово C++. В файлах заголовков MFC каждый класс может иметь несколько из них. Например, переменные и функции общедоступных членов могут находиться в нескольких public ключевое слово. Это связано с тем, что MFC разделяет переменные-члены и функции на основе их использования, а не по типу разрешенного доступа. MFC использует смешно private . Даже элементы, которые считаются publicподробными сведениями о реализации, часто protectedявляются и много раз. Хотя доступ к деталям реализации не рекомендуется, 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используются, так как в большинстве случаев они не имеют побочных эффектов. Обычно эти члены являются общедоступными. Защищенные и частные атрибуты обычно находятся в разделе реализации.

В примере перечисления из класса в разделе "Пример комментариев" список включает одну переменную члена m_pStream.CStdioFile Класс CDC перечисляет почти 20 членов под этим комментарием.

Примечание.

Большие классы, такие как CDC и CWnd, могут иметь так много членов, что просто перечислять все атрибуты в одной группе не будет добавлять много в ясность. В таких случаях библиотека классов использует другие комментарии в качестве заголовков для дальнейшего обозначения элементов. Например, CDC использует // Device-Context Functions, // Drawing Tool Functions// Drawing Attribute Functionsи многое другое. Группы, представляющие атрибуты, будут соответствовать обычному синтаксису, описанному выше. Многие классы OLE имеют раздел // Interface Mapsреализации.

Комментарий операций

В // Operations разделе объявления класса MFC содержатся функции-члены, которые можно вызвать для объекта, чтобы сделать это действие или предпринять действия (выполнять операции). Обычно эти функции не являются побочнымиconst эффектами, так как они обычно имеют побочные эффекты. Они могут быть виртуальными или невиртуальными в зависимости от потребностей класса. Как правило, эти члены являются общедоступными.

В примере перечисления из класса CStdioFileв примере комментариев список включает три функции-члены под этим комментарием: WriteString и две перегрузки ReadString.

Как и атрибуты, операции можно разделить дальше.

Переопределимые комментарии

Раздел // Overridables объявления класса MFC содержит виртуальные функции, которые можно переопределить в производном классе, когда необходимо изменить поведение базового класса. Обычно они называются с "Вкл.", хотя это не обязательно. Функции здесь предназначены для переопределения, а также часто реализуют или предоставляют какой-то "обратный вызов" или "перехватчик". Как правило, эти члены защищены.

В самом MFC чистые виртуальные функции всегда помещаются в этот раздел. Чистая виртуальная функция в C++ принимает форму:

virtual void OnDraw( ) = 0;

В примере перечисления из класса CStdioFileв примере примечаний список не содержит раздел переопределения. С другой стороны, класс CDocumentперечисляет примерно 10 переопределиемых функций-членов.

В некоторых классах также может отображаться комментарий // Advanced Overridables. Эти функции являются теми, которые должны пытаться переопределить только расширенные программисты. Вам, вероятно, никогда не нужно переопределять их.

Примечание.

Соглашения, описанные в этой статье, также хорошо работают, как правило, для методов и свойств автоматизации (ранее известных как OLE Automation). Методы автоматизации похожи на операции MFC. Свойства автоматизации похожи на атрибуты MFC. События автоматизации (поддерживаемые для элементов ActiveX, ранее известные как элементы управления OLE) похожи на переопределенные функции-члены MFC.

Комментарий о реализации

Раздел // Implementation является самой важной частью любого объявления класса MFC.

В этом разделе содержатся все сведения о реализации. Переменные-члены и функции-члены могут отображаться в этом разделе. Все ниже этой строки может измениться в будущем выпуске MFC. Если вы не можете избежать этого, вы не должны полагаться на сведения под строкой // Implementation . Кроме того, члены, объявленные под строкой реализации, являются незадокументированы, хотя некоторые реализации рассматриваются в технических заметках. Переопределения виртуальных функций в базовом классе находятся в этом разделе, независимо от того, в каком разделе определена функция базового класса. Когда функция переопределяет реализацию базового класса, она считается подробной реализацией. Как правило, эти члены защищены, но не всегда.

В списке CStdioFile в разделе "Пример комментариев" участники, объявленные под // Implementation комментарием, могут быть объявлены как public, protectedили private. Используйте только эти члены с осторожностью, так как они могут измениться в будущем. Объявление группы членов, которые public могут потребоваться для правильной работы реализации библиотеки классов. Тем не менее, это не означает, что вы можете безопасно использовать членов, так объявленных.

Примечание.

Вы можете найти комментарии оставшихся типов выше или ниже // Implementation комментария. В любом случае они описывают виды членов, объявленных под ними. Если они происходят под // Implementation комментарием, следует предположить, что члены могут измениться в будущих версиях MFC.

См. также

Общие разделы по MFC