Manipuladores para mensagens do Windows padrão
Padrão manipuladores para mensagens do Windows padrão (WM _) são predefinidos na classe CWnd.A biblioteca de classes bases nomes para esses manipuladores no nome da mensagem.Por exemplo, o manipulador para o WM_PAINT mensagem declarada na CWnd como:
afx_msg void OnPaint();
O afx_msg palavra-chave sugere o efeito de C++ virtual palavra-chave, distinguindo os manipuladores de outros CWnd funções de membro.Observe, Entretanto, essas funções não são realmente virtuais; em vez disso, eles são implementados através de mapas de mensagem.Mapas de mensagem dependem somente macros de pré-processador padrão, não em quaisquer extensões de linguagem C++.O afx_msg palavra-chave resolve para espaço em branco após o pré-processamento.
Para substituir um manipulador definido na classe base, basta defina uma função com o protótipo mesmo em sua classe derivada e para fazer uma entrada de mapa da mensagem para o manipulador.O manipulador "substitui" qualquer manipulador de mesmo nome em qualquer uma das classes base da classe.
Em alguns casos, o manipulador deve chamar o manipulador substituído na classe base para a classe base (s) e o Windows pode operar na mensagem.Onde você chamar o manipulador da classe base na sua substituição depende das circunstâncias.Às vezes, você deve chamar o manipulador da classe base primeiro e último às vezes.Às vezes você chamar o manipulador de classe base condicionalmente, se você escolher não manipular a mensagem você mesmo.Às vezes você deve chamar o manipulador de classe base e condicionalmente executar seu próprio código de manipulador, dependendo do valor ou estado retornado pelo manipulador de classe base.
Cuidado |
---|
Não é seguro modificar os argumentos passados para um manipulador, se você pretende passá-las para um manipulador de classe base.Por exemplo, você pode ficar tentado a modificar o nChar argumento de OnChar manipulador (converter para maiúsculas, por exemplo).Esse comportamento é obscuro, mas se você precisar realizar esse efeito, use o CWnd função de membro SendMessage em vez disso. |
Como determinar o modo adequado para substituir uma determinada mensagem?Quando a janela Propriedades grava o esqueleto da função de manipulador para uma determinada mensagem — uma OnCreate manipulador WM_CREATE, por exemplo — ele sketches no formulário da função de membro substituído recomendado.O exemplo a seguir recomenda que o manipulador primeiro chamar o manipulador de classe base e continuar apenas na condição de que ele não retornará – 1.
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
Por convenção, os nomes desses manipuladores começam com o prefixo "On". Alguns desses manipuladores de levam sem argumentos, enquanto outros levar vários.Alguns também têm um tipo de retorno diferente de void.Os manipuladores padrão para todas as WM _ mensagens estão documentadas na Referência MFC como funções de membro da classe CWnd cujos nomes começam com "On". As declarações de função de membro em CWnd prefixadas com afx_msg.