Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo explica como mapear um intervalo de mensagens para uma única função de manipulador de mensagens (em vez de mapear uma mensagem para apenas uma função).
Há momentos em que você precisa processar mais de uma mensagem ou notificação de controle exatamente da mesma maneira. Nesses momentos, você pode querer mapear todas as mensagens para uma única função de manipulador. Os intervalos de mapa de mensagens permitem que você faça isso para um intervalo contíguo de mensagens:
Você pode mapear intervalos de IDs de comando para:
Uma função de manipulador de comandos.
Uma função de manipulador de atualização de comando.
Você pode mapear mensagens de notificação de controle para um intervalo de IDs de controle a uma função de tratamento de mensagens.
Os tópicos abordados neste artigo incluem:
Escrevendo a entrada Message-Map
No ficheiro .CPP, adicione a entrada do mapa de mensagens, conforme mostrado no exemplo a seguir:
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
A entrada do mapa de mensagens consiste nos seguintes itens:
A macro do intervalo do mapa de mensagem
Parâmetros para a macro:
As duas primeiras macros usam três parâmetros:
O ID de comando que inicia o intervalo
O ID de comando que termina o intervalo
O nome da função do manipulador de mensagens
O intervalo de IDs de comando deve ser contíguo.
A terceira macro,
ON_CONTROL_RANGE, usa um primeiro parâmetro adicional: uma mensagem de notificação de controle, como EN_CHANGE.
Declarando a função handler
Adicione a declaração da função do manipulador no arquivo .H. O código a seguir mostra como isso pode parecer, conforme mostrado abaixo:
public:
afx_msg void OnDoSomething(UINT nID);
As funções do manipulador para comandos únicos normalmente não usam parâmetros. Com exceção das funções do manipulador de atualização, as funções do manipulador para intervalos de mapa de mensagens exigem um parâmetro extra, nID, do tipo UINT. Este parâmetro é o primeiro parâmetro. O parâmetro extra acomoda o ID de comando extra necessário para especificar qual comando o usuário realmente escolheu.
Para obter mais informações sobre os requisitos de parâmetros para atualizar as funções do manipulador, consulte Exemplo para um intervalo de IDs de comando.
Exemplo para um intervalo de identificações de comando
Quando pode usar intervalos? Um exemplo é na manipulação de comandos como o comando Zoom no exemplo do MFC HIERSVR. Este comando amplia a vista, dimensionando-a entre 25% e 300% do seu tamanho normal. A classe de visualização do HIERSVR usa um intervalo para manipular os comandos de Zoom com uma entrada de mapeamento de mensagens que se assemelha a esta:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Ao escrever a entrada do mapa de mensagens, você especifica:
Dois identificadores de comando que começam e terminam um intervalo contínuo.
Aqui estão ID_VIEW_ZOOM25 e ID_VIEW_ZOOM300.
O nome da função manipuladora para os comandos.
Aqui está
OnZoom.
A declaração de função seria semelhante a esta:
public:
afx_msg void OnZoom(UINT nID);
O caso das funções do manipulador de atualizações é semelhante e provavelmente será mais amplamente útil. É bastante comum escrever ON_UPDATE_COMMAND_UI manipuladores para uma série de comandos e encontrar-se escrevendo, ou copiando, o mesmo código repetidamente. A solução é mapear um intervalo de IDs de comando para uma função de manipulador de atualização usando a ON_UPDATE_COMMAND_UI_RANGE macro. Os IDs de comando devem formar um intervalo contíguo. Para obter um exemplo, consulte o OnUpdateZoom manipulador e a sua ON_UPDATE_COMMAND_UI_RANGE entrada de mapa de mensagem na classe de vista do exemplo HIERSVR.
As funções do manipulador de atualização para comandos únicos normalmente usam um único parâmetro, pCmdUI, do tipo CCmdUI*. Ao contrário das funções do manipulador, as funções do manipulador de atualização para intervalos de mapa de mensagens não exigem um parâmetro extra, nID, do tipo UINT. O ID do CCmdUI comando, que é necessário para especificar qual comando o usuário realmente escolheu, é encontrado no objeto.
Exemplo para um intervalo de IDs de controle
Outro caso interessante é o mapeamento de mensagens de notificação de controle para um intervalo de IDs de controle para um único manipulador. Suponha que o usuário pode clicar em qualquer um dos 10 botões. Para mapear todos os 10 botões para um manipulador, sua entrada de mapa de mensagens teria esta aparência:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Ao escrever a macro no mapa de mensagens ON_CONTROL_RANGE, especifica-se:
Uma mensagem de notificação de controle específica.
Aqui está BN_CLICKED.
Os valores de ID de controle associados ao intervalo contíguo de controles.
Aqui estão IDC_BUTTON1 e IDC_BUTTON10.
O nome da função do manipulador de mensagens.
Aqui está
OnButtonClicked.
Ao escrever a função manipulador, especifique o parâmetro UINT extra, conforme mostrado a seguir:
void CRangesView::OnButtonClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON1;
ASSERT(nButton >= 0 && nButton < 10);
// ...
}
O OnButtonClicked manipulador de uma única mensagem BN_CLICKED não usa parâmetros. O mesmo manipulador para vários botões usa um UINT. O parâmetro extra permite identificar o controle particular responsável por gerar a mensagem BN_CLICKED .
O código mostrado no exemplo é típico: convertendo o valor passado para um int dentro do intervalo de mensagens e afirmando que este é o caso. Em seguida, você pode tomar alguma ação diferente, dependendo de qual botão foi clicado.