Red de conocimiento informático - Problemas con los teléfonos móviles - tabla de enrutamiento de mensajes vc++

tabla de enrutamiento de mensajes vc++

Eso se llama tabla de mapeo de mensajes.

La transmisión y envío de mensajes es el núcleo de las aplicaciones de Windows. La activación y respuesta de cualquier evento debe completarse a través de la función de mensajes. En la programación SDK, la adquisición y distribución de mensajes se completa principalmente mediante bucles de mensajes, mientras que en la programación MFC se procesan mediante mapeo de mensajes. En comparación, este método de procesamiento es mucho más simple y también está en línea con el principio de ocultar los detalles de implementación tanto como sea posible en la programación orientada a objetos.

Un mapa de mensajes MFC completo incluye la declaración del prototipo y la implementación de la función de procesamiento de mensajes y la entrada de mensaje que existe en el mapa de mensajes. Estas partes existen en el archivo de encabezado y en el archivo de implementación de la clase respectivamente. En general, además de responder a mensajes personalizados, el procesamiento de asignación de mensajes estándar de Windows se puede completar con la ayuda del asistente ClassWizard.

Después de seleccionar el mensaje de Windows que se va a procesar, el asistente generará un marco de código de procesamiento de mensajes con los parámetros de función correspondientes y los valores de retorno basados ​​en el mensaje. El siguiente código proporciona un proceso de asignación de mensajes MFC completo:

//Declaración en el archivo .h

//{{AFX_MSG(CMessageMapView)

afx_msg void OnMove(int x, int y);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

……

// Implementación en el archivo .cpp

BEGIN_MESSAGE_MAP(CMessageMapView, CView)

//{{AFX_MSG_MAP(CMessageMapView)

ON_WM_MOVE()

/ /}}AFX_MSG_MAP

END_MESSAGE_MAP()

……

void CMessageMapView::OnMove(int x, int y)

{

CView::OnMove(x, y);

// TODO: Agregue su código de controlador de mensajes aquí

}

Aquí , el mensaje estándar de Windows WM_MOVE es un mensaje mapeado. BEGIN_MESSAGE_MAP, END_MESSAGE_MAP y DECLARE_MESSAGE_MAP en el archivo de encabezado utilizado son todas macros utilizadas para el mapeo de mensajes. Estas macros declaran variables miembro y funciones en el marco de la aplicación que se pueden utilizar para explorar todos los mapas de objetos del sistema. Además de las tres macros comunes anteriores, MFC también proporciona otras macros para la asignación de mensajes. Para obtener más detalles, consulte la siguiente tabla:

Descripción del nombre de la macro

DECLARE_MESSAGE_MAP en el archivo de encabezado. Declarar el mapa de mensajes contenido en el archivo fuente

BEGIN_MESSAGE_MAP marca el comienzo del mapa de mensajes del archivo fuente

END_MESSAGE_MAP marca el final del mapa de mensajes del archivo fuente

ON_COMMAND Convertir un comando específico Delegar el procesamiento a una función miembro de la clase

ON_CONTROL asigna una función a un mensaje de notificación de control personalizado. Entre ellos, el mensaje de notificación de control personalizado es un mensaje enviado desde un control a su ventana principal.

ON_CONTROL_RANGE asigna un rango de ID de control a una función de procesamiento de mensajes

ON_CONTROL_REFLECT asigna un mensaje de notificación reflejado al control por la ventana principal

ON_MESSAGE asigna un usuario Asignar un mensaje personalizado a una función de procesamiento de mensajes

ON_NOTIFY asigna un mensaje de control a una función

ON_NOTIFY_RANGE asigna un mensaje de control dentro del rango de ID de control a una función

ON_NOTIFY_EX asigna un mensaje de control a una función que devuelve FALSO o VERDADERO para indicar si la notificación debe pasarse al siguiente objeto para otras respuestas.

ON_NOTIFY_EX_RANGE asigna un mensaje de control dentro de un rango de ID de control a una función. La función miembro devuelve FALSO o VERDADERO para indicar si la notificación debe transmitirse al siguiente objeto para otras reacciones.

ON_NOTIFY_REFLECT asigna un mensaje de control a una función. El mensaje se reflejará en la ventana principal del control.

ON_REGISTERED_MESSAGE asigna un mensaje único a una función que manejará el mensaje registrado. El mensaje es registrado por la función RegisterWindowMessage().

ON_UPDATE_COMMAND_UI asigna una función para procesar un mensaje de comando de actualización de la interfaz de usuario

ON_UPDATE_COMMAND_UI_RANGE asigna un rango de ID de comando a una función de procesamiento de mensajes de actualización

Generalmente se usa como clase base La clase CWnd utilizada define una gran cantidad de funciones de procesamiento predeterminadas para mensajes de ventana para mensajes de Windows. La mayoría de estas funciones simplemente llaman a los procedimientos predeterminados de Windows y se pueden sobrecargar en clases derivadas. Sin embargo, el marco de la aplicación MFC no utiliza funciones de procesamiento de mensajes de Windows como las funciones virtuales ordinarias. En cambio, asigna mensajes específicos a funciones miembro de clases derivadas a través de macros. Si MFC todavía procesa funciones de respuesta de mensajes como funciones virtuales ordinarias, entonces la clase CWnd declarará funciones virtuales para estos cientos de mensajes. C++ proporcionará una tabla de asignación de funciones virtuales llamada vtable para cada clase derivada utilizada en el programa. Esta tabla de asignación debe proporcionar una entrada de 4 bytes para cada función virtual, independientemente de si estas funciones están realmente sobrecargadas en la clase derivada. esto no utilizará eficazmente el espacio de almacenamiento. Y para cada tipo diferente de ventana o control, la aplicación debe proporcionar una tabla de asignación de funciones virtuales de más de 400 bytes para responder a los mensajes. El uso del método MFC de usar macros para asignar mensajes de Windows a funciones miembro de C++ puede evitar generar una enorme tabla de asignación de funciones virtuales, cuyo consumo de memoria es proporcional a la cantidad de entradas de mensajes que contiene.

El principio de funcionamiento del mapeo de mensajes

La forma general del mapeo de mensajes se proporciona arriba. El siguiente es un análisis más profundo del principio de funcionamiento del mapeo de mensajes. Cualquier programa de Windows que utilice el marco de aplicación MFC contiene un objeto de clase de aplicación derivado de CWinApp. La función miembro Run() se llamará implícitamente y la función miembro de la clase CWinThread Run() que llama se pasará a GetMessage(). a funciones como TranslateMessage() y DispatchMessage() completan un bucle de mensajes similar a WinMain(). En el procesamiento de mensajes, casi todos los objetos de ventana utilizan la función de procesamiento de ventanas AfxWndProc() y obtienen un puntero al objeto a través de una lista que contiene información como identificadores de ventanas y punteros de objetos, desde los cuales se puede llamar a la función virtual de CWnd(. ).

La función WindowProc() llama a otra función miembro de CWnd, OnWndMsg(). Esta función primero verifica si el mensaje que llega es un mensaje, un comando o una notificación (Notificar). Si es un mensaje, completa las macros de mapeo de mensajes DECLARE_MESSAGE_MAP. , BEGIN_MESSAGE_MAP y END_MESSAGE_MAP. Algunos códigos están encapsulados en la definición de macro. Estos códigos predefinidos encapsulados se pueden encontrar en el directorio de instalación de VC

.