Compartilhar via


Manipuladores para intervalos de mapa da mensagem

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 uma notificação de controle exatamente da mesma maneira. Nesses momentos, talvez você queira 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 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 no mapa de mensagens, conforme mostrado no exemplo a seguir.

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

A entrada de mapa de mensagens consiste nos seguintes itens:

  • A macro de intervalo de mapa de mensagens:

  • Parâmetros para a macro:

    As duas primeiras macros têm 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 do manipulador de mensagens

    O intervalo de IDs de comando deve ser contíguo.

    A terceira macro usa ON_CONTROL_RANGEum primeiro parâmetro adicional: uma mensagem de notificação de controle, como EN_CHANGE.

Como declarar a função Handler

Adicione a declaração da função do manipulador no arquivo .H. O código a seguir mostra 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 do 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 parâmetro. O parâmetro extra acomoda a ID de comando extra necessária para especificar qual comando o usuário realmente escolheu.

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

Exemplo de um intervalo de IDs de comando

Quando você poderia usar intervalos? Um exemplo é no gerenciamento de comandos, como o comando Zoom, no exemplo de MFC HIERSVR. Esse comando amplia a exibição, dimensionando-a entre 25% e 300% de seu 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 estão ID_VIEW_ZOOM25 e ID_VIEW_ZOOM300.

  • O nome da função que manipula 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. É bastante comum escrever ON_UPDATE_COMMAND_UI manipuladores para vários comandos e acabar 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 ON_UPDATE_COMMAND_UI_RANGE macro. 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.

As funções de manipulador de atualização para comandos únicos normalmente levam um único parâmetro, pCmdUI, do tipo CCmdUI*. Ao contrário das funções de 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. A ID de comando, que é necessária para especificar qual comando o usuário realmente escolheu, é encontrada no CCmdUI objeto.

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 teria esta aparência:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Ao escrever a ON_CONTROL_RANGE macro no mapa de mensagens, 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 do 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 de qual botão foi clicado.

Consulte também

Declarando funções de manipulador de mensagens