Partilhar via


Manipuladores para mensagens do Windows padrão

Os manipuladores padrão para mensagens padrão do windows (WM_) são predefinidos na classe CWnd. A biblioteca de classes utilizar nomes desses manipuladores do nome da mensagem. Por exemplo, o manipulador para a mensagem de WM_PAINT for declarado em CWnd como:

afx_msg void OnPaint();

A palavra-chave de afx_msg sugere o efeito da palavra-chave C++ virtual distinguindo os manipuladores de outras funções de membro de CWnd . Observe, no entanto, essas funções que não são de fato virtuais; são implementados em vez de pelos mapas da mensagem. Os mapas de mensagem somente dependem de macros padrão de pré-processador, não de todas as extensões da linguagem C++. A palavra-chave de afx_msg resolve para o espaço em branco depois de pré-processamento.

Para substituir um manipulador definido em uma classe base, defina apenas uma função com o mesmo protótipo em sua classe derivada e criar uma entrada retornadas o mapa do 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 em uma classe base para que a classe base e o windows podem operar na mensagem. Quando você chama o manipulador da classe base em sua substituição depende das condições. Às vezes você deve chamar o manipulador da classe base primeiro e às vezes durá-lo. Às vezes você chama o manipulador da classe base condicional, se você escolher não tratar a mensagem você mesmo. Às vezes você deve chamar o manipulador da classe base, então condicional para executar seu próprio código do manipulador, dependendo do valor ou o estado retornada pelo manipulador da classe base.

Aviso

Não é seguro alterar os argumentos passados em um manipulador se você pretende os passados para um manipulador da classe base.Por exemplo, você poderia ser tentado alterar o argumento de nChar do manipulador de OnChar (para converter para letras maiúsculas, por exemplo).Esse comportamento é razoavelmente obscuro, mas se você precisa realizar esse efeito, use a função de membro SendMessage de CWnd em vez disso.

Como você determina o modo adequado de substituir uma mensagem fornecida? Quando a janela Propriedades grava o esqueleto da função de manipulador para uma determinada mensagem — um manipulador de OnCreate para WM_CREATE, por exemplo destaca — na forma da função de membro substituída recomendada. O exemplo a seguir recomenda que a chamada do manipulador primeiro o manipulador da classe base e continua somente contanto que não retorna – 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 “em.” Alguns desses manipuladores não têm nenhum argumento, enquanto outros precisam de muitos. Alguns também têm um tipo de retorno diferente void. Os manipuladores padrão para todas as mensagens de WM_ são documentados na referência de MFC como funções de membro da classe CWnd cujos nomes começam com “em.” As declarações de função de membro em CWnd são prefixadas com afx_msg.

Consulte também

Conceitos

Declarando funções de manipulador de mensagens