Utilisation des fichiers sources MFC
La bibliothèque MFC (Microsoft Foundation Class) fournit du code source complet. Les fichiers d’en-tête (.h) se trouvent dans le répertoire \atlmfc\include . Les fichiers d’implémentation (.cpp) se trouvent dans le répertoire \atlmfc\src\mfc .
Cet article explique les conventions que MFC utilise pour commenter les différentes parties de chaque classe, ce que ces commentaires signifient et ce que vous devez vous attendre à trouver dans chaque section. Les Assistants Visual Studio utilisent des conventions similaires pour les classes qu’ils créent pour vous, et vous trouverez probablement ces conventions utiles pour votre propre code.
Vous connaissez peut-être les public
protected
mot clé , C++ et private
C++. Dans les fichiers d’en-tête MFC, vous trouverez que chaque classe peut avoir plusieurs d’entre elles. Par exemple, les variables et fonctions membres publiques peuvent se trouver sous plusieurs public
mot clé. C’est parce que MFC sépare les variables membres et les fonctions en fonction de leur utilisation, et non par le type d’accès autorisé. MFC utilise private
avec parcimonie. Même les éléments considérés comme les détails de l’implémentation sont souvent protected
, et plusieurs fois sont public
. Bien que l’accès aux détails de l’implémentation soit déconseillé, MFC vous laisse la décision.
Dans les fichiers sources MFC et les fichiers d’en-tête créés par l’Assistant Application MFC, vous trouverez des commentaires comme ceux-ci dans les déclarations de classe (généralement dans cet ordre) :
// Constructors
// Attributes
// Operations
// Overridables
// Implementation
Un exemple des commentaires
La liste partielle suivante de classes CStdioFile
utilise la plupart des commentaires standard utilisés par MFC dans ses classes pour diviser les membres de classe par les méthodes utilisées :
/*============================================================================*/
// 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);
};
Ces commentaires marquent constamment les sections de la déclaration de classe qui contiennent des types similaires de membres de classe. N’oubliez pas qu’il s’agit de conventions MFC, et non de définir des règles.
Commentaire des constructeurs
La // Constructors
section d’une déclaration de classe MFC déclare des constructeurs (au sens C++) et toutes les fonctions d’initialisation requises pour utiliser réellement l’objet. Par exemple, CWnd::Create
se trouve dans la section constructeurs, car avant d’utiliser l’objet CWnd
, il doit être « entièrement construit » en appelant d’abord le constructeur C++, puis en appelant la Create
fonction. En règle générale, ces membres sont publics.
Par exemple, la classe CStdioFile
a cinq constructeurs, dont l’un est affiché dans la liste sous Un exemple de commentaires.
Commentaire d’attributs
La // Attributes
section d’une déclaration de classe MFC contient les attributs publics (ou propriétés) de l’objet. En règle générale, les attributs sont des variables membres ou des fonctions Get/Set. Les fonctions « Get » et « Set » peuvent ou non être virtuelles. Les fonctions « Get » sont souvent const
, car dans la plupart des cas, elles n’ont pas d’effets secondaires. Ces membres sont normalement publics. Les attributs protégés et privés se trouvent généralement dans la section d’implémentation.
Dans l’exemple de liste de la classe CStdioFile
, sous Un exemple de commentaires, la liste inclut une variable membre, m_pStream. La classe CDC
répertorie près de 20 membres sous ce commentaire.
Remarque
Les classes volumineuses, telles que CDC
et CWnd
, peuvent avoir tant de membres qui répertorient simplement tous les attributs d’un groupe n’ajouteraient pas beaucoup à la clarté. Dans ce cas, la bibliothèque de classes utilise d’autres commentaires comme en-têtes pour délimiter davantage les membres. Par exemple, CDC
utilise // Device-Context Functions
, , // Drawing Attribute Functions
// Drawing Tool Functions
, et bien plus encore. Les groupes qui représentent des attributs suivent la syntaxe habituelle décrite ci-dessus. De nombreuses classes OLE ont une section d’implémentation appelée // Interface Maps
.
Commentaire des opérations
La // Operations
section d’une déclaration de classe MFC contient des fonctions membres que vous pouvez appeler sur l’objet pour effectuer des actions ou effectuer des actions (effectuer des opérations). Ces fonctions ne sont généralement pas,const
car elles ont généralement des effets secondaires. Elles peuvent être virtuelles ou non virtuelles en fonction des besoins de la classe. En règle générale, ces membres sont publics.
Dans l’exemple de liste de classe CStdioFile
, dans Un exemple de commentaires, la liste inclut trois fonctions membres sous ce commentaire : WriteString
et deux surcharges de ReadString
.
Comme pour les attributs, les opérations peuvent être subdivées.
Commentaire substituable
La // Overridables
section d’une déclaration de classe MFC contient des fonctions virtuelles que vous pouvez remplacer dans une classe dérivée lorsque vous devez modifier le comportement de la classe de base. Ils sont généralement nommés à partir de « On », bien qu’il ne soit pas strictement nécessaire. Les fonctions ici sont conçues pour être remplacées, et implémentent souvent ou fournissent une sorte de « rappel » ou de « hook ». En règle générale, ces membres sont protégés.
Dans MFC lui-même, les fonctions virtuelles pures sont toujours placées dans cette section. Une fonction virtuelle pure en C++ prend la forme :
virtual void OnDraw( ) = 0;
Dans l’exemple de liste de la classe CStdioFile
, dans Un exemple de commentaires, la liste n’inclut aucune section substituable. En revanche, la classe CDocument
répertorie environ 10 fonctions membres substituables.
Dans certaines classes, vous pouvez également voir le commentaire // Advanced Overridables
. Ces fonctions sont celles que seuls les programmeurs avancés doivent tenter de remplacer. Vous n’aurez probablement jamais besoin de les remplacer.
Remarque
Les conventions décrites dans cet article fonctionnent également bien, en général, pour les méthodes et propriétés Automation (anciennement OLE Automation). Les méthodes d’automatisation sont similaires aux opérations MFC. Les propriétés d’automatisation sont similaires aux attributs MFC. Les événements Automation (pris en charge pour les contrôles ActiveX, anciennement appelés contrôles OLE) sont similaires aux fonctions membres substituables MFC.
Commentaire d’implémentation
La // Implementation
section est la partie la plus importante de toute déclaration de classe MFC.
Cette section contient tous les détails de l’implémentation. Les variables membres et les fonctions membres peuvent apparaître dans cette section. Tout ce qui se trouve en dessous de cette ligne pourrait changer dans une prochaine version de MFC. Sauf si vous ne pouvez pas l’éviter, vous ne devez pas vous appuyer sur les détails sous la // Implementation
ligne. En outre, les membres déclarés sous la ligne d’implémentation ne sont pas documentés, bien que certaines implémentations soient abordées dans les notes techniques. Les remplacements de fonctions virtuelles dans la classe de base résident dans cette section, quelle que soit la section dans laquelle la fonction de classe de base est définie. Lorsqu’une fonction remplace l’implémentation de classe de base, elle est considérée comme un détail d’implémentation. En règle générale, ces membres sont protégés, mais pas toujours.
Dans la CStdioFile
liste sous Un exemple de commentaires, les membres déclarés sous le // Implementation
commentaire peuvent être déclarés en tant que public
, protected
ou private
. Utilisez uniquement ces membres avec prudence, car ils peuvent changer à l’avenir. La déclaration d’un groupe de membres comme public
peut être nécessaire pour que l’implémentation de la bibliothèque de classes fonctionne correctement. Toutefois, cela ne signifie pas que vous pouvez utiliser en toute sécurité les membres ainsi déclarés.
Remarque
Vous pouvez trouver des commentaires des types restants au-dessus ou en dessous du // Implementation
commentaire. Dans les deux cas, ils décrivent les types de membres déclarés ci-dessous. S’ils se produisent sous le // Implementation
commentaire, vous devez supposer que les membres peuvent changer dans les versions ultérieures de MFC.