Share via


TN001: Registro de clases de ventana

Esta nota describe las rutinas de MFC que registran Clase WNDCLASSespecial es necesario por Microsoft Windows. Los atributos específicos de WNDCLASS utilizados por MFC y Windows se tratan.

El problema

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

Este WNDCLASS se debe registrar con uno de cuatro significa:

  • Implícitamente mediante MFC proporcionada WNDCLASS.

  • Implícitamente haciendo subclases un control de Windows (o algún otro control).

  • Explícitamente llamando a MFC AfxRegisterWndClass o AfxRegisterClass.

  • Llamando explícitamente a la rutina RegisterClassde Windows.

Campos de clase WNDCLASS

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

Campo

Descripción

lpfnWndProc

el procedimiento de ventana, debe ser AfxWndProc

cbClsExtra

no utilizado (debe ser cero)

cbWndExtra

no utilizado (debe ser cero)

hInstance

rellenado automáticamente con AfxGetInstanceHandle

hIcon

el icono de las ventanas de marco, vea abajo

hCursor

el cursor para cuando el mouse está sobre la ventana, vea abajo

hbrBackground

el color de fondo, vea abajo

lpszMenuName

no utilizado (debe ser NULL)

lpszClassName

el nombre de clase, vea abajo

WNDCLASSes proporcionado

Versiones anteriores de MFC (antes de MFC 4,0), siempre que varias clases de ventana predefinidas. Estas clases de ventana se ya no proporcionan de forma predeterminada. Las aplicaciones deben utilizar AfxRegisterWndClass con los parámetros adecuados.

Si la aplicación proporciona un recurso con el Id. de recurso especificado (por ejemplo, AFX_IDI_STD_FRAME), MFC utilizará ese recurso. Si no utilizará el recurso predeterminado. Para el icono, se utiliza el icono de aplicación estándar, y para el cursor, se utiliza la flecha estándar el cursor.

Dos iconos admiten las aplicaciones MDI con los únicos tipos de documento: un icono de la aplicación principal, el otro icono del documento y las ventanas icónicos de MDIChild. Para los tipos de documento varias con iconos diferentes, debe registrar WNDCLASSadicional es o utilizar la función de CFrameWnd::LoadFrame .

CFrameWnd::LoadFrame registrará WNDCLASS utilizando el identificador del icono que se especifica como primer parámetro y los atributos estándar siguientes:

  • estilos de clase: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • icono AFX_IDI_STD_FRAME

  • flecha cursor

  • Color de fondo de COLOR_WINDOW

Los valores para el color de fondo y el cursor para CMDIFrameWnd no se utilizan como el área cliente de CMDIFrameWnd es cubierta completamente por la ventana de MDICLIENT . Microsoft no anima crear subclases de la ventana de MDICLIENT de modo que utilice colores estándar y los tipos de cursor cuando sea posible.

Crear subclases y creando superclases Controles

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

La función de Clase

MFC proporciona una función auxiliar para registrar una clase de ventana. Dado un conjunto de atributos (estilos de clase de ventana, el cursor, pincel de fondo, e icono), se genera un nombre sintetizado, 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 en un búfer de cadena estático. Es válida hasta la siguiente llamada a AfxRegisterWndClass. Si desea conservar esta cadena sobre, almacenarlos en una variable de CString , como en este ejemplo:

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

AfxRegisterWndClass producirá CResourceException si la clase de ventana no podría para registrar (debido a parámetros incorrectos, o fuera de memoria de Windows).

Las funciones de RegisterClass y de AfxRegisterClass

Si desea hacer algo compleja que AfxRegisterWndClass proporciona, puede llamar a la API de Windows RegisterClass o la función AfxRegisterClassMFC. CWnd, CFrameWnd y las funciones de CMDIChildWndCreate toman un nombre de cadena de lpszClassName para la clase de ventana como primer parámetro. Puede utilizar cualquier nombre de clase de ventana registrado, independientemente del método que lo registrando.

Es importante utilizar AfxRegisterClass (o AfxRegisterWndClass) en un archivo DLL en Win32. Win32 no automáticamente las clases de registro registradas por el archivo DLL, por lo que debe explícitamente las clases del registro cuando finaliza el archivo DLL. Mediante AfxRegisterClass en lugar de RegisterClass esto se administra automáticamente para usted. AfxRegisterClass mantiene una lista de clases únicas registradas por el archivo DLL y automáticamente con ellos cuando DLL finaliza. Cuando se utiliza RegisterClass en un archivo DLL, deberá asegurarse de que todas las clases no son registradas cuando finaliza DLL (en función de DllMain ). Error al realizar esta podría hacer RegisterClass para producir un error inesperado mientras otra aplicación cliente intenta utilizar el archivo DLL.

Vea también

Otros recursos

Notas técnicas por número

Notas técnicas por categoría