Comment initialiser des contrôles enfants dans un CDialogBar dérivée

Traductions disponibles Traductions disponibles
Numéro d'article: 185672 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Lors de la création d'un simple CDialogBar, comme celui avec seul CButtons similaire à Aperçu avant impression MFC de le, il n'est pas nécessaire de dériver de CDialogBar car le parent de CControlBar reçoit les messages de notification à partir de tous contrôles enfants.

Toutefois, dans le cas d'une plus complexe CDialogBar, laquelle peut avoir une liste déroulante modifiable, d'une arborescence ou d'un contrôle ActiveX, il peut s'avérer utile de dériver de CDialogBar pour fournir l'initialisation pour les contrôles enfants.

Parce que ClassWizard ne prend pas en charge la dérivation d'une classe CDialogBar, cet article illustre les étapes nécessaires pour créer une classe de CDialog, puis "convertir" la classe CDialogBar.

Plus d'informations

Pour commencer, créez une classe CDialog avec les contrôles enfants à utiliser. Vous pouvez transformer la classe CDialog en une classe CDialogBar neuf comme suit :

  1. Modifier la classe de base de CDialog pour CDialogBar dans la déclaration de classe. N'oubliez pas de modifier également la classe de base dans BEGIN_MESSAGE_MAP dans le fichier .cpp.
  2. Modifiez le constructeur dans le .h et les fichiers .cpp. Également apporter la modification à la DoDataExchange(). Voici trois articles à modifier.

    Modifier les éléments suivants à partir de
          CMyDlgBar (CWnd* pParent = NULL);   // standard constructor
    
          CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)
             : CDialog(CMyDlgBar::IDD, pParent)
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialog::DoDataExchange(pDX);
             ...
    					
    à la suivante :
          CMyDlgBar ();   // standard constructor
    
          CMyDlgBar:: CMyDlgBar ()
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialogBar::DoDataExchange(pDX);
             ...
    					
    la clé à la transformation est la conversion de la fonction de membre OnInitDialog() virtuelle à la méthode message mappé WM_INITDIALOG en modifiant la méthode OnInitDialog et en ajoutant le Gestionnaire ON_MESSAGE(). Vous n'êtes peut-être pas une substitution de OnInitDialog(). Si ce n'est pas le cas, ajoutez l'un avant de continuer.
  3. Supprimer «virtuel BOOL OnInitDialog();» à partir de l'en-tête de classe et ajoutez «afx_msg LONG OnInitDialog (UINT, LONG); "à sa place. Par exemple :
          class CMyDlgBar : public CDialogBar
          {
             ...
          // Implementation
          protected:
    
             // Generated message map functions
             //{{AFX_MSG(CMyDlgBar)
             virtual BOOL OnInitDialog();                // <-Remove this line.
             //}}AFX_MSG
    
             afx_msg LONG OnInitDialog ( UINT, LONG );   // <-Add this line.
             DECLARE_MESSAGE_MAP()
          };
    						
    maintenant, dans la section mise en oeuvre de la classe, apportez les modifications correspondantes.
  4. Ajouter «ON_MESSAGE (WM_INITDIALOG, OnInitDialog);» à la table des messages dans le fichier .cpp de la mise en oeuvre. Par exemple :
          BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)
    
             //{{AFX_MSG_MAP(CMyDlgBar)
             ...
             //}}AFX_MSG_MAP
             ON_MESSAGE(WM_INITDIALOG, OnInitDialog )    // <-- Add this line.
          END_MESSAGE_MAP()
    						
    OnInitDialog() virtuel maintenant, convertissez OnInitDialog() message mappé.
  5. Effectuer la conversion OnInitDialog() comme suit :
       Change the following:
    
          BOOL CMyDlgBar::OnInitDialog()
          {
             CDialog::OnInitDialog();   // <-- Replace this line:
                ...
    						
    à la suivante :
    LONG CMyDlgBar::OnInitDialog ( UINT wParam, LONG lParam)
             {
                              // <-- with these lines. -->
    
                BOOL bRet = HandleInitDialog(wParam, lParam);
    
                if (!UpdateData(FALSE))
                {
                   TRACE0("Warning: UpdateData failed during dialog init.\n");
                }
                ...
    
                return bRet;
    						
    the CDialogBar (classe) n'a pas un OnInitDialog() virtuel et par conséquent appelant l'une ne fonctionne pas. UpdateData est appelée pour sous-classer ou initialiser des contrôles enfants.
  6. Assurez-vous que les styles de ressource de boîte de dialogue à la suivante :
    Style : enfant
    Limitrophes : aucun
    Visible : non vérifié
    À ce stade, tout ce dont a été reconnecté pour que la transformation à partir d'une classe CDialog pour une classe CDialogBar fonctionne correctement. Maintenant, créer et l'utiliser.
  7. Ajoutez une instance de CDialogBar dérivée à la classe dérivée de CframeWnd (normalement appelé CMainFrame). Par exemple :
          class CMainFrame : public CFrameWnd
          {
              ...
              CMyDlgBar m_myDlgBar;
              ...
          };
    					
  8. Appelez la méthode de création de la variable m_myDlgBar dans la méthode CFrameWnd::OnCreate() semblable au suivant :
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             ...
             if (!m_myDlgBar.Create(this, IDD_DLGBAR1, CBRS_LEFT,
                IDD_DLGBAR1))
             {
                TRACE0("Failed to create dialog bar\n");
                return -1;      // fail to create
             }
             ...
          }
    					
  9. Enfin, si vous souhaitez prendre en charge de la station d'accueil dynamique et le redimensionnement de la CDialogBar, ajoutez les lignes suivantes à la fin de CMainFrame::OnCreate() :
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             ...
             m_myDlgBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
                CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
             m_myDlgBar.EnableDocking(CBRS_ALIGN_ANY);
             DockControlBar(&m_myDlgBar);
    
             return 0;
          }

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
99161Comment dériver de classes ne figurant pas dans ClassWizard

Propriétés

Numéro d'article: 185672 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbhowto kbmfcctrlbar kbuidesign kbwizard KB185672 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 185672
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com