Prendendo mensagens em MFC - Qual é a diferença?
Pergunta
Eu estava apenas querendo saber o que (se houver) era a diferença entre as seguintes duas armadilhas de mensagens em MFC para a função, OnSize (..).
1 - Via mensagem mapa:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
ON_WM_SIZE()
..
END_MESSAGE_MAP()
2 - Via afx_message:
afx_msg type OnSize(...);
Eles parecem ser usados ??alternadamente, qual deve ser usado ou depende de outros fatores?
Solução
Ambas as partes são necessárias para adicionar um manipulador mensagem para uma classe. O mapa de mensagem deve ser declarada dentro de sua classe, juntamente com as declarações para quaisquer funções do identificador de mensagem (por exemplo, OnSize
).
class CClassWnd : public CBaseClassWnd {
...
afx_msg void OnSize(UINT nType, int cx, int cy);
DECLARE_MESSAGE_MAP
};
afx_msg
é apenas uma macro espaço reservado vazio -. Ele realmente não fazer nada, mas é sempre incluído por convenção
O mapa mensagem é então definido no arquivo .cpp da classe:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
ON_WM_SIZE()
END_MESSAGE_MAP()
Estas macros gerar uma tabela de referência para a classe que permite que mensagens recebidas pela janela para ser despachado para as funções de manipulador correspondentes. A macro ON_WM_SIZE
permite que os parâmetros wParam
e mensagens lParam
na mensagem WM_SIZE
a ser decodificado em valores mais significativos para a função de manipulador de mensagem (nType
, cx
e cy
neste caso). MFC fornece macros para a maioria das mensagens de janela (WM_LBUTTONDOWN
, WM_DESTROY
, etc).
Você pode encontrar mais informações sobre como mensagem mapeia trabalho em MFC aqui no MSDN.
Outras dicas
afx_msg é apenas um macro vazio, é basicamente apenas para indicar que o método é um manipulador de mensagens MFC para fins de legibilidade. Mesmo com afx_msg lá você ainda precisa ter uma entrada no mapa de mensagem.
Algumas das mensagens do Windows já são tratados pelo MFC , por isso, nestes casos, você pode ir longe com a adição de apenas o método para a classe derivada.
Por exemplo, o CWnd classe (como fazem muitas outras classes MFC) já mapeia algumas mensagens do Windows para ele do mapa de mensagem (ou seja, ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE etc, etc).
Mas qualquer outra mensagem não já mapeados pelo MFC precisa ter tanto um método de classe e uma entrada no mapa de mensagem para que ele funcione.