Partager via


DYNAMENU, exemple : met à jour dynamiquement les menus

Mise à jour : novembre 2007

L'exemple DYNAMENU illustre la modification dynamique des menus et des barres d'état, que les commandes de gestion soient connues ou non au moment de la compilation. DYNAMENU illustre les fonctionnalités suivantes :

  • Mise à jour dynamique de la liste des éléments d'un menu.

  • Implémentation de l'équivalent des gestionnaires ON_COMMAND et ON_UPDATE_COMMAND_UI pour les commandes de menu dont les ID ne sont pas connus au moment de la compilation. Cette illustration peut être appliquée à des cas beaucoup plus complexes, par exemple les menus configurables par l'utilisateur.

  • Mise à jour de l'invite de commandes de la barre d'état pour les commandes dont les ID ne sont pas connus au moment de la compilation.

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 DYNAMENU

  1. Ouvrez la solution dynamenu.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.

DYNAMENU affiche initialement une fenêtre contenant le texte suivant : "This text is displayed in the current color". Vous pouvez modifier la couleur d'affichage du texte en sélectionnant l'un des quatre éléments proposés initialement dans le menu **Color **: Black, Red, Purple ou Blue.

Pour tester la fonctionnalité de mise à jour dynamique du menu dans DYNAMENU, dans le menu Color, cliquez sur Change Options, ce qui entraîne l'ouverture de la boîte de dialogue Change Color Options. Les cases à cocher associées à Black, Red, Purple et Blue vous permettent de choisir les couleurs qui sont proposées dynamiquement dans le menu Color. Par exemple, si vous désactivez les cases à cocher Red et Purple, et que vous revenez dans le menu Color, seuls les éléments Black et Blue sont proposés.

Remarquez la manière dont la barre d'état affiche, par exemple, "Set current color text to Black", lorsque le focus se trouve sur l'élément Black du menu Color.

Mise à jour dynamique de la liste des éléments d'un menu

La classe CDynaMDIChildWnd dans Mdichild.cpp implémente la mise à jour dynamique des éléments du menu Couleur. Lorsque la liste des couleurs disponibles est mise à jour, ou lorsque la fenêtre enfant MDI est activée, la fonction CDynaMDIChildWnd::RefreshColorMenu appelle CMenu::DeleteMenu pour supprimer chaque élément de couleur du menu, puis elle ajoute les couleurs disponibles au menu à l'aide de CMenu::AppendMenu.

Implémentation des gestionnaires de commandes pour les éléments de menu dynamiques

DYNAMENU aurait pu être implémenté en réservant une liste fixe d'ID de commandes pour chaque couleur : ID_COLOR_BLACK, ID_COLOR_RED, etc. Dans ce cas, les gestionnaires ON_COMMAND et ON_UPDATE_COMMAND_UI auraient été implémentés pour les commandes de couleurs de manière classique. Cette méthode est la plus directe pour implémenter DYNAMENU.

Néanmoins, pour les besoins de l'exemple, DYNAMENU n'utilise pas d'ID de commandes fixes. En fait, DYNAMENU assigne dynamiquement des ID de commandes inconnus ou non associés aux éléments de menu au moment de la compilation. Cette illustration peut être appliquée à des cas beaucoup plus complexes, par exemple les menus configurables par l'utilisateur.

L'équivalent de la gestion de la table des messages ON_COMMAND et ON_UPDATE_COMMAND est implémenté dans la substitution de CCmdTarget::OnCmdMsg dans le document. Si la fonction OnCmdMsg est appelée à l'aide d'un pointeur NULL pour le paramètre AFX_CMDHANDLERINFO*, cela signifie qu'aucune entrée de la table des messages n'a été trouvée pour la commande. Dans ce cas, la substitution de OnCmdMsg vérifie si l'ID de commande, passé en tant que premier paramètre, est l'un des ID de commandes assignés dynamiquement pour les éléments du menu Couleur. Si tel est le cas, la substitution appelle soit un gestionnaire de commandes (DoSelectColor), soit un gestionnaire d'interface utilisateur de commandes (DoUpdateSelectColor), selon que le second paramètre passé à OnCmdMsg est CN_COMMAND, défini par MFC, ou CN_UPDATE_COMMAND_UI.

Mise à jour de l'invite de commandes de la barre d'état pour les éléments de menu dynamiques

Dans DYNAMENU, la fenêtre enfant MDI (CDynaMDIChildWnd) gère la barre d'état. L'implémentation par défaut de CFrameWnd::GetMessageString utilise l'ID de commande actuellement affiché (pour l'élément qui possède le focus dans le menu) ; elle obtient ainsi la ressource de type chaîne correspondant à la commande, qu'elle affiche dans le premier volet de la barre d'état. DYNAMENU se substitue à GetMessageString pour afficher une invite de commandes destinée aux commandes définies dynamiquement.

Mots clés

Cet exemple illustre l'utilisation des mots clés suivants :

AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor

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