Microsoft Foundation Class (MFC) 連結庫提供完整的原始程式碼。 頭檔 (.h) 位於 \atlmfc\include 目錄中。 實作檔案 (.cpp) 位於 \atlmfc\src\mfc 目錄中。
本文說明 MFC 用於註釋每個類別各個部分的慣例、這些註釋的意義,以及您應該在每個區段中尋找什麼。 Visual Studio 精靈會針對為您建立的類別使用類似的慣例,而且您可能會發現這些慣例適用於您自己的程式代碼。
您可能熟悉 public
、 protected
和 private
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” 函式可能不是虛擬的。 「取得」函式通常是 const
,因為在大部分情況下,它們不會有副作用。 這些成員通常是公開的。 通常可在實作區段中找到受保護的和私用屬性。
在類別 CStdioFile
的範例清單中,在 批注範例下,清單包含一個成員變數, m_pStream。 類別 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 類別宣告的 區段包含虛擬函式,當您需要修改基類行為時,您可以在衍生類別中覆寫這些函式。 它們通常會以 「On」 開頭命名,但並非絕對必要。 這裡的函式被設計用來覆寫,且通常會實作或發揮某種「回呼函數」或「勾子」的功能。一般而言,這些成員通常是受到保護的。
在 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 版本中變更。