Il y a deux façons d'ajouter une boîte de dialogue à votre projet ATL : utiliser l'Assistant objet ATL ou ajouter manuellement.
Dans l'Assistant de l'objet ATL (menuinsertion , commande du Nouvel objet ATL ), mettent en évidence la catégorie divers dans le volet gauche, puis double-cliquez sur l'objet de la boîte de dialogue dans le volet droit pour ajouter une boîte de dialogue à votre projet ATL. Remplissez la boîte de dialogue Propriétés de l'Assistant objet ATL comme il convient et cliquez sur OK. L'Assistant objet ATL ajoute une classe dérivée de CAxDialogImpl à votre projet et ouvre l'éditeur de ressources avec votre modèle de boîte de dialogue.
&Notenbsp ; Si votre boîte de dialogue est dérivée de CAxDialogImpl , il peut héberger des contrôles ActiveX et de Windows. Si vous ne voulez le généraux en charge des contrôles ActiveX dans votre classe de boîte de dialogue, utilisez plutôt CSimpleDialog ou CDialogImpl.
Gestionnaires d'événement et le message peuvent être ajoutés à votre classe de boîte de dialogue de ClassView de la même façon que pour une classe MFC. Dans ClassView, cliquez droit sur la classe et choisissez Ajouter le gestionnaire de messages Windows pour ouvrir la boîte de dialogue nouveau Message de Windows et de gestionnaires d'événements . Pour plus d'informations, consultez Ajout d'un gestionnaire de messages.
Pour ouvrir la boîte de dialogue nouveau Message de Windows et de gestionnaires d'événements à partir du modèle de boîte de dialogue, cliquez sur un contrôle dans le modèle de la boîte de dialogue et choisissez la commande des événements dans le menu contextuel. Dans un projet ATL, la classe de boîte de dialogue est mis en surbrillance dans la zone classe ou un objet à manipuler ; considérant que, pour un projet MFC, le contrôle est mis en surbrillance.
Mise en œuvre d'une boîte de dialogue est similaire à la mise en œuvre d'une fenêtre. Vous dérivez une classe de CAxDialogImpl, CDialogImplou CSimpleDialog et déclarez une carte message pour gérer les messages. Cependant, vous devez également spécifier un ID de ressource modèle de boîte de dialogue dans votre classe dérivée. Votre classe doit avoir un membre de données appelé IDD de tenir cette valeur.
&Notenbsp ; Lorsque vous créez une boîte de dialogue à l'aide de l'Assistant objet ATL, l'Assistant ajoute automatiquement le IDD membre comme un type enum.
CDialogImpl vous permet d'implémenter un modal ou une boîte de dialogue non modale qui héberge des contrôles Windows. CAxDialogImpl vous permet d'implémenter un modal ou une boîte de dialogue non modale qui héberge les contrôles ActiveX et de Windows.
Pour créer une boîte de dialogue modale, créez une instance de votre CDialogImpl-dérivée (ou CAxDialogImpl-dérivée) de la classe et appelez ensuite la méthode DoModal . Pour fermer une boîte de dialogue modale, appelez la méthode EndDialog un gestionnaire de messages. Pour créer une boîte de dialogue non modale, appelez la méthode Create au lieu de DoModal. Pour détruire une boîte de dialogue non modale, appelez DestroyWindow.
Si votre objet de la boîte de dialogue contient des contrôles ActiveX et vous gérez les événements de ces contrôles, vous devrez conseiller et désinformation toutes les interfaces de contrôle ActiveX. Cela peut se faire en ajoutant la ligne suivante de code à votre InitDialog fonction:
AtlAdviseSinkMap (pMyDlg, TRUE)
De désinformation à tous les contrôles ActiveX, ajoutez la ligne suivante de code à votre EndDialog fonction (ou la fonction invoqué lors de la résiliation de votre objet de la boîte de dialogue):
AtlAdviseSinkMap (pMyDlg, FALSE)
Mettre en œuvre des gestionnaires de messages de la boîte de dialogue comme vous le feriez pour les gestionnaires d'événements dans un CWindowImpl-classe dérivée. Si il y a une valeur de retour de message spécifique, le retourner comme un LRESULT . Le retour LRESULT les valeurs sont mappées par ATL pour manipulation appropriées par le gestionnaire de la boîte de dialogue Windows. Pour plus de détails, voir le code source de CDialogImplBaseT::DialogProc dans atlwin.h.
Exemple
La classe suivante implémente une boîte de dialogue:
class CMyDialog : public CDialogImpllt ;CMyDialog >,...
{
public :
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)
{
/ / Do certains d'initialisation code
retour 1 ;
}
}