Controladores para intervalos de mapa de mensajes
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 mensaje de asignación una a una sola función).
Hay ocasiones en que necesita procesar más de una notificación de mensaje o control de la misma manera. En esas ocasiones, puede ser conveniente asignar todos los mensajes a una sola función de controlador. Los intervalos de Mensaje- mapa permiten hacerlo para un intervalo contiguo de mensajes:
Puede asignar intervalos de los id. de comando:
Una función de controlador de comandos.
Una función de controlador de actualización del comando.
Puede asignar los mensajes de la CONTROL- notificación para un intervalo de los id. de control a una función de controlador de mensajes.
Temas cubiertos en incluyen de caso:
Escribir la entrada de mensaje- mapa
Declarar la función controladora
Ejemplo de un intervalo de los id. de comando
Ejemplo de un intervalo de los id. de control
Escribir la entrada de Mensaje- mapa
En el archivo de .CPP, agregue la entrada de mensaje- mapa, como se muestra en el ejemplo siguiente:
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
La entrada de mensaje- mapa se compone de los elementos siguientes:
La macro de intervalo de mensaje- mapa:
Parámetros a la macro:
Las primeras dos macros toma tres parámetros:
El identificador de comando que comienza el intervalo
El identificador de comando que finaliza el intervalo
El nombre de la función de controlador de mensajes
El intervalo de los id. del comando debe ser contiguo.
La tercera macro, ON_CONTROL_RANGE, toma un primer parámetro adicional: un mensaje de la CONTROL- notificación, como EN_CHANGE.
Declarar la función controladora
Agregue la declaración de función de controlador en. Archivo de h. El código siguiente muestra cómo esto puede examinar, como se muestra a continuación:
public:
afx_msg void OnDoSomething(UINT nID);
Las funciones controladoras para los únicos comandos no tienen normalmente ningún parámetro. Excepto para las funciones de controlador de actualización, las funciones de controlador en intervalos de mensaje- mapa requieren un parámetro adicional, nID, de UINTescrito. Este parámetro es el primer parámetro. El parámetro adicional aloja el identificador adicional de comando necesario para especificar que el comando el usuario eligió realmente.
Para obtener más información sobre los requisitos de parámetro para actualizar funciones de controlador, vea Ejemplo de un intervalo de los id. de comando.
Ejemplo de un intervalo de los id. de comando
¿Cuándo puede ser que utilice intervalos? Un ejemplo consta de administrar comandos como el comando de zoom en el ejemplo HIERSVRMFC. Este comando sobre la vista, escalandola entre el 25% y el 300% de su tamaño normal. La clase de la vista de HIERSVR utiliza un intervalo para controlar los comandos de zoom con una entrada de mensaje- mapa que se parece a lo siguiente:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Cuando escribe la entrada de mensaje- mapa, especifique:
Dos id., principios y finales de comandos un intervalo contiguo.
Aquí son ID_VIEW_ZOOM25 y ID_VIEW_ZOOM300.
El nombre de la función controladora para los comandos.
Aquí es OnZoom.
La declaración de función se parecería al siguiente:
public:
afx_msg void OnZoom(UINT nID);
El caso de funciones de controlador de actualización es similar, y puede ser más muy útil. Es muy común escribir controladores de ON_UPDATE_COMMAND_UI para varios comandos y encontrarse escritura, o la copia, el mismo código repetidamente. La solución es asignar un intervalo de los id. de comando a una función de controlador de actualización mediante la macro de ON_UPDATE_COMMAND_UI_RANGE . Los id. de comando deben formar un intervalo contiguo. Para obtener un ejemplo, vea el controlador de OnUpdateZoom y su entrada de mensaje- mapa de ON_UPDATE_COMMAND_UI_RANGE en la clase de la vista del ejemplo HIERSVR.
Las funciones de controlador de actualización para los únicos comandos tienen normalmente un único parámetro, pCmdUI, de **CCmdUI***escrito. A diferencia de las funciones de controlador, las funciones de controlador de actualización para los intervalos de mensaje- mapa no requieren un parámetro adicional, nID, de UINTescrito. El identificador de comando, que es necesario especificar que el comando el usuario eligió realmente, se encuentra en el objeto de CCmdUI .
Ejemplo de un intervalo de los id. de Control
Otro caso interesante está asignando los mensajes de la CONTROL- notificación para un intervalo de los id. del control a un único controlador. Suponga que el usuario puede hacer clic en cualquier de 10 botones. Para asignar los 10 botones un controlador, la entrada de mensaje- mapa se parecería al siguiente:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Cuando escribe la macro de ON_CONTROL_RANGE en el mapa de mensajes, se especifica:
Un mensaje determinado de la CONTROL-notificación.
Aquí es BN_CLICKED.
Los valores del identificador de control asociados al intervalo contiguo de controles.
Aquí son IDC_BUTTON1 y IDC_BUTTON10.
El nombre de la función de controlador de mensajes.
Aquí es OnButtonClicked.
Cuando escribe la función controladora, especifique el parámetro adicional de UINT , como se muestra en el siguiente:
void CRangesView::OnButtonClicked( UINT nID )
{
int nButton = nID - IDC_BUTTON1;
ASSERT( nButton >= 0 && nButton < 10 );
// ...
}
El controlador de OnButtonClicked para un único mensaje de BN_CLICKED no toma ningún parámetro. El mismo controlador para un intervalo de botones toma un UINT. El parámetro adicional permite identificar el control determinado responsable de generar el mensaje de BN_CLICKED .
El código mostrado en el ejemplo es típico: convertir el valor pasado a int dentro del mensaje se extienden y la aserción de que éste es el caso. A continuación puede adoptar ciertas acciones distintas en función de las que se hizo clic en el botón.