Hay dos formas de agregar un cuadro de diálogo para el proyecto ATL: utilizar el Asistente para objetos ATL o agregar manualmente.
En el Asistente de objeto ATL (menúInsertar , comando Nuevo objeto ATL ), resalte la categoría Miscelánea en el panel izquierdo y, a continuación, haga doble clic en el objeto de diálogo en el panel derecho para agregar un cuadro de diálogo para el proyecto ATL. Rellene el cuadro de diálogo de Propiedades de asistente de objeto ATL según corresponda y haga clic en Aceptar. El Asistente para objetos ATL agrega una clase derivada de CAxDialogImpl al proyecto y se abre el editor de recursos con la plantilla de cuadro de diálogo.
&Notanbsp; Si el cuadro de diálogo es derivado de CAxDialogImpl , puede alojar controles ActiveX y Windows. Si no desea que la sobrecarga de apoyo de control ActiveX en la clase de cuadro de diálogo, utilice CSimpleDialog o CDialogImpl en su lugar.
Controladores de evento y el mensaje se pueden agregar a su clase de diálogo desde ClassView de la misma manera que una clase MFC. En ClassView, haga la clase y seleccione Agregar controlador de mensajes de Windows para abrir el cuadro de diálogo de nuevo mensaje de Windows y controladores de eventos . Para obtener más información, vea Agregar un controlador de mensajes.
Para abrir el cuadro de diálogo de nuevo mensaje de Windows y controladores de eventos de la plantilla de cuadro de diálogo, haga clic en un control en la plantilla de cuadro de diálogo y elija el comando de eventos en el menú contextual. En un proyecto ATL, la clase de cuadro de diálogo aparece resaltada en el cuadro de clase o un objeto para manejar ; Considerando que, para un proyecto MFC, se destaca el control.
Implementar un cuadro de diálogo es similar a la aplicación de una ventana. Derivar una clase de CAxDialogImpl, CDialogImplo CSimpleDialog y declarar un Mapa de mensajes para controlar los mensajes. Sin embargo, también debe especificar un ID de recurso de plantilla de cuadro de diálogo en la clase derivada. La clase debe tener un miembro de datos denominado IDD que contenga este valor.
&Notanbsp; Cuando se crea un cuadro de diálogo Asistente para objetos ATL, agrega automáticamente el Asistente para la IDD miembro como un tipo enum.
CDialogImpl permite implementar un modal o un cuadro de diálogo no modal que aloja controles de Windows. CAxDialogImpl le permite implementar un modal o un cuadro de diálogo no modal que aloja los controles ActiveX y Windows.
Para crear un cuadro de diálogo modal, crear una instancia de su CDialogImpl-derivados (o CAxDialogImpl-derivados) de clase y, a continuación, llame al método DoModal . Para cerrar un cuadro de diálogo modal, llame al método EndDialog desde un controlador de mensajes. Para crear un cuadro de diálogo no modal, llame al método Create en lugar de DoModal. Para destruir un cuadro de diálogo no modal, llamar a DestroyWindow.
Si el objeto del cuadro de diálogo contiene controles ActiveX, y están manejando los eventos de estos controles, será necesario asesorar y objeto de todas las interfaces de control ActiveX. Esto puede hacerse agregando la siguiente línea de código para su InitDialog función:
AtlAdviseSinkMap (pMyDlg, TRUE)
A objeto de controles ActiveX, agregue la siguiente línea de código para su EndDialog función (o la función que se invoca en la terminación de su objeto de cuadro de diálogo):
AtlAdviseSinkMap (pMyDlg, FALSE)
Implementar controladores de mensajes del cuadro de diálogo como lo haría con los controladores en un CWindowImpl-clase derivada. Si hay un valor de retorno de mensaje específico, devolverlo como una LRESULT . El devuelto LRESULT valores se asignan por ATL para un manejo apropiado por el administrador de diálogo de Windows. Para obtener más información, vea el código fuente para CDialogImplBaseT::DialogProc en atlwin.h.
Ejemplo
La siguiente clase implementa un cuadro de diálogo:
clase CMyDialog: CDialogImpllt pública;CMyDialog >,...
{
público:
enum {IDD = IDD_MYDIALOG};
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER (WM_INITDIALOG, OnInitDialog)
END_MSG_MAP()
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Hacer algunos inicialización código
devolver 1;
}
}