Compartir a través de


Uso de los archivos de código fuente de MFC

La biblioteca MFC (Microsoft Foundation Class) proporciona código fuente completo. Los archivos de encabezado (.h) están en el directorio \atlmfc\include. Los archivos de implementación (.cpp) están en el directorio \atlmfc\src\mfc.

En este artículo se explican las convenciones que MFC usa para comentar las distintas partes de cada clase, lo que significan estos comentarios y lo que debe esperar encontrar en cada sección. Los asistentes de Visual Studio usan convenciones similares para las clases que crean de manera automática y probablemente encontrará estas convenciones útiles para su propio código.

Es posible que esté familiarizado con las palabras clave de C++ public, protected y private. En los archivos de encabezado MFC, encontrará que cada clase puede tener varias de ellas. Por ejemplo, las variables y funciones miembro públicas pueden estar bajo más de una palabra clave public. Esto se debe a que MFC separa las variables y funciones miembro en función de su uso, no según el tipo de acceso permitido. MFC usa private con moderación. Incluso los elementos considerados como detalles de implementación suelen ser protected, y muchas veces son public. Aunque se desaconseja el acceso a los detalles de la implementación, MFC le permite decidir.

En los archivos de origen de MFC y en los archivos de encabezado que crea el Asistente para aplicaciones MFC, encontrará comentarios como estos dentro de las declaraciones de clase (normalmente en este orden):

// Constructors

// Attributes

// Operations

// Overridables

// Implementation

Un ejemplo de los comentarios

En la siguiente lista parcial de clases CStdioFile se usan la mayoría de los comentarios estándar que MFC emplea en sus clases para dividir los miembros de clase por las maneras en que se usan:

/*============================================================================*/
// 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);
};

Estos comentarios marcan de forma coherente secciones de la declaración de clase que contienen tipos similares de miembros de clase. Tenga en cuenta que son convenciones de MFC, no establecen reglas.

Comentario de // Constructors

La sección // Constructors de una declaración de clase MFC declara constructores (en el sentido de C++) y las funciones de inicialización necesarias para usar realmente el objeto. Por ejemplo, CWnd::Create se encuentra en la sección de constructores porque antes de usar el objeto CWnd, debe estar "totalmente construido", para lo cual, primero se llama al constructor de C++ y, a continuación, a la función Create. Normalmente, estos miembros son públicos.

Por ejemplo, la clase CStdioFile tiene cinco constructores, uno de los cuales se muestra en la lista en Un ejemplo de los comentarios.

Comentario de // Attributes

La sección // Attributes de una declaración de clase MFC contiene los atributos públicos (o propiedades) del objeto. Normalmente, los atributos son variables miembro o funciones Get/Set. Las funciones "Get" y "Set" pueden ser virtuales o no. Las funciones "Get" suelen ser const, porque en la mayoría de los casos no tienen efectos secundarios. Estos miembros son normalmente públicos. Los atributos protegidos y privados se encuentran normalmente en la sección de implementación.

En la lista de ejemplo de la clase CStdioFile, en Un ejemplo de los comentarios, la lista incluye una variable miembro, m_pStream. La clase CDC enumera casi 20 miembros bajo este comentario.

Nota:

Las clases grandes, como CDC y CWnd, pueden tener tantos miembros que la simple enumeración de todos los atributos de un grupo no agregaría mucha claridad. En tales casos, la biblioteca de clases usa otros comentarios, como los encabezados, para delimitar aún más los miembros. Por ejemplo, CDC usa // Device-Context Functions, // Drawing Tool Functions, // Drawing Attribute Functions y más. Los grupos que representan atributos seguirán la sintaxis habitual descrita anteriormente. Muchas clases OLE tienen una sección de implementación denominada // Interface Maps.

Comentario de // Operations

La sección // Operations de una declaración de clase MFC contiene funciones miembro a las que puede llamar en el objeto para hacer cosas o realizar acciones (efectuar operaciones). Normalmente, estas funciones no son const porque suelen tener efectos secundarios. Pueden ser virtuales o no virtuales en función de las necesidades de la clase. Normalmente, estos miembros son públicos.

En la lista de ejemplo de la clase CStdioFile, en Un ejemplo de los comentarios, la lista incluye tres funciones miembro en este comentario: WriteString y dos sobrecargas de ReadString.

Al igual que con los atributos, las operaciones se pueden subdividir aún más.

Comentario de // Overridables

La sección // Overridables de una declaración de clase MFC contiene funciones virtuales que puede invalidar en una clase derivada cuando necesite modificar el comportamiento de la clase base. Normalmente su nombre empieza por "On", aunque no es estrictamente necesario. Estas funciones están diseñadas para invalidarse y, a menudo, implementan o proporcionan algún tipo de "devolución de llamada" o "enlace". Normalmente, estos miembros están protegidos.

En MFC, las funciones virtuales puras siempre se colocan en esta sección. Una función virtual pura en C++ tiene la forma:

virtual void OnDraw( ) = 0;

En la lista de ejemplo de la clase CStdioFile, en Un ejemplo de los comentarios, la lista no incluye ninguna sección de reemplazables. Por otro lado, la clase CDocument enumera aproximadamente 10 funciones miembro reemplazables.

En algunas clases, también puede ver el comentario // Advanced Overridables. Estas funciones son las que solo los programadores avanzados deben intentar invalidar. Probablemente nunca tendrá que invalidarlas.

Nota:

Las convenciones descritas en este artículo también funcionan bien, en general, para los métodos y propiedades de la automatización (anteriormente conocida como automatización OLE). Los métodos de automatización son similares a las operaciones de MFC. Las propiedades de automatización son similares a los atributos de MFC. Los eventos de automatización (compatibles con los controles ActiveX, anteriormente conocidos como controles OLE) son similares a las funciones miembro reemplazables de MFC.

Comentario de // Implementation

La sección // Implementation es la parte más importante de cualquier declaración de clase MFC.

En esta sección se incluyen todos los detalles de la implementación. En esta sección, pueden aparecer tanto las variables miembro como las funciones miembro. Todo lo que está por debajo de esta línea podría cambiar en una futura versión de MFC. A menos que no pueda evitarlo, no debe confiar en los detalles debajo de la línea // Implementation. Además, los miembros declarados debajo de la línea de implementación no están documentados, aunque algunas implementaciones se describen en notas técnicas. Las invalidaciones de las funciones virtuales de la clase base residen en esta sección, independientemente de la sección en la que se define la función de clase base. Cuando una función invalida la implementación de la clase base, se considera un detalle de implementación. Normalmente, estos miembros están protegidos, pero no siempre.

En la lista CStdioFile en Un ejemplo de los comentarios, los miembros declarados debajo del comentario // Implementation pueden declararse como public, protectedo private. Use estos miembros con precaución, ya que pueden cambiar en el futuro. Declarar un grupo de miembros como public puede ser necesario para que la implementación de la biblioteca de clases funcione correctamente. Sin embargo, no significa que pueda usar de forma segura los miembros declarados.

Nota:

Puede encontrar comentarios de los tipos restantes por encima o por debajo del comentario // Implementation. En cualquier caso, describen los tipos de miembros declarados debajo de ellos. Si se producen debajo del comentario // Implementation, debe suponer que los miembros pueden cambiar en versiones futuras de MFC.

Consulte también

Temas generales de MFC