Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se explica cómo asignar un intervalo de mensajes a una sola función de controlador de mensajes (en lugar de asignar un mensaje a una sola función).
Hay ocasiones en las que necesita procesar más de un mensaje o notificación de control de la misma manera. En tales momentos, es posible que desee asignar todos los mensajes a una sola función de controlador. Los intervalos de mapa de mensajes permiten hacerlo para un intervalo contiguo de mensajes:
Puede asignar intervalos de identificadores de comando a:
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.
Entre los temas tratados en este artículo se incluyen:
Escritura de la entrada de asignación de mensajes
En el archivo .CPP, agregue la entrada del mapa de mensajes, como se muestra en el ejemplo siguiente.
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
La entrada de mapa de mensajes consta de los siguientes elementos:
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
Nombre de la función del 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 tu función de manejador en el archivo .H. En el código siguiente se muestra cómo podría tener este aspecto, como se muestra a continuación:
public:
afx_msg void OnDoSomething(UINT nID);
Las funciones de controlador para comandos únicos normalmente no toman parámetros. Con la excepción de las funciones del controlador de actualizaciones, las funciones de controlador para los intervalos de mapa 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 obtener más información sobre los requisitos de parámetros para actualizar las funciones del controlador, vea Ejemplo de un intervalo de identificadores de comandos.
Ejemplo de un rango de identificadores de comando
¿Cuándo podría usar rangos? Un ejemplo es para manejar comandos como el comando Zoom en el ejemplo de MFC HIERSVR. Este comando amplía la vista, escalándola entre 25% y 300% de su tamaño normal. La clase de vista de HIERSVR usa un rango para controlar los comandos Zoom con una entrada de mapa de mensajes similar a esta:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Al escribir la entrada de mapa de mensajes, especifique lo siguiente:
Dos identificadores de comando, para iniciar y finalizar un intervalo contiguo.
Aquí están ID_VIEW_ZOOM25 y ID_VIEW_ZOOM300.
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 del controlador de actualizaciones es similar y es probable que sea más útil. Es bastante común escribir ON_UPDATE_COMMAND_UI controladores para una serie de comandos y encontrarse escribiendo, o incluso copiando, el mismo código una y otra vez. La solución consiste en asignar un intervalo de identificadores de comandos a una función de controlador de actualización mediante la ON_UPDATE_COMMAND_UI_RANGE macro. 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.
Las funciones de controlador de actualizaciones para comandos únicos normalmente toman un único parámetro, pCmdUI, de tipo CCmdUI*. A diferencia de las funciones de controlador, las funciones de controlador de actualización para intervalos de mapa de mensajes no requieren un parámetro adicional, nID, de tipo UINT. El identificador de comando, que es necesario para especificar qué comando eligió realmente el usuario, se encuentra en el CCmdUI objeto .
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 único controlador. Supongamos que el usuario puede hacer clic en cualquiera de los 10 botones. Para asignar los 10 botones a un controlador, la entrada de mapa de mensajes tendría este aspecto:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Al escribir la macro ON_CONTROL_RANGE en su mapa de mensajes, usted especifica:
Un mensaje de notificación de control determinado.
Aquí está BN_CLICKED.
Los valores de identificador de control asociados al intervalo contiguo de controles.
Estos son IDC_BUTTON1 y IDC_BUTTON10.
Nombre de la función del controlador de mensajes.
Aquí es
OnButtonClicked.
Al escribir la función de controlador, especifique el parámetro UINT adicional, como se muestra en lo siguiente:
void CRangesView::OnButtonClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON1;
ASSERT(nButton >= 0 && nButton < 10);
// ...
}
El controlador OnButtonClicked para un único mensaje BN_CLICKED no toma parámetros. El mismo controlador para un intervalo de botones toma un parámetro UINT. El parámetro adicional permite identificar el control determinado responsable de generar el mensaje de 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. A continuación, puede realizar alguna acción diferente en función del botón en el que se hizo clic.