Compartir a través de


TN001: Registro de clases de ventana

En esta nota se describen las rutinas MFC que registran las clases WNDCLASS que necesita Microsoft Windows. Se describen los atributos específicos WNDCLASS usados por MFC y Windows.

El problema

Los atributos de un objeto CWnd, como un identificador HWND en Windows, se almacenan en dos lugares: el objeto de ventana y WNDCLASS. El nombre del WNDCLASS se pasa a funciones generales de creación de ventanas, como CWnd::Create y CFrameWnd::Create, en el parámetro lpszClassName.

WNDCLASS debe registrarse mediante uno de los cuatro medios:

Campos WNDCLASS

La WNDCLASS estructura consta de varios campos que describen una clase de ventana. En la tabla siguiente se muestran los campos y se especifica cómo se usan en una aplicación MFC:

Campo Descripción
lpfnWndProc Proc. de ventana, debe ser un AfxWndProc
cbClsExtra no se usa (debe ser cero)
cbWndExtra no se usa (debe ser cero)
hInstance rellena automáticamente con AfxGetInstanceHandle
hIcon icono para ventanas de marco, consulte a continuación.
hCursor cursor para cuando el ratón está sobre la ventana, ver más abajo.
hbrBackground color de fondo, consulte a continuación
lpszMenuName no se usa (debe ser NULL)
lpszClassName nombre de clase, consulte a continuación.

Clases WNDCLASS proporcionadas

Las versiones anteriores de MFC (antes de MFC 4.0), proporcionaron varias clases de Ventana predefinidas. Estas clases Window ya no se proporcionan de forma predeterminada. Las aplicaciones deben usar AfxRegisterWndClass con los parámetros adecuados.

Si la aplicación proporciona un recurso con el identificador de recurso especificado (por ejemplo, AFX_IDI_STD_FRAME), MFC usará ese recurso. De lo contrario, usará el recurso predeterminado. Para el icono, se usa el icono de aplicación estándar y, para el cursor, se usa el cursor de flecha estándar.

Dos iconos admiten aplicaciones MDI con tipos de documento únicos: un icono para la aplicación principal, el otro para las ventanas MDIChild y documentos emblemáticos. Para varios tipos de documentos con diferentes iconos, debe registrar elementos WNDCLASS adicionales o usar la función CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame registrará un WNDCLASS mediante el identificador de icono que especifique como primer parámetro y los siguientes atributos estándar:

  • estilo de clase : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • icono AFX_IDI_STD_FRAME

  • cursor de flecha

  • color de fondo COLOR_WINDOW

Los valores de color de fondo y cursor para CMDIFrameWnd no se usan, ya que el área de cliente del CMDIFrameWnd está completamente cubierta por la ventana MDICLIENT. Microsoft no recomienda la subclase de la ventana MDICLIENT , por lo que usa los colores estándar y los tipos de cursor siempre que sea posible.

Controles de subclases y superclases

Si subclases o superclases un control de Windows (por ejemplo, CButton), la clase obtiene automáticamente los WNDCLASS atributos proporcionados en la implementación de Windows de ese control.

Función AfxRegisterWndClass

MFC proporciona una función auxiliar para registrar una clase de ventana. Dado un conjunto de atributos (estilo de clase de ventana, cursor, pincel de fondo e icono), se genera un nombre sintético y se registra la clase de ventana resultante. Por ejemplo

const char* AfxRegisterWndClass(UINT nClassStyle,
    HCURSOR hCursor,
    HBRUSH hbrBackground,
    HICON hIcon);

Esta función devuelve una cadena temporal del nombre de clase de ventana registrado generado. Para obtener más información sobre esta función, vea AfxRegisterWndClass.

La cadena devuelta es un puntero temporal a un búfer de cadena estático. Es válido hasta la siguiente llamada a AfxRegisterWndClass. Si desea mantener esta cadena alrededor, almacénela en una variable CString , como en este ejemplo:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClass producirá una excepción CResourceException si la clase de ventana no se pudo registrar (ya sea debido a parámetros incorrectos o a memoria insuficiente de Windows).

Funciones RegisterClass y AfxRegisterClass

Si quieres hacer algo más sofisticado que lo que AfxRegisterWndClass proporciona, puedes llamar a la API RegisterClass de Windows o a la función AfxRegisterClassMFC . Las CWndfunciones , CFrameWnd y CMDIChildWndCreate toman un nombre de cadena lpszClassName para la clase de ventana como primer parámetro. Puede usar cualquier nombre de clase de ventana registrado, independientemente del método que usó para registrarlo.

Es importante usar AfxRegisterClass (o AfxRegisterWndClass) en un archivo DLL en Win32. Win32 no anula automáticamente el registro de clases registradas por un archivo DLL, por lo que debe anular explícitamente el registro de clases cuando finalice el archivo DLL. Esto se controla automáticamente al usar AfxRegisterClass en lugar de RegisterClass. AfxRegisterClass mantiene una lista de clases únicas registradas por el archivo DLL y las anulará automáticamente cuando finalice el archivo DLL. Cuando se usa RegisterClass en un archivo DLL, debe asegurarse de que todas las clases no se registran cuando finaliza el archivo DLL (en la función DllMain ). Si no lo hace, podría producirse un error inesperado en RegisterClass cuando otra aplicación cliente intenta usar su DLL.

Consulte también

Notas técnicas por número
Notas Técnicas por Categoría