TN001: Registro de clase de ventana

Esta nota describe las rutinas MFC que registrar el especial es WNDCLASSnecesario Microsoft Windows. Atributos de clase WNDCLASS específicos utilizan por MFC y Windows se discuten.

El problema

Los atributos de un objeto CWnd , como un HWND en Windows, se almacenan en dos lugares: el objeto de la ventana y la WNDCLASS. Una clase WNDCLASS es diferente de una clase de C++. El nombre de la clase WNDCLASS se pasa a las funciones de creación de ventana general como CWnd y CFrameWnd::Create en el parámetro lpszClassName.

Esta clase WNDCLASS debe estar registrado a través de uno de los cuatro medios:

WNDCLASSes y MFC

La estructura WNDCLASS consta de diversos campos que describen una clase de ventana. A continuación está los campos y cómo se utilizan en una aplicación MFC.

Estilo Estilo de ventana: ver abajo
LpfnWndProc ventana proc, debe ser AfxWndProc
CbClsExtra no utilizar (debe ser cero)
CbWndExtra no utilizar (debe ser cero)
HInstance se rellena automáticamente con AfxGetInstanceHandle
HIcon icono para ventanas de marco, véase más abajo
HCursor cursor cuando el ratón está sobre la ventana, ver abajo
HbrBackground color de fondo, véase más abajo
LpszMenuName no utilizar (debe ser NULL)
LpszClassName nombre de la clase, véase más abajo

Siempre WNDCLASSes

En versiones anteriores de MFC (anteriores a la 4.0 de MFC), hubo una serie de clases de ventana predefinidas proporcionadas. Estas clases de ventana ya no se proporcionan de forma predeterminada debido a problemas técnicos relacionados con el control de versiones (varias versiones de MFC cargadas en el espacio de una dirección), así como preocupaciones relacionadas con el hecho de que las aplicaciones MFC y controles OLE pueden utilizar los archivos DLL de MFC.

La siguiente referencia se proporciona para ayudar a migrar código que utiliza estas proporcionada anteriormente WNDCLASSes. Las aplicaciones deben utilizar AfxRegisterWndClass (con los parámetros adecuados) en lugar de estas clases.

A continuación muestran las clases y sus atributos:

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

Hay dos iconos que soportan las aplicaciones MDI con tipos de documento único (un icono de la aplicación principal, el otro icono de documento/MDIChild icónico windows). Para varios tipos de documentos con iconos distintos, debe registrar adicionales es WNDCLASSo utilizar la función de CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame registrará automáticamente un WNDCLASS utilizando los atributos estándar de "AfxFrameOrView" pero con el identificador de icono especificar como primer parámetro a LoadFrame.

Los valores de color de fondo y el cursor para el MDIFrameWnd no se utilizan desde el área de cliente de la MDIFrameWnd está completamente cubierto por la ventana "MDICLIENT". Microsoft no alentar así crear subclases de la ventana de "MDICLIENT" usan los colores estándar y tipos de cursor cuando sea posible.

Crear subclases de controles

Si usted subclase o superclase un Windows control (por ejemplo, CButton), a continuación, la clase automáticamente obtiene los atributos de clase WNDCLASS proporcionados en la aplicación de Windows de ese control.

La función AfxRegisterWndClass

MFC proporciona una rutina auxiliar para el registro de una clase de ventana. Dado un conjunto de atributos (estilo de clase de ventana, cursor, pincel de fondo y icono), se genera un nombre sintético, y la clase de ventana resultante está registrada. 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 registrados generados. Consulte la Referencia de la biblioteca de clases para obtener más detalles.

La cadena devuelta es un puntero a un búfer de cadena estática que es válido hasta la siguiente llamada a AfxRegisterWndClasstemporal. Si desea mantener esta cadena alrededor, almacenarlo en una variable de CString . Por ejemplo,

CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
CWnd * Night = CWnd nuevo;
Night-gt;Crear (strWndClass,...);

AfxRegisterWndClass generará un CResourceException si la clase de ventana error al registrar (debido a parámetros erróneos o fuera de la memoria de Windows).

Las funciones de AfxRegisterClass y RegisterClass

Si quieres hacer algo más sofisticado que lo que ofrece AfxRegisterWndClass , puede llamar a la API de Windows RegisterClass o la función MFC AfxRegisterClass. El CWnd, CFrameWnd y CMDIChildWnd crear funciones toman un nombre de cadena de lpszClassName para la clase de ventana como primer parámetro. Puede utilizar cualquier nombre de clase de ventana, independientemente de cómo se registró.

Es importante utilizar AfxRegisterClass (o AfxRegisterWndClass) en un archivo DLL de Win32. Win32 no anular automáticamente las clases registradas por un archivo DLL, por lo que esto debe hacerse explícitamente cuando se termina la DLL. Usando AfxRegisterClass en lugar de RegisterClass , esto se realiza automáticamente para usted. AfxRegisterClass mantiene una lista de clases únicas registradas por el archivo DLL y automáticamente será anular, a continuación, cuando termina la DLL. Cuando se utiliza RegisterClass en un archivo DLL, debe asegurarse de que todas las clases están registradas cuando la DLL está terminada (en su función DllMain ). No hacerlo puede causar RegisterClass a fallar inesperadamente cuando se utiliza el archivo DLL por otra aplicación de cliente.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index