Controles ActiveX MFC: Agregar eventos personalizados
Los eventos personalizados difieren de los eventos estándar en que no se desencadenan automáticamente mediante la clase COleControl
. Un evento personalizado reconoce una cierta acción, determinada por el desarrollador del control, como un evento. Las entradas de asignación de eventos de los eventos personalizados se representan mediante la macro EVENT_CUSTOM. En la sección siguiente se implementa un evento personalizado para un proyecto de control ActiveX creado mediante el Asistente para controles ActiveX.
Incorporación de un evento personalizado con el Asistente para agregar eventos
En el procedimiento siguiente se agrega un evento personalizado específico, ClickIn. Puede usar este procedimiento para agregar otros eventos personalizados. Sustituya el nombre del evento personalizado y sus parámetros por el nombre y los parámetros del evento ClickIn.
Para agregar el evento personalizado ClickIn mediante el Asistente para agregar eventos
Cargue el proyecto del control.
En Vista de clases, haga clic con el botón derecho en la clase del control ActiveX para abrir el menú contextual.
En el menú contextual, haga clic en Agregar y después en Agregar evento.
Se abrirá el Asistente para agregar eventos.
En el cuadro Nombre del evento, primero seleccione cualquier evento existente y luego haga clic en el botón de radio Personalizado y escriba ClickIn.
En el cuadro Nombre interno, escriba el nombre de la función de desencadenamiento del evento. En este ejemplo use el valor predeterminado proporcionado por el Asistente para agregar eventos (
FireClickIn
).Agregue un parámetro, de nombre xCoord (tipo OLE_XPOS_PIXELS), mediante los controles Nombre de parámetro y Tipo de parámetro.
Agregue un segundo parámetro, de nombre yCoord (tipo OLE_YPOS_PIXELS).
Haga clic en Finalizar para crear el evento.
Cambios del Asistente para agregar eventos en eventos personalizados
Al agregar un evento personalizado, el Asistente para agregar eventos realiza cambios en los archivos .H, .CPP e .IDL de la clase del control. Los ejemplos de código siguientes son específicos del evento ClickIn.
Las líneas siguientes se agregan al archivo de encabezado (.H) de la clase del control:
void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}
Este código declara una función insertada de nombre FireClickIn
que llama a COleControl::FireEvent con el evento ClickIn y los parámetros definidos mediante el Asistente para agregar eventos.
Además, se agrega la siguiente línea a la asignación de eventos del control, que se encuentra en el archivo de implementación (.CPP) de la clase del control:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
Este código asigna el evento ClickIn a la función insertada FireClickIn
y pasa los parámetros definidos mediante el Asistente para agregar eventos.
Por último, la siguiente línea se agrega al archivo .IDL del control:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
Esta línea asigna al evento ClickIn un número de identificador específico tomado de la posición del evento en la lista de eventos del Asistente para agregar eventos. La entrada de la lista de eventos permite a un contenedor anticipar el evento. Por ejemplo, podría proporcionar código de controlador que se ejecutaría cuando se desencadenara el evento.
Llamada a FireClickIn
Ahora que ha agregado el evento personalizado ClickIn mediante el Asistente para agregar eventos, debe decidir cuándo se desencadena este evento. Para ello, llame a FireClickIn
cuando se produzca la acción adecuada. En este tema, el control usa la función InCircle
dentro de un controlador de mensajes WM_LBUTTONDOWN
para desencadenar el evento ClickIn cuando un usuario hace clic dentro de una región circular o elíptica. El procedimiento siguiente agrega el controlador WM_LBUTTONDOWN
.
Para agregar un controlador de mensajes con el Asistente para agregar eventos
Cargue el proyecto del control.
En Vista de clases, seleccione la clase del control ActiveX.
En la ventana Propiedades se ve una lista de mensajes que se pueden controlar con el control ActiveX. Cualquier mensaje que aparezca en negrita ya tiene asignada una función de controlador.
Seleccione el mensaje que quiere controlar. En este ejemplo seleccione
WM_LBUTTONDOWN
.En el cuadro de lista desplegable de la derecha, seleccione <Agregar> OnLButtonDown.
Haga doble clic en la nueva función de controlador en Vista de clases para ir al código del controlador de mensajes en el archivo de implementación (.CPP) del control ActiveX.
El ejemplo de código siguiente llama a la función InCircle
cada vez que se hace clic con el botón izquierdo del mouse dentro de la ventana de control. Este ejemplo se puede encontrar en la función de controlador WM_LBUTTONDOWN
, OnLButtonDown
, en el resumen del ejemplo Circ.
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
Nota:
Cuando el Asistente para agregar eventos crea controladores de mensajes para acciones de los botones del mouse, se agrega automáticamente una llamada al mismo controlador de mensajes de la clase base. No quite esta llamada. Si el control usa cualquiera de los mensajes estándar del mouse, se debe llamar a los controladores de mensajes de la clase base para asegurarse de que la captura del mouse se controle correctamente.
En el ejemplo siguiente, el evento solo se desencadena cuando el clic se produce dentro de una región circular o elíptica en el interior del control. Para lograr este comportamiento, puede colocar la función InCircle
en el archivo de implementación (.CPP) del control:
VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
CRect rc;
GetClientRect(rc);
// Determine radii
double a = (rc.right - rc.left) / 2;
double b = (rc.bottom - rc.top) / 2;
// Determine x, y
double x = point.x - (rc.left + rc.right) / 2;
double y = point.y - (rc.top + rc.bottom) / 2;
// Apply ellipse formula
return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}
También debe agregar la siguiente declaración de la función InCircle
al archivo de encabezado (.H) del control:
VARIANT_BOOL InCircle(CPoint& point);
Eventos personalizados con nombres estándar
Puede crear eventos personalizados con el mismo nombre que eventos estándar, aunque no puede implementar ambos en el mismo control. Por ejemplo, es posible que quiera crear un evento personalizado de nombre Click que no se desencadene cuando lo hiciera el evento estándar Click. Luego, podría desencadenar el evento Click en cualquier momento mediante una llamada a su función de desencadenamiento.
En el procedimiento siguiente se agrega un evento Click personalizado.
Para agregar un evento personalizado que usa un nombre de evento estándar
Cargue el proyecto del control.
En Vista de clases, haga clic con el botón derecho en la clase del control ActiveX para abrir el menú contextual.
En el menú contextual, haga clic en Agregar y después en Agregar evento.
Se abrirá el Asistente para agregar eventos.
En la lista desplegable Nombre del evento, seleccione un nombre de evento estándar. En este ejemplo, seleccione Clic.
En Tipo de evento, seleccione Personalizado.
Haga clic en Finalizar para crear el evento.
Llame a
FireClick
en las ubicaciones adecuadas del código.
Consulte también
Controles ActiveX de MFC
Controles ActiveX MFC: Métodos
COleControl (clase)