Partilhar via


Manipuladores para intervalos de mapa da mensagem

Este artigo explica como mapear um intervalo de mensagens para uma só 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, talvez você queira mapear todas as mensagens para uma só função de manipulador. 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 comando.

    • 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 para uma função de manipulador de mensagens.

Os tópicos abordados neste artigo incluem:

Como gravar a entrada Message-Map

No arquivo .CPP, adicione sua entrada de mapa de mensagens, conforme mostrado no seguinte exemplo:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

A entrada do mapa de mensagens consiste nos seguintes itens:

  • A macro de intervalo de mapa de mensagens:

  • Parâmetros para a macro:

    As duas primeiras macros levam três parâmetros:

    • A ID de comando que inicia o intervalo

    • A ID de comando que encerra o intervalo

    • O nome da função de 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.

Como declarar a função Handler

Adicione a declaração de função do manipulador no arquivo .H. O seguinte código mostra como pode ser a aparência disso, conforme mostrado abaixo:

public:
   afx_msg void OnDoSomething(UINT nID);

As funções de manipulador para comandos únicos normalmente não têm parâmetros. Com exceção das funções de manipulador de atualização, as funções de manipulador para intervalos de mapa de mensagens exigem um parâmetro extra, nID, do tipo UINT. Esse parâmetro é o primeiro. O parâmetro extra acomoda a ID de comando extra necessária para especificar qual comando o usuário realmente escolheu.

Para mais informações sobre os requisitos de parâmetro para atualizar funções de manipulador, confira Exemplo de um intervalo de IDs de comando.

Exemplo de um intervalo de IDs de comando

Quando você pode usar intervalos Um exemplo é manipular comandos como o de Zoom no exemplo do MFC HIERSVR. Esse comando amplia o modo de exibição, dimensionando-o entre 25% e 300% do tamanho normal. A classe de exibição HIERSVR usa um intervalo para lidar com os comandos zoom com uma entrada de mapa de mensagens semelhante a esta:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

Ao escrever a entrada do mapa de mensagens, especifique:

  • Duas IDs de comando, iniciando e terminando um intervalo contíguo.

    Aqui, elas são ID_VIEW_ZOOM25 e ID_VIEW_ZOOM300.

  • O nome da função de manipulador para os comandos.

    Aqui, é OnZoom.

A declaração de função seria semelhante a esta:

public:
   afx_msg void OnZoom(UINT nID);

O caso de funções de manipulador de atualização é semelhante e provavelmente será mais amplamente útil. É muito comum gravar manipuladores ON_UPDATE_COMMAND_UI para vários comandos e encontrar-se escrevendo ou copiando o mesmo código várias vezes. A solução é mapear um intervalo de IDs de comando para uma função de manipulador de atualização usando a macro ON_UPDATE_COMMAND_UI_RANGE. As IDs de comando devem formar um intervalo contíguo. Para um exemplo, confira o manipulador OnUpdateZoom e sua entrada de mapa de mensagens ON_UPDATE_COMMAND_UI_RANGE na classe de exibição do exemplo HIERSVR.

Atualizar funções de manipulador para comandos únicos normalmente usa um só parâmetro, pCmdUI, do tipo CCmdUI*. Ao contrário das funções de manipulador, as funções de manipulador de atualização para intervalos de mapa de mensagens não exigem um parâmetro extra, nID, do tipo UINT. A ID de comando, que é necessária para especificar qual comando o usuário realmente escolheu, é encontrada no objeto CCmdUI.

Exemplo de um intervalo de IDs de controle

Outro caso interessante é mapear mensagens de notificação de controle para um intervalo de IDs de controle para um só manipulador. Suponha que o usuário possa clicar em qualquer um dos 10 botões. Para mapear todos os 10 botões para um manipulador, sua entrada de mapa de mensagens seria semelhante a esta:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Ao escrever a macro ON_CONTROL_RANGE no mapa da mensagem, especifique:

  • 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 de manipulador de mensagens.

    Aqui, é OnButtonClicked.

Ao escrever a função de manipulador, especifique o parâmetro UINT extra, conforme mostrado no seguinte:

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

O manipulador OnButtonClicked de uma só mensagem BN_CLICKED não usa parâmetros. O mesmo manipulador para um intervalo de botões usa um UINT. O parâmetro extra permite identificar o controle específico responsável por gerar a mensagem BN_CLICKED.

O código mostrado no exemplo é típico: converter o valor passado para um int dentro do intervalo de mensagens e afirmar que esse é o caso. Em seguida, você pode tomar alguma ação diferente dependendo do botão em que o usuário clicou.

Confira também

Declarando funções de manipulador de mensagens