2008-10-14 8 views
5

Me preguntaba lo que (si lo hay) la diferencia era entre las dos trampas siguiente mensaje en MFC para la función, OnSize (..). mapa Via Mensaje -Reventado de mensajes en MFC: ¿cuál es la diferencia?

1:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - Via afx_message:

afx_msg type OnSize(...); 

Parecen ser utilizado indistintamente, ¿cuál debería ser utilizado, o depende de otros factores?

Respuesta

12

Ambas partes son necesarias para agregar un controlador de mensajes a una clase. El mapa de mensajes debe declararse dentro de su clase, junto con las declaraciones de cualquier función del manejador de mensajes (por ejemplo, OnSize).

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg es sólo un marcador de posición vacío macro - no hace nada, pero siempre se incluye por convención.

El mapa de mensajes se define a continuación en el archivo .cpp de la clase:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

Estas macros generan una tabla de consulta para la clase que permite a los mensajes recibidos por la ventana para ser enviados a las funciones de controlador correspondientes. La macro ON_WM_SIZE permite que los parámetros de mensaje wParam y lParam en el mensaje WM_SIZE se descodifiquen en valores más significativos para la función del manejador de mensajes (nType, cx y cy en este caso). MFC proporciona macros para la mayoría de los mensajes de ventana (WM_LBUTTONDOWN, WM_DESTROY, etc.).

Puede encontrar más información sobre cómo funcionan los mapas de mensajes en MFC here en MSDN.

3

afx_msg es sólo una macro vacía, que es, básicamente, sólo hay que indicar que el método es un controlador de mensajes MFC para facilitar la lectura. Incluso con afx_msg allí todavía necesita tener una entrada en el mapa de mensajes.

+0

Es bueno saber que, algo que yo he preguntado por un tiempo. Tal vez tengo demasiado tiempo en mis manos ...;) –

0

Algunos de los mensajes de Windows que ya son manejados por MFC, por lo que en estos casos se puede salirse con la adición de sólo el método de la clase derivada.

Por ejemplo, la claseCWnd (al igual que muchas otras clases MFC) ya los mapas de unos mensajes de Windows en él es mapa de mensajes (es decir ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE etc, etc).

Pero cualquier otro mensaje no está ya asignada por MFC tendrá que tener tanto un método de clase y una entrada en el mapa de mensajes para que funcione.

Cuestiones relacionadas