Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os manipuladores padrão para mensagens padrão do Windows (WM_) são predefinidos na classe CWnd
. A biblioteca de classes baseia os nomes desses manipuladores no nome da mensagem. Por exemplo, o manipulador da mensagem WM_PAINT é declarado como CWnd
:
afx_msg void OnPaint();
A palavra-chave afx_msg sugere o efeito da palavra-chave C++ virtual
distinguindo os manipuladores de outras CWnd
funções de membro. Note-se, no entanto, que estas funções não são realmente virtuais; em vez disso, são implementados através de mapas de mensagens. Os mapas de mensagens dependem apenas de macros padrão do pré-processador, não de quaisquer extensões para a linguagem C++. A palavra-chave afx_msg é convertida em espaço em branco após o pré-processamento.
Para substituir um manipulador definido em uma classe base, basta definir uma função com o mesmo protótipo em sua classe derivada e fazer uma entrada de mapa de mensagem para o manipulador. O seu gestor "sobrepõe" qualquer gestor do mesmo nome em uma das classes base da sua classe.
Em alguns casos, o gestor deve chamar o gestor substituído na classe base para que as classes base e o Windows possam operar na mensagem. Onde você chama o manipulador de classe base em sua substituição depende das circunstâncias. Às vezes, você deve chamar o manipulador de classe base primeiro e, às vezes, por último. Às vezes, você chama o manipulador de classe base condicionalmente, se optar por não manipular a mensagem sozinho. Às vezes, você deve chamar o manipulador de classe base e, em seguida, executar condicionalmente seu próprio código de manipulador, dependendo do valor ou estado retornado pelo manipulador de classe base.
Atenção
Não é seguro modificar os argumentos passados para um manipulador se você pretende passá-los para um manipulador de classe base. Por exemplo, você pode ser tentado a modificar o argumento nChar do OnChar
manipulador (para converter em maiúsculas, por exemplo). Esse comportamento é bastante obscuro, mas se você precisar realizar esse efeito, use a CWnd
função SendMessage
de membro em vez disso.
Como você determina a maneira correta de substituir uma determinada mensagem Quando o Assistente de Classe grava o esqueleto da função do manipulador para uma determinada mensagem — um OnCreate
manipulador para WM_CREATE, por exemplo — ele esboça na forma da função de membro substituído recomendada. O exemplo a seguir recomenda que o manipulador primeiro chame o manipulador de classe base e prossiga somente na condição de que ele não retorne -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 não aceitam argumentos, enquanto outros aceitam vários. Alguns também têm um tipo de retorno diferente de void
. Os manipuladores padrão para todas as mensagens WM_ são documentados 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
são prefixadas com afx_msg.