Partilhar via


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.

Confira também

Declarando funções de manipulador de mensagens