Mapas de mensajes derivados
Durante el control de mensajes, la comprobación del mapa de mensajes de una clase no pone fin al trabajo con el mapa de mensajes. ¿Qué ocurre si la clase CMyView
(derivada de CView
) no tiene ninguna entrada coincidente para un mensaje?
Tenga en cuenta que CView
, la clase base de CMyView
, deriva a su vez de CWnd
. Por lo tanto, CMyView
es CView
y es CWnd
. Cada una de esas clases tiene su propio mapa de mensajes. En la ilustración siguiente se muestra la relación jerárquica de las clases, pero tenga en cuenta que un objeto CMyView
es un objeto único que tiene las características de las tres clases.
Jerarquía de una vista
Si no se puede hacer coincidir un mensaje en el mapa de mensajes de CMyView
de la clase, el marco también busca en el mapa de mensajes de su clase base inmediata. La macro BEGIN_MESSAGE_MAP
al principio del mapa de mensajes especifica dos nombres de clase como argumentos:
BEGIN_MESSAGE_MAP(CMyView, CView)
El primer argumento asigna un nombre a la clase a la que pertenece el mapa de mensajes. El segundo argumento proporciona una conexión con la clase base inmediata (en este caso, CView
) para que el marco también pueda buscar en su mapa de mensajes.
Por lo tanto, la clase derivada hereda los controladores de mensajes proporcionados en una clase base. Esto se parece mucho a las funciones miembro virtuales normales, sin necesidad de que todas las funciones miembro del controlador sean virtuales.
Si no se encuentra ningún controlador en ninguno de los mapas de mensajes de la clase base, se realiza el procesamiento predeterminado del mensaje. Si el mensaje es un comando, el marco lo enruta al siguiente destino de comando. Si se trata de un mensaje estándar de Windows, el mensaje se pasa al procedimiento de ventana predeterminado adecuado.
Para acelerar el proceso de coincidencia en el mapa de mensajes, el marco almacena en caché las coincidencias recientes con la probabilidad de que se reciba el mismo mensaje de nuevo. Una consecuencia de esto es que el marco procesa los mensajes no controlados de forma bastante eficaz. Los mapas de mensajes también aprovechan mejor el espacio que las implementaciones que usan funciones virtuales.