TN024: Mensajes y recursos definidos por MFC
Nota:
La nota técnica siguiente no se ha actualizado desde que se incluyó por primera vez en la documentación en línea. Como resultado, algunos procedimientos y temas podrían estar obsoletos o ser incorrectos. Para obtener información más reciente, se recomienda buscar el tema de interés en el índice de la documentación en línea.
En esta nota se describen los formatos de recursos y mensajes internos de Windows usados por MFC. Esta información explica la implementación del marco de trabajo y le ayudará a depurar la aplicación. Para las personas más aventureras, aunque toda esta información no se admita oficialmente, puede usar parte de esta información para implementaciones avanzadas.
Esta nota contiene detalles de implementación privada de MFC; todos los contenidos están sujetos a cambios en el futuro. Los mensajes privados de Windows MFC solo tienen significado en el ámbito de una aplicación, pero cambiarán en el futuro para que contengan mensajes en todo el sistema.
El intervalo de mensajes y tipos de recursos privados de Windows de MFC se encuentran en el intervalo reservado "sistema" que Microsoft Windows reserva. Actualmente no se usan todos los números de los intervalos y, en el futuro, se pueden usar nuevos números en el intervalo. Se pueden cambiar los números usados actualmente.
Los mensajes privados de Windows de MFC se encuentran en el intervalo 0x360->0x37F.
Los tipos de recursos privados de MFC se encuentran en el intervalo 0xF0->0xFF.
Mensajes privados de Windows de MFC
Estos mensajes de Windows se usan en lugar de funciones virtuales de C++ en las que se requiere un acoplamiento relativamente flexible entre objetos de ventana y donde una función virtual de C++ no sería adecuada.
Estos mensajes privados de Windows y las estructuras de parámetros asociadas se declaran en el encabezado privado MFC “AFXPRIV.H'. Tenga en cuenta que cualquier código que incluya este encabezado puede depender del comportamiento no documentado y probablemente se interrumpirá en versiones futuras de MFC.
En el caso raro de necesitar controlar uno de estos mensajes, debe usar la macro de asignación de mensajes ON_MESSAGE y controlar el mensaje en el formato LRESULT/WPARAM/LPARAM genérico.
WM_QUERYAFXWNDPROC
Este mensaje se envía a una ventana que se está creando. Esto se envía muy pronto en el proceso de creación como método para determinar si el WndProc es AfxWndProc. AfxWndProc devuelve 1.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa |
lParam | No se usa |
returns | 1 si AfxWndProc lo procesa |
WM_SIZEPARENT
Este mensaje se envía mediante una ventana de marco a sus elementos secundarios inmediatos durante el cambio de tamaño (CFrameWnd::OnSize
llama a CFrameWnd::RecalcLayout
que llama a CWnd::RepositionBars
) para cambiar la posición de las barras de control alrededor del lado del marco. La estructura de AFX_SIZEPARENTPARAMS contiene el rectángulo de cliente disponible actual del elemento primario y un HDWP (que puede ser NULL) con el que llamar a DeferWindowPos
para minimizar el volver a dibujar.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa |
lParam | Dirección de una estructura de AFX_SIZEPARENTPARAMS |
returns | No se usa (0) |
Omitir el mensaje indica que la ventana no participa en el diseño.
WM_SETMESSAGESTRING
Este mensaje se envía a una ventana de marco para pedirle que actualice la línea de mensaje en la barra de estado. Se puede especificar un identificador de cadena o un LPCSTR (pero no ambos).
Parámetros y valores devueltos | Descripción |
---|---|
wParam | Identificador de cadena (o cero) |
lParam | LPCSTR para la cadena (o NULL) |
returns | No se usa (0) |
WM_IDLEUPDATECMDUI
Este mensaje se envía en tiempo de inactividad para implementar la actualización en tiempo de inactividad de los controladores de interfaz de usuario de comando de actualización. Si la ventana (normalmente una barra de control) controla el mensaje, crea un objeto CCmdUI
(o un objeto de una clase derivada) y llama a CCmdUI::DoUpdate
para cada uno de los "elementos" de la ventana. A su vez, comprobará si hay un controlador de ON_UPDATE_COMMAND_UI para los objetos de la cadena de controladores de comandos.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | No se usa (0) |
returns | No se usa (0) |
bDisableIfNoHandler no es cero para deshabilitar el objeto de interfaz de usuario si no hay ni un ON_UPDATE_COMMAND_UI ni un controlador de ON_COMMAND.
WM_EXITHELPMODE
Este mensaje se publica en un CFrameWnd
para salir del modo de ayuda contextual. La recepción de este mensaje finaliza el bucle modal iniciado por CFrameWnd::OnContextHelp
.
Parámetro y valor devuelto | Descripción |
---|---|
wParam | No se usa (0) |
lParam | No se usa (0) |
returns | No se usa |
WM_INITIALUPDATE
La plantilla de documento envía este mensaje a todos los descendientes de una ventana de marco cuando es seguro para que realicen su actualización inicial. Se asigna a una llamada a CView::OnInitialUpdate
, pero se puede usar en otras clases derivadas de CWnd
para otra actualización de una sola captura.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa (0) |
lParam | No se usa (0) |
returns | No se usa (0) |
WM_RECALCPARENT
Este mensaje se envía mediante una vista a su ventana primaria (obtenida a través de GetParent
) para forzar un recálculo de diseño (normalmente, el elemento primario llamará a RecalcLayout
). Esto se usa en las aplicaciones de servidor OLE en las que es necesario que el marco crezca en tamaño a medida que crece el tamaño total de la vista.
Si la ventana primaria procesa este mensaje, debe devolver TRUE y rellenar el RECT pasado en lParam con el nuevo tamaño del área cliente. Esto se usa en CScrollView
para controlar correctamente las barras de desplazamiento (colocar en el exterior de la ventana cuando se agregan) cuando se activa un objeto de servidor.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa (0) |
lParam | LPRECT rectClient, puede ser NULL |
returns | TRUE si se devuelve el rectángulo de cliente nuevo; de lo contrario, FALSE |
WM_SIZECHILD
Este mensaje lo envía COleResizeBar
a su ventana de propietario (a través de GetOwner
) cuando el usuario cambia el tamaño de la barra de cambio de tamaño con los identificadores de cambio de tamaño. COleIPFrameWnd
responde a este mensaje intentando cambiar la posición de la ventana de marco como ha solicitado el usuario.
IParam apunta al nuevo rectángulo, dado en coordenadas de cliente relativas a la ventana de marco que contiene la barra de cambio de tamaño.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa (0) |
lParam | LPRECT rectNew |
returns | No se usa (0) |
WM_DISABLEMODAL
Este mensaje se envía a todas las ventanas emergentes que pertenecen a una ventana de marco que se está desactivando. La ventana de marco usa el resultado para determinar si se va a deshabilitar o no la ventana emergente.
Puede usarlo para realizar un procesamiento especial en la ventana emergente cuando el marco entra en un estado modal o para evitar que determinadas ventanas emergentes se deshabiliten. La información sobre herramientas usa este mensaje para destruirse cuando la ventana de marco entra en un estado modal, por ejemplo.
Parámetros y valores devueltos | Descripción |
---|---|
wParam | No se usa (0) |
lParam | No se usa (0) |
returns | Distinto de cero para NO deshabilitar la ventana, 0 indica que la ventana se deshabilitará. |
WM_FLOATSTATUS
Este mensaje se envía a todas las ventanas emergentes que pertenecen a una ventana de marco cuando el marco está activado o desactivado por otra ventana de marco de nivel superior. Esto lo usa la implementación de MFS_SYNCACTIVE en CMiniFrameWnd
, para mantener sincronizada la activación de estas ventanas emergentes con la activación de la ventana de marco de nivel superior.
Parámetros | Descripción |
---|---|
wParam | Es uno de los siguientes valores: FS_SHOW FS_HIDE FS_ACTIVATE FS_DEACTIVATE FS_ENABLEFS_DISABLE FS_SYNCACTIVE |
lParam | No se usa (0) |
El valor devuelto debe ser distinto de cero si se establece FS_SYNCACTIVE y la ventana sincroniza su activación con el marco primario. CMiniFrameWnd
devuelve un valor distinto de cero cuando el estilo se establece en MFS_SYNCACTIVE.
Para más información, consulte la implementación de CMiniFrameWnd
.
WM_ACTIVATETOPLEVEL
Este mensaje se envía a una ventana de nivel superior cuando una ventana de su "grupo de nivel superior" está activada o desactivada. Una ventana forma parte de un grupo de nivel superior si es una ventana de nivel superior (ningún elemento primario o propietario) o es propiedad de dicha ventana. Este mensaje es similar al uso de WM_ACTIVATEAPP, pero funciona en situaciones en las que las ventanas que pertenecen a distintos procesos se mezclan en una sola jerarquía de ventanas (común en las aplicaciones OLE).
WM_COMMANDHELP, WM_HELPHITTEST, WM_EXITHELPMODE
Estos mensajes se usan en la implementación de ayuda contextual. Consulte la Nota técnica 28 para obtener más información.
Formatos de recursos privados de MFC
Actualmente, MFC define dos formatos de recursos privados: RT_TOOLBAR y RT_DLGINIT.
Formato de recursos RT_TOOLBAR
La barra de herramientas predeterminada proporcionada por AppWizard se basa en un recurso personalizado de RT_TOOLBAR, que se introdujo en MFC 4.0. Puede editar este recurso usando el editor de la barra de herramientas.
Formato de recursos de RT_DLGINIT
Se usa un formato de recurso privado MFC para almacenar información adicional de inicialización de cuadros de diálogo. Esto incluye las cadenas iniciales almacenadas en un cuadro combinado. El formato de este recurso no está diseñado para editarse manualmente, sino que está controlado por Visual C++.
Visual C++ y este recurso de RT_DLGINIT no son necesarios para usar las características relacionadas de MFC, ya que hay una alternativa de API al uso de la información en el recurso. El uso de Visual C++ facilita mucho la escritura, el mantenimiento y la traducción de la aplicación a largo plazo.
La estructura básica de un recurso RT_DLGINIT es la siguiente:
+---------------+ \
| Control ID | UINT |
+---------------+ |
| Message # | UINT |
+---------------+ |
|length of data | DWORD |
+---------------+ | Repeated
| Data | Variable Length | for each control
| ... | and Format | and message
+---------------+ /
| 0 | BYTE
+---------------+
Una sección repetida contiene el identificador de control al que enviar el Mensaje # que se va a enviar (un mensaje normal de Windows) y una longitud variable de los datos. El mensaje de Windows se envía en un formulario:
SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);
Se trata de un formato muy general, lo que permite cualquier contenido de datos y mensajes de Windows. El editor de recursos de Visual C++ y MFC solo admiten un subconjunto limitado de mensajes de Windows: CB_ADDSTRING para las opciones de lista iniciales para los cuadros combinados (los datos son una cadena de texto).