Compartir por


Controladores para intervalos de mapa de mensajes

En este artículo, se explica cómo asignar un intervalo de mensajes a una función de controlador de mensajes única (en lugar de asignar un mensaje a una sola función).

Hay ocasiones en las que es necesario procesar más de un mensaje o notificación de control exactamente de la misma manera. En ese momento, es posible que desee asignar todos los mensajes a una función de controlador única. Los intervalos de asignación de mensajes permiten hacerlo para un intervalo contiguo de mensajes:

  • Puede asignar intervalos de identificadores de comando a:

    • Una función de controlador de comandos.

    • Una función de controlador de actualización de comandos.

  • Puede asignar mensajes de notificación de control para un intervalo de identificadores de control a una función de controlador de mensajes.

En este artículo se tratan los siguientes temas:

Escritura de la entrada de asignación de mensajes

En el archivo .CPP, agregue la entrada de asignación de mensajes, tal como se muestra en el ejemplo siguiente:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

La entrada de asignación de mensajes consta de los elementos siguientes:

  • La macro de intervalo de asignación de mensajes:

  • Parámetros de la macro:

    Las dos primeras macros toman tres parámetros:

    • El identificador del comando que inicia el intervalo

    • El identificador del comando que finaliza el intervalo

    • El nombre de la función de controlador de mensajes

    El intervalo de identificadores de comando debe ser contiguo.

    La tercera macro, ON_CONTROL_RANGE, toma un primer parámetro adicional: un mensaje de notificación de control, como EN_CHANGE.

Declaración de la función de controlador

Agregue la declaración de función de controlador en el archivo .H. En el código siguiente, se muestra el aspecto que podría tener, tal como aparece a continuación:

public:
   afx_msg void OnDoSomething(UINT nID);

Por lo general, las funciones de controlador para comandos únicos no toman ningún parámetro. Con la excepción de las funciones de controlador de actualización, las funciones de controlador para los intervalos de asignación de mensajes requieren un parámetro adicional, nID, de tipo UINT. Este parámetro es el primer parámetro. El parámetro adicional admite el identificador de comando adicional necesario para especificar qué comando eligió realmente el usuario.

Para más información sobre los requisitos de parámetro para actualizar las funciones de controlador, consulte Ejemplo de un intervalo de identificadores de comando.

Ejemplo de un intervalo de identificadores de comando

Un ejemplo de cuando se pueden usar intervalos es cuando se controlan comandos como el comando Zoom en el ejemplo HIERSVR de MFC. Este comando acerca la vista y la escala entre el 25 % y el 300 % de su tamaño normal. La clase de vista de HIERSVR usa un intervalo para controlar los comandos Zoom con una entrada de asignación de mensajes similar a esta:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

Al escribir la entrada de asignación de mensajes, especifique lo siguiente:

  • Dos identificadores de comando, para iniciar y finalizar un intervalo contiguo.

    Se trata de ID_VIEW_ZOOM25 y ID_VIEW_ZOOM300.

  • El nombre de la función de controlador para los comandos.

    Aquí es OnZoom.

La declaración de función sería similar a la siguiente:

public:
   afx_msg void OnZoom(UINT nID);

El caso de las funciones de controlador de actualización es similar y es probable que sea más útil. Resulta bastante común escribir controladores ON_UPDATE_COMMAND_UI para una diversidad de comandos y encontrarse escribiendo, o copiando, el mismo código una y otra vez. La solución es asignar un intervalo de identificadores de comando a una función de controlador de actualización mediante la macro ON_UPDATE_COMMAND_UI_RANGE. Los identificadores de comando deben formar un intervalo contiguo. Para un ejemplo, consulte el controlador OnUpdateZoom y su entrada de asignación de mensajes ON_UPDATE_COMMAND_UI_RANGE en la clase de vista del ejemplo HIERSVR.

Por lo general, las funciones de controlador de actualización para comandos únicos toman un parámetro único, pCmdUI, de tipo CCmdUI*. A diferencia de las funciones de controlador, las funciones de controlador de actualización para intervalos de asignación de mensajes no requieren ningún parámetro adicional, nID, de tipo UINT. El identificador de comando, necesario para especificar qué comando eligió realmente el usuario, se encuentra en el objeto CCmdUI.

Ejemplo de un intervalo de identificadores de control

Otro caso interesante es asignar mensajes de notificación de control para un intervalo de identificadores de control a un controlador único. Supongamos que el usuario puede hacer clic en cualquiera de los 10 botones. Para asignar los 10 botones a un controlador, la entrada de asignación de mensajes tendría este aspecto:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Al escribir la macro ON_CONTROL_RANGE en la asignación de mensajes, especifique lo siguiente:

  • Un mensaje de notificación de control determinado.

    Aquí es BN_CLICKED.

  • Los valores de identificador de control asociados al intervalo contiguo de controles.

    Estos son IDC_BUTTON1 e IDC_BUTTON10.

  • El nombre de la función de controlador de mensajes.

    Aquí es OnButtonClicked.

Al escribir la función de controlador, especifique el parámetro UINT adicional, tal como se muestra a continuación:

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

El controlador OnButtonClicked para un mensaje BN_CLICKED único no toma ningún parámetro. El mismo controlador para un intervalo de botones toma un parámetro UINT. El parámetro adicional permite identificar el control concreto responsable de generar el mensaje BN_CLICKED.

El código que se muestra en el ejemplo es típico: convertir el valor pasado a un int dentro del intervalo de mensajes y afirmar que este es el caso. Luego, puede realizar alguna acción diferente en función del botón en el que se hizo clic.

Consulte también

Declaración de funciones del controlador de mensajes