Red de conocimiento informático - Conocimiento informático - ¿Cuál es la mejor palabra para usar al aprender a programar?

¿Cuál es la mejor palabra para usar al aprender a programar?

Después de leer el siguiente artículo introductorio sobre la programación en WINDOWS, con toda probabilidad lo sabrás.

TN001: Registro de clase de ventana

Esta nota describe las rutinas MFC para registrar la clase de viento especial requerida para Microsoft Windows. Describe las propiedades WNDCLASS específicas utilizadas por MFC y Windows.

El problema es

Al igual que HWND en Windows, las propiedades del objeto CWnd se almacenan en dos lugares: el objeto de ventana y WNDCLASS. WNDCLASS es diferente de la clase C. El nombre de WNDCLASS se pasa a las funciones normales de creación de ventanas, como CWnd::Create y CFrameWnd::Create en el parámetro lpszClassName.

Este WNDCLASS debe registrarse de una de las siguientes cuatro maneras:

WNDCLASS proporcionadas implícitamente por MFC

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

Llamar explícitamente a MFC AfxRegisterWndClass o AfxRegisterClass

Llamar explícitamente a la rutina de Windows RegisterClass

WNDCLASSes y MFC

La estructura WNDCLASS consta de varios campos describiendo la clase de ventana. A continuación se muestran los campos y su uso en aplicaciones MFC.

Estilo de ventana: vea la imagen a continuación

Procedimiento de ventana LpfnWndProc, debe ser AfxWndProc

CbClsExtra no se usa (debe ser cero)

CbWndExtra no se usa (debe ser cero)

HInstance llena automáticamente AfxGetInstanceHandle

El ícono de la ventana del marco, vea la imagen a continuación

El cursor cuando el el mouse está en la ventana, vea la imagen a continuación

Color de fondo HbrBackground, vea la imagen a continuación

LpszMenuName no se usa (debe ser NULL)

Clase LpszClassName nombre, ver más abajo

WNDCLASSes proporcionadas

En versiones anteriores de MFC (antes de MFC 4.0), se proporcionaban muchas clases de ventana predefinidas. Debido a problemas técnicos relacionados con el control de versiones (carga de varias versiones de MFC en un espacio de direcciones) y problemas relacionados con el posible uso de archivos DLL de MFC tanto por parte de aplicaciones MFC como de controles OLE, estas clases de ventana ya no se proporcionan de forma predeterminada.

Las referencias proporcionadas a continuación son útiles para migrar código que utiliza estos WNDCLASS proporcionados anteriormente. Las aplicaciones deben usar AfxRegisterWndClass (con los parámetros apropiados) en lugar de estas clases.

Estas clases y sus propiedades se muestran a continuación:

"AfxWnd" se usa 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 | CS_VREDRAW;

Icono AFX_IDI_Standard_Frame

Cursor de flecha

Color_Color de fondo de la ventana

"AfxMDIFrame" se utiliza para ventanas de marco MDI (es decir, ventanas principales) creadas con CMDIFrameWnd::Create.

estilo de clase: CS_DBLCLKS [reducir el flash al cambiar el tamaño]

icono AFX_IDI_STANDARD_MDIFRAME

cursor de flecha

ninguno Color de fondo

"AfxControlBar" se utiliza para implementaciones de barra de control estándar.

Estilo de categoría: 0 [Reducir el parpadeo al cambiar el tamaño, no hacer doble clic]

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 utiliza el recurso predeterminado. Para el ícono, use el ícono de aplicación estándar y para el cursor, use el cursor de flecha estándar.

Hay dos íconos para admitir aplicaciones MDI con un solo tipo de documento (un ícono para la aplicación principal y un ícono para el ícono de documento/ventana de mensaje MDI). Para varios tipos de documentos con diferentes íconos, debe registrar clases Wnd adicionales o usar la función CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame registrará automáticamente un WNDCLASS utilizando la propiedad estándar "AfxFrameOrView", pero utilizando el ID del icono que especifique como primer argumento de LoadFrame.

El color de fondo y el valor del cursor de MDIFrameWnd no se utilizan porque el área de cliente de MDIFrameWnd está completamente cubierta por la ventana "Cliente MDIC". Microsoft desaconseja la creación de subclases de ventanas "MDICLIENT", por lo tanto, utilice colores y tipos de cursor estándar siempre que sea posible.

Controles de subclases

Si usted es una subclase o superclase de un control de Windows (por ejemplo, CButton), entonces su clase obtendrá automáticamente el control proporcionado por la implementación de Windows. .

Función AfxRegisterWndClass

MFC proporciona una rutina auxiliar para registrar clases de ventanas. Dado un conjunto de propiedades (estilo de clase de ventana, cursor, pincel de fondo e icono), genere un nombre compuesto y registre la clase de ventana generada. Por ejemplo,

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

Esta función devuelve la cadena temporal generada del nombre de clase de ventana registrada. 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 la cadena, guárdela en una variable CString.

Por ejemplo,

CS string strwnd class = AfxRegisterWndClass(CS_dbl clk,...);

...

CWnd* pWnd = new CWnd;

pWnd-gt; create(strWndClass,...);

...

Si falla el registro de la clase de ventana (debido a parámetros incorrectos o Windows fuera de memoria), AfxRegisterWndClass generará una CResourceException.

Funciones RegisterClass y AfxRegisterClass

Si desea hacer algo más complejo 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 el nombre de cadena lpszClassName de la clase de ventana como primer parámetro. Se puede utilizar cualquier nombre de clase de ventana, independientemente de cómo se haya registrado.

Es importante utilizar AfxRegisterClass (o AfxRegisterWndClass) en su DLL en Win32. Win32 no cancela automáticamente el registro de las clases registradas por una DLL, por lo que se deben cancelar explícitamente cuando finaliza la DLL. Esto se hace automáticamente utilizando AfxRegisterClass en lugar de RegisterClass. Afx RegisterClass mantiene una lista de clases únicas registradas por su DLL y la cancela automáticamente cuando la DLL finaliza. Cuando utilice RegisterClass en una DLL, debe asegurarse de que todas las clases se cancelen cuando finalice la DLL (en la función DllMain). De lo contrario, 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