Red de conocimiento informático - Material del sitio web - ¡Todo el mundo sabe qué palabras necesitas saber para aprender a programar (lenguaje JAVA, C++ y C)!

¡Todo el mundo sabe qué palabras necesitas saber para aprender a programar (lenguaje JAVA, C++ y C)!

Después de leer el siguiente artículo introductorio sobre programación WINDOWS, comprenderá el 45% del mismo.

TN001: Registro de clases de Windows

Esta nota describe las rutinas MFC que registran los WNDCLASS especiales que necesita Microsoft Windows. Se analizan los atributos WNDCLASS específicos utilizados por MFC y Windows.

El problema

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

Esta WNDCLASS debe registrarse a través de uno de estos cuatro medios:

Implícitamente mediante WNDCLASS proporcionadas por MFC

Implícitamente mediante la subclasificación de un control de Windows (o algún otro control)

Explícitamente llamando a MFC AfxRegisterWndClass o AfxRegisterClass

Explícitamente llamando a la rutina de Windows RegisterClass

WNDCLASSes y MFC

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

Estilo Estilo de ventana: consulte a continuación

Proceso de ventana LpfnWndProc, debe ser AfxWndProc.

CbClsExtra no se usa (debe ser cero)

CbWndExtra no se usa (debe ser cero)

HInstance se completa automáticamente con AfxGetInstanceHandle

HIcon icono para ventanas de marco, ver más abajo

HCursor cursor para cuando el mouse está sobre la ventana, ver más abajo

HbrBackground

color de fondo, ver más abajo

LpszMenuName no utilizado (debe ser NULL)

Nombre de clase LpszClassName, ver más abajo

WNDCLASSes proporcionadas

En En versiones anteriores de MFC (antes de MFC 4.0), se proporcionaban varias clases de Windows predefinidas. Estas clases de Windows ya no se proporcionan de forma predeterminada debido a problemas técnicos relacionados con el control de versiones (varias versiones de MFC cargadas en un espacio de direcciones). como inquietudes relacionadas con el hecho de que tanto las aplicaciones MFC como los controles OLE pueden usar las DLL de MFC.

La siguiente referencia se proporciona para ayudar a migrar el código que usa estas WNDCLASS proporcionadas anteriormente. Las aplicaciones deben usar AfxRegisterWndClass (con el archivo apropiado). parámetros) en lugar de estas clases.

A continuación se muestran las clases y sus atributos:

"AfxWnd" se utiliza para todas las ventanas secundarias creadas con CWnd::Create.

estilo de clase: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW

sin icono

cursor de flecha

sin color de fondo

"AfxFrameOrView" se utiliza para ventanas y vistas de marco (incluidos CFrameWnds y CMDIChildWnds independientes).

estilo de clase: CS_DBLCLKS | CS_HREDRAW;

icono AFX_IDI_STD_FRAME

flecha cursor

color de fondo COLOR_WINDOW

"AfxMDIFrame" se utiliza para la ventana de marco MDI (es decir, la principal) creada con CMDIFrameWnd::Create.

clase estilo: CS_DBLCLKS [reduce el flash durante el cambio de tamaño]

icono AFX_IDI_STD_MDIFRAME

cursor de flecha

sin color de fondo

"AfxControlBar" se utiliza para la implementación de la barra de control estándar.

estilo de clase: 0 [reduce el flash durante el cambio de tamaño, no se permiten dobles clics]

sin icono

cursor de flecha

color de fondo gris (COLOR_BTNFACE)

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

Hay dos íconos que admiten aplicaciones MDI con un solo elemento. tipos de documentos (un ícono para la aplicación principal, el otro ícono para documentos icónicos/ventanas MDIChild). Para múltiples tipos de documentos con diferentes íconos, debe registrar WNDCLASS adicionales o usar la función CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame registrará automáticamente un WNDCLASS usando los atributos estándar "AfxFrameOrView" pero usando el ID del icono que especifique como primer parámetro para LoadFrame.

Los valores para el color de fondo y el cursor para MDIFrameWnd son no se utiliza ya que el área de cliente de MDIFrameWnd está completamente cubierta por la ventana "MDICLIENT". Microsoft no recomienda la subclasificación de la ventana "MDICLIENT", así que utilice los colores y tipos de cursor estándar cuando sea posible.

Subclasificación Controles

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

de ese control.

La función AfxRegisterWndClass

MFC proporciona una rutina auxiliar para registrar una clase de ventana dado un conjunto de atributos (estilo de clase de ventana, cursor, pincel de fondo e ícono). ), se genera un nombre sintético resultante y se registra la clase de ventana. 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 registrada generada. Consulte la Referencia de la biblioteca de clases para obtener más detalles.

La cadena devuelta es un puntero temporal a un búfer de cadena estático que es válido hasta la próxima llamada. a AfxRegisterWndClass. Si desea conservar esta cadena, guárdela en una variable CString. Por ejemplo,

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

. .

CWnd* pWnd = nuevo CWnd;

pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClass generará una CResourceException si la clase de ventana no pudo registrarse (ya sea debido a parámetros incorrectos o por falta de memoria de Windows).

Las funciones RegisterClass y AfxRegisterClass

Si desea Para hacer algo más sofisticado que lo que proporciona AfxRegisterWndClass, puede llamar a la API de Windows RegisterClass o a la función MFC AfxRegisterClass. Las funciones CWnd, CFrameWnd y CMDIChildWnd Create toman un nombre de cadena lpszClassName para la clase de ventana como primer parámetro. utilizado, independientemente de h

Cómo se registró.

Es importante usar AfxRegisterClass (o AfxRegisterWndClass) en una DLL en Win32. Win32 no cancela automáticamente el registro de las clases registradas por una DLL, por lo que esto debe hacerse explícitamente cuando se finaliza la DLL. Al usar AfxRegisterClass en lugar de RegisterClass, esto se hace automáticamente. AfxRegisterClass mantiene una lista de clases únicas registradas por su DLL y se cancelará automáticamente cuando la DLL finalice. Cuando use RegisterClass en una DLL, debe asegurarse de que todas las clases no estén registradas. cuando se finaliza la DLL (en su función DllMain). No hacerlo puede provocar que RegisterClass falle inesperadamente cuando otra aplicación cliente utilice su DLL.

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

p>p>