Partilhar via


Manipuladores para mensagens padrão do sistema Windows

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.

Ver também

Declarando funções do manipulador de mensagens