Partager via


MODELESS, exemple : utilise un objet CDialog en tant que boîte de dialogue non modale

Mise à jour : novembre 2007

L'exemple MODELESS montre comment utiliser un objet CDialog MFC en tant que boîte de dialogue non modale. MODELESS est une application simple basée sur des boîtes de dialogue qui gère une zone de liste dans sa boîte de dialogue principale, tout en fournissant une boîte de dialogue non modale qui permet d'ajouter des chaînes à la zone de liste de la fenêtre principale.

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 MODELESS

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

Lorsque l'exemple démarre, une boîte de dialogue vide s'affiche. Vous pouvez ouvrir la boîte de dialogue non modale en cliquant sur Add. Même pendant que la boîte de dialogue Modeless Adder est ouverte, vous pouvez redonner le focus à la boîte de dialogue principale. Le bouton Add de la boîte de dialogue principale est indisponible lorsque la boîte de dialogue non modale est ouverte ; ainsi, l'utilisateur ne peut pas créer plusieurs instances de la boîte de dialogue non modale.

La classe CMainDlg de la boîte de dialogue principale gère un pointeur vers la boîte de dialogue non modale. Elle le fait par simple commodité ; une fois créée, la boîte de dialogue non modale n'a pas besoin d'être gérée davantage. Dans votre application, vous pouvez fournir si vous le souhaitez les informations de la boîte de dialogue non modale (le pointeur permet l'accès à l'objet C++ gérant la boîte de dialogue, ce qui en fait un point de départ idéal).

Le code correspondant au bouton Add de la boîte de dialogue principale crée la boîte de dialogue non modale à l'aide de la fonction Create, au lieu d'appeler DoModal. C'est ainsi que la boîte de dialogue devient non modale ; Windows traite différemment les messages de la boîte de dialogue. Lors de la destruction de la boîte de dialogue, EndDialog n'est pas utilisé ; à la place, DestroyWindow est appelé. Les fonctions membres classiques OnOk et OnCancel d'un objet CDialog appellent EndDialog, par conséquent, vérifiez que votre boîte de dialogue non modale n'appelle pas ces fonctions et qu'elle les substitue par un appel à DestroyWindow.

En règle générale, lorsque vous créez une boîte de dialogue modale, vous la détruisez manuellement au retour de DoModal. Dans la mesure où vous ne pouvez pas attendre le retour de Create durant l'affichage de votre boîte de dialogue non modale, vous devez disposer d'un autre mécanisme de destruction de l'objet C++ associé à la fenêtre. Cet exemple repose sur un mécanisme très simple : il exécute delete this dans PostNcDestroy (une fonction appelée après la destruction de la zone non cliente de la boîte de dialogue).

Remarquez que la boîte de dialogue non modale communique de deux façons différentes avec sa boîte de dialogue parente. En premier lieu, lorsque l'utilisateur appuie sur OK, la chaîne du contrôle d'édition dans la boîte de dialogue non modale est ajoutée au contenu de la zone de liste dans la boîte de dialogue modale. Ensuite, lorsque l'utilisateur détruit la fenêtre (quelle que soit la manière), la boîte de dialogue non modale appelle la fonction BoxDone dans la fenêtre modale. Cette fonction réinitialise simplement le pointeur vers la boîte de dialogue modale et réactive le bouton Add.

Mots clés

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

AfxGetApp; CDC::DrawIcon; CDC::GetSafeHdc; CDialog::Create; CDialog::DoModal; CDialog::OnCancel; CDialog::OnOK; CListBox::AddString; CMenu::AppendMenu; CMenu::ModifyMenu; CRect::Height; CRect::Width; CString::IsEmpty; CString::LoadString; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWnd::DestroyWindow; CWnd::DoDataExchange; CWnd::EnableWindow; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetWindowText; CWnd::IsIconic; CWnd::OnPaint; CWnd::OnQueryDragIcon; CWnd::OnSysCommand; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetActiveWindow; GetSystemMenu; GetSystemMetrics; LoadIcon

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