DLGCBR32, exemple : illustre l'ajout d'une barre d'état et d'une barre d'outils aux boîtes de dialogue

Mise à jour : novembre 2007

L'exemple DLGCBR32 montre comment ajouter une barre d'état et une barre d'outils à une boîte de dialogue. En outre, il illustre un certain nombre de techniques relatives à l'utilisation d'une boîte de dialogue non modale en tant que fenêtre principale d'une application MFC.

Dans une application MFC, vous pouvez attacher des barres de contrôles telles que les barres d'état et les barres d'outils à une fenêtre frame. Cependant, pour de nombreuses applications, une simple interface utilisateur à base de boîtes de dialogue suffit. MFC n'offre pas de prise en charge intégrée pour l'ajout de barres de contrôles aux boîtes de dialogue.

Note de sécurité :

Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues.

Pour obtenir des exemples et des instructions d'installation :

  • Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.

    Pour plus d'informations, consultez Recherche des fichiers d'exemple.

  • La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.

  • Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont copiés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont accessibles en ligne.

Génération et exécution de l'exemple

Pour générer et exécuter l'exemple DLGCBR32

  1. Ouvrez la solution Dlgcbr32.sln.

  2. Dans le menu Générer, cliquez sur Générer.

  3. Dans le menu Déboguer, cliquez sur Exécuter sans débogage.

Ajout d'une barre de contrôles dans une boîte de dialogue

Pour ajouter une barre de contrôles dans une boîte de dialogue, créez d'abord une barre de contrôles classique, puis libérez de l'espace pour celle-ci dans la zone cliente de la boîte de dialogue. Pour que la barre de contrôles fonctionne correctement, la boîte de dialogue doit dupliquer certaines fonctionnalités d'une fenêtre frame. Si vous souhaitez que les gestionnaires ON_UPDATE_COMMAND_UI fonctionnent correctement pour les barres de contrôles, vous devez également faire dériver de nouvelles classes de barres de contrôles et gérer le message WM_IDLEUPDATECMDUI. Si votre boîte de dialogue ne représente pas la fenêtre principale de votre application, vous devez également modifier sa fenêtre frame parente pour passer le message WM_IDLEUPDATECMDUI aux barres de contrôles de la boîte de dialogue.

Pour libérer de l'espace pour une barre de contrôles dans la zone cliente de la boîte de dialogue, suivez les étapes ci-dessous dans la fonction OnInitDialog de votre boîte de dialogue :

  1. Créez les barres de contrôles. Déterminez l'espace nécessaire aux barres de contrôles à l'aide de l'option reposQuery de RepositionBars.

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. Déplacez les contrôles dans votre boîte de dialogue pour tenir compte de l'espace occupé par les barres de contrôles en haut ou à gauche de la zone cliente. Si votre boîte de dialogue contient un menu, vous devez également tenir compte de l'espace qu'il occupe.

    CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                    rcClientNow.top - rcClientStart.top);
    CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);
    while (pwndChild)
        {
           pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild, FALSE);
           pwndChild = pwndChild->GetNextWindow();
        }
    
  3. Augmentez les dimensions de la fenêtre de boîte de dialogue en fonction de l'espace occupé par les barres de contrôles.

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. Positionnez les barres de contrôles à l'aide de RepositionBars.

Pour mettre à jour le premier volet d'une barre d'état avec le texte d'un élément de menu, vous devez gérer WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING et WM_POPMESSAGESTRING dans votre classe de boîte de dialogue. Vous devez dupliquer la fonctionnalité des gestionnaires CFrameWnd pour ces messages. Consultez la classe CModelessMain dans l'exemple de programme pour obtenir des exemples d'utilisation de ces gestionnaires de messages.

Pour afficher les info-bulles des boutons de barre d'outils, il est nécessaire de gérer les notifications TTN_NEEDTEXTW et TTN_NEEDTEXTA.

Pour permettre aux gestionnaires ON_UPDATE_COMMAND_UI de fonctionner correctement avec d'autres volets de barre d'état et d'autres boutons de barre d'outils, vous devez faire dériver les nouvelles classes de barres de contrôles et implémenter un gestionnaire de messages pour WM_IDLEUPDATECMDUI. Cela est rendu nécessaire par le fait que les implémentations de la barre de contrôles par défaut de OnUpdateCmdUI sont basées sur l'hypothèse selon laquelle la fenêtre parente est une fenêtre frame. Cependant, OnUpdateCmdUI ne fait rien d'autre que passer le pointeur de la fenêtre parente à une fonction qui nécessite uniquement un pointeur CCmdTarget. Par conséquent, vous pouvez temporairement indiquer à OnUpdateCmdUI que le pointeur de fenêtre parente transmis est un pointeur CFrameWnd destiné à répondre aux exigences du compilateur. Par exemple :

LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
   if (IsWindowVisible())
   {
      CFrameWnd* pParent = (CFrameWnd*)GetParent();
      if (pParent)
         OnUpdateCmdUI(pParent, (BOOL)wParam);
   }
   return OL;
}

Pour passer des messages WM_IDLEUPDATECMDUI aux autres boîtes de dialogue que celle de la fenêtre principale, enregistrez les pointeurs de boîte de dialogue dans votre classe de fenêtre frame, et créez un gestionnaire WM_IDLEUPDATECMDUI dans cette classe. Le gestionnaire doit envoyer le message WM_IDLEUPDATECMDUI aux fenêtres enfants de la boîte de dialogue via CWnd::SendMessageToDescendants. Ensuite, effectuez le traitement par défaut du message dans la fenêtre frame.

Remarque :

Certains exemples, tels que celui-ci, n'ont pas été modifiés pour refléter les changements apportés aux Assistants, aux bibliothèques et au compilateur Visual C++, mais ils illustrent bien l'exécution de la tâche souhaitée.

Voir aussi

Autres ressources

Exemples MFC