Manipuladores para mensagens do Windows padrão
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 funções membro CWnd
. No entanto, observe que essas funções não são realmente virtuais; em vez disso, elas são implementados por meio de mapas de mensagens. Os mapas de mensagens dependem exclusivamente de macros de pré-processador padrão, não de extensões para a linguagem C++. A palavra-chave afx_msg é resolvida para 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 na sua classe derivada e fazer uma entrada de mapa de mensagens para o manipulador. Seu 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 que as classes base e o Windows possam operar na mensagem. O momento de chamar o manipulador de classe base na sua substituição depende das circunstâncias. Algumas vezes, você deve chamar o manipulador de classe base primeiro; outras vezes, por último. Algumas vezes, você chama o manipulador de classe base condicionalmente, se optar por não manipular a mensagem por conta própria. Outras 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.
Cuidado
Não é seguro modificar os argumentos passados para um manipulador se você pretender passá-los para um manipulador de classe base. Por exemplo, você pode ser tentado a modificar o argumento nChar do manipulador OnChar
(para converter em maiúsculas, por exemplo). Esse comportamento é bastante obscuro, mas se você precisar desse efeito, use a função membro CWnd
SendMessage
em vez disso.
Como determinar a maneira adequada de substituir uma determinada mensagem Quando o Assistente de Classe grava o esqueleto da função do manipulador para uma determinada mensagem — um manipulador OnCreate
para WM_CREATE, por exemplo — ela esboça na forma da função de membro substituída recomendada. O exemplo a seguir recomenda que o manipulador primeiro chame o manipulador de classe base, e prossiga apenas com a 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 "Ativado". 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_ estão documentados na Referência do MFC como funções membro da classe CWnd
cujos nomes começam com "Ativado". As declarações de função membro em CWnd
são prefixadas com afx_msg.