MFC DoModal Dialogue
Ok, donc j'avoue que je n'ai aucune connaissance de l'API de windows, ou même MFC.
J'ai une fenêtre d'erreur popping up quand les choses vont poilu (illégal de caractère dans un nom de fichier de la chaîne) et je veux l'erreur boîte modale.
Pour la vie de moi je ne peux pas comprendre pourquoi il se bloque quand il frappe doModal.
Voici le code où je pense que cela peut être résolu. Ce code est dans le gestionnaire d'événement d'un bouton dans la fenêtre principale.
CDialog *BadFileD = new CDialog();
BadFileD->Create(IDD_STATUS, this);
BadFileD->DoModal();
Je suis juste à la limite attardé?
Plutôt que de
CDialog *BadFileD = new CDialog();
vous devez utiliser CDialog BadFileD;
en particulier lors de l'appel de DoModal. C'est plus simple, et vous n'avez pas à vous soucier de la suppression du pointeur lorsque vous avez terminé.OriginalL'auteur Russbear | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Pour l'affichage de la boîte de dialogue modale vous devez utiliser DoModal méthode uniquement
Vous pouvez lire les commentaires de l'article
OriginalL'auteur Victor
Boîte de dialogue MFC divise en deux modèle, la boîte de dialogue modale et de dialogue non modale.
(1) boîte de dialogue Modale utilisation:
(2) boîte de dialogue non Modale utilisation:
Comme vous pouvez le voir, nous avons besoin de nouvelles un pointeur, mais pas de le supprimer. Donc, vous devez effectuer les opérations suivantes dans notre
CMyDialg
classe:DestroyWindow()
mode dansOnOk()
etOnCancel()
.delete this;
" dansPostNcDestroy()
méthode.Si vous ne le faites pas, votre code peut provoquer une fuite de mémoire.
BadFileD
est un membre de la classe, et que vous supprimez dans le destructeur. Je suggère d'utiliser la boîte de dialogue non Modale.OriginalL'auteur Jerry Zhang
Si vous souhaitez simplement afficher un message d'erreur, il se peut que plutôt que de créer votre propre boîte de dialogue, vous pouvez simplement utiliser
AfxMessageBox()
. Voir Microsoft Developer Network - AfxMessageBox.Si vous voulez faire votre propre boîte de dialogue généralement avec un projet MFC vous le feriez normalement:
Cependant, avec une boîte de dialogue simple qui ne nécessite pas de prise en charge de classe pour un comportement complexe, vous pouvez sauter l'étape de la création de l'encapsulation de la classe avec l'assistant de classe et il suffit d'utiliser
CDialog
directement.Une question qui doit être posée est la durée de vie de la boîte de dialogue ainsi que de savoir si elle est modale ou non modale. Une boîte de dialogue modale demande à l'utilisateur de faire quelque chose pour l'application de continuer au-delà de la boîte de dialogue modale. Une boîte de dialogue non modale de ne pas bloquer l'application de la manière dont une boîte de dialogue modale. Il existe également un système modal de la boîte de dialogue style.
Depuis vous dire que ce sera une boîte de dialogue modale puis la durée de vie sera courte pour l'ensemble de la construction, de l'écran, et la destruction sera probablement dans une série de lignes de code. Par exemple, dans un
CView
classe avec un gestionnaire de commande de l'affichage d'une boîte de dialogue modale:Ce que le ci-dessus n'est de créer une boîte de dialogue à l'aide de la ressource de boîte de dialogue modèle de
IDD_STATUS
et affiche une boîte de dialogue modale. Puisque c'est l'objet local, lorsque la variableBadFileD
est hors de portée, la boîte de dialogue destructeur sera déclenchée et les ressources les nettoyer pour vous.Vous pouvez aussi avoir une boîte de dialogue non modale. Dans le cas d'une boîte de dialogue non modale vous devez tenir compte de la variable de durée de vie parce que dès que la variable est hors de portée, le destructeur de déclencher et de la boîte de dialogue disparaîtra.
Donc pour une boîte de dialogue non modale être utilisé avec une classe de vue, peut-être de fournir une boîte à outils d'une certaine sorte, la
CDialog
variable sera un membre de laCView
de la classe qui l'utilise. Après la boîte de dialogue non modale est créé, il est affiché ou non à l'aide de laShowWindow()
fonction de membre de laCDialog
classe (en fait un membre de laCWnd
classe à partir de laquelleCDialog
est dérivé).et dans le
CViewThing
classe que vous aurait une variable de membreCDialog BadFileD;
.Considérations supplémentaires
Dans tous les exemples ci-dessus nous ne sommes pas à l'aide de pointeurs de sorte que lorsque le
CDialog
variable est hors de portée, soit à partir de la sortie d'une fonction membre ou lorsque l'objet à l'aide de la boîte de dialogue est détruit, la boîte de dialogue est ainsi. Cet objet de gestion est fait pour nous.Une chose que vous devez prendre en considération avec une boîte de dialogue non modale est comment le détruire quand vous n'en avez plus besoin.
Depuis une boîte de dialogue modale est généralement une courte durée, objet, souvent créées comme des variables locales dans la pile, vous devez normalement juste le laisser aller hors de portée pour prendre soin de tout ce qui concerne la destruction.
Toutefois, la durée de vie d'une boîte de dialogue non modale exige que le
DestroyWindow()
de la méthode utilisée pour détruire la boîte de dialogue lorsqu'il n'est plus nécessaire. Voir Microsoft Developer Network - Destruction de la Boîte de Dialogue.Un troisième scénario d'utilisation - intégration d'une boîte de dialogue
Il y a une troisième utilisation d'une boîte de dialogue qui vient parfois dans la pratique, l'intégration de la boîte de dialogue dans une autre fenêtre comme un contrôle.
Dans les exemples ci-dessus, le modèle de boîte de dialogue indique le
WS_POPUP
style de la boîte de dialogue qui est le style standard pour une boîte de dialogue depuis le moyen normal qu'une boîte de dialogue est utilisée pour afficher dans une fenêtre séparée.Toutefois, si vous modifiez le
WS_POPUP
style deWS_CHILD
vous pouvez ensuite incorporer la boîte de dialogue dans une autre fenêtre comme un contrôle. Vous pouvez supprimer les autres paramètres de style tels queWS_SYSMENU
,DS_MODALFRAME
, etWS_CAPTION
et retirer leCAPTION
ligne à partir du modèle de boîte de dialogue pour modifier davantage la boîte de dialogue. Donc, vous allez vous retrouver avec quelque chose comme:Alors simplement l'utilisation de la boîte de dialogue similaire à la façon dont vous le feriez dans une boîte de dialogue non modale avec
ShowWindow()
.Si vous avez besoin de repositionner l'embedded boîte de dialogue au sein de son conteneur de la fenêtre, vous pouvez utiliser le
SetWindowPos()
méthode pour le faire. Par exemple, le suivant serait de déplacer la fenêtre de boîte de dialogue à l'intérieur de son contenant fenêtre à 20 pixels de la gauche et de 10 pixels à partir du haut de la fenêtre conteneur.OriginalL'auteur Richard Chambers