Una vez que haya insertado todos los controles necesarios en el control compuesto, el siguiente paso consiste en Agregar nueva funcionalidad. Esta nueva funcionalidad usualmente cae en dos categorías:
Para el propósito y el alcance de este artículo, la parte restante de esta sección se centra exclusivamente en la gestión de eventos.
Para cada control contenido, que desea controlar eventos, debe implementar una interfaz de envío de eventos por derivados de la IDispEventImpl clase de plantilla. Esta derivación se realiza en la declaración de control compuesto y consta de dos parámetros
La siguiente línea de código de ejemplo, se encuentra en la declaración de la clase base, declara una interfaz IDispEventImpl para un control ( IDC_CIRCCTRL1 ), para la clase de control compuesto ( CMyCompositeCtrl ).
iDispEventImpllt público, IDC_CIRCCTL1, CMyCompositeCtrl & gt;
Después de declarar el envío clases de eventos para cada control de contenidos, necesita agregar un mapa de receptores de eventos con el objeto de control compuesto. Este mapa logra dos cosas:
El mapa de receptores de eventos se implementa utilizando varias macros predefinidas:
BEGIN_SINK_MAP()CtrlName)
Declara el comienzo del mapa de receptores de eventos para el control compuesto de CtrlName.
SINK_ENTRY()CtrlID, DispIID, dispID, EventHandler)
Declara la función de controlador (EventHandler) para el evento especificado (dispID), de la interfaz de envío DispIID, para el control identificado por CtrlID.
Declara el final del mapa de receptores de eventos para el control compuesto de CtrlName.
El ejemplo de código siguiente (situado en el.CPP Archivo del control compuesto) declara un mapa de receptores de eventos para el CMyCompositeCtrl objeto. Declara dos controladores de eventos para los controles que contiene dos ( IDC_CIRCCTL1 y IDC_CIRCCTL2 ). Se controla el evento Click para ambos controles por el OnClick_CircCtrl1 y OnClick_CircCtrl2 funciones.
BEGI&N_SINK_MAP(CMyCompositeCtrl)
nbsp; SINK_ENTRY (IDC_CIRCCTL1, DISPID_CLICK, OnClick_CircCtrl1)
SINK_ENTRY (IDC_CIRCCTL2, DISPID_CLICK, OnClick_CircCtrl2)
END_SINK_MAP()
Una vez que han declarado el mapa de receptores de eventos, proceder a implementar los controladores de eventos para el control compuesto.
En la declaración del paso mapa de receptor de eventos, agregó un nuevo mapa que declaró dos controladores de eventos para los dos controles contenidos de Circ. Ahora es tiempo de aplicar estos controladores. El formato es el siguiente:
retVal __stdcall Eve&ntHandler (args)
{
nbsp; evento de //Handle disparar adecuadamente
}
donde retVal es el valor devuelto por el controlador de eventos, EventHandler es el nombre del controlador de función, y args es una lista opcional de argumentos para el evento. Este nombre debe coincidir con uno de los eventos controladores declararon en mapa de receptores de eventos del control compuesto.
En el ejemplo de código siguiente se define un controlador de eventos (el evento Click) para el control contenido identificado porIDC_CIRCCTRL1:
__stdcall void O&nClick_CircCtrl1)
{
nbsp; MessageBox ("evento Click despedido!", "CircCtl1", MB_OK);
}
Agregar controladores de eventos para las entradas restantes de hundan en el evento mapa de control compuesto.
Antes de que el control compuesto se vuelve completamente activo, cada control contenido, cuyos eventos están manejando, se consulta para interfaces salientes, tales como una interfaz de envío de eventos. Si se encuentran las interfaces, las conexiones se establecen y se usará una referencia a la interfaz de salida para controlar los eventos del control. Este procedimiento se conoce como "asesorando el control" y se realiza automáticamente por el objeto de control compuesto, utilizando el mapa de receptores de eventos, en la inicialización del control compuesto.
Después de que el usuario ha despedido el cuadro de diálogo, se eliminan todas las referencias almacenadas a interfaces salientes de controles que contiene. Esto se conoce como "unadvising el control" y también se realiza automáticamente por el control compuesto.