Lorsque l'utilisateur crée un nouveau document dans mon application SDI, je dois présenter une boîte de dialogue spécifiant les détails du document à créer (penser: résolution, profondeur de bits, etc.). le code pour afficher cette boîte de dialogue dans OnNewDocument() (je n'en ai pas besoin pour ouvrir un document existant), mais mettre du code d'interface utilisateur dans la classe document ne me semble pas juste (aussi, je n'en ai pas) CWnd * à utiliser en tant que parent pour la boîte de dialogue).
Y a-t-il un meilleur endroit pour faire cela dans MFC?Configuration d'un nouveau document dans MFC
Répondre
Vous avez raison, la classe de document n'est pas un bon endroit pour l'interface utilisateur.
CDocTemplate::[OpenDocumentFile][1](pszPath)
ressemble à un meilleur candidat:
pszPath == NULL signifie «créer un nouveau document.
La méthode est virtuelle -> Il suffit de tirer CMySingleDocTemplate
de CSingleDocTemplate
et utiliser une instance de cette classe dans CMyWinApp::InitInstance().
Cette classe est responsable de la création docs, des cadres et des vues, je pense donc qu'il est un bon endroit pour mettre un Opération d'interface utilisateur
BOOL CMyWinApp::InitInstance()
{
...
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CMySingleDocTemplate(// <--Derives from CSingleDocTemplate
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
...
}
CDocument* CMySingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)
{
CDocument *pDoc =
CSingleDocTemplate::OpenDocumentFile(lpszPathName, bMakeVisible);
if (lpszPathName==NULL)
{
// GUI to get user info
// update doc
m_pOnlyDoc->Blah(input);
// update view
m_pOnlyDoc->UpdateAllViews(NULL,...,...);
}
}
Ceci peut ne pas être idéal si: Dans SDI, il existe un seul et unique objet doc. Il est réutilisé entre Fichier/Charger et Fichier/Nouvelle opération.
Cette fonction sera appelée une première fois avant l'unité centrale initiale est créée. Vous ne voulez pas avoir une boîte de dialogue présentée à l'utilisateur avant le cadre est créé. Aie! C'est un peu plus compliqué: Au lieu de faire apparaître une interface graphique dans OpenDocumentFile (NULL) comme ci-dessus, juste post un message personnalisé/commande à l'image principale. Ensuite, ajoutez un gestionnaire qui réagira en affichant les commandes GUI/update doc/update. De cette façon, le cadre principal sera affiché avant l'apparition de l'interface graphique et votre utilisateur sera plus heureux.
Cela résout également votre problème lorsque vous n'avez pas de parent CWnd: le cadre principal est déjà créé et votre boîte de dialogue l'utilisera par défaut.
BTW, une autre solution consiste à ajouter un gestionnaire de commande pour ID_FILE_NEW dans la mappe de messages de votre CMyWinApp et ajouter votre propre override de OnFileNew(). Mais quand vous écrivez OnFileNew(), je crois que vous découvrirez rapidement que c'est une solution moche :-(
- 1. créer un nouveau document vide avec javascript
- 2. Création d'un nouveau document pdf en utilisant AcroEXch dans VBScript
- 3. Structure du document Single Document
- 4. MFC: désactiver les fonctions Nouveau fichier et Enregistrer le fichier dans l'application SDI
- 5. CStringList dans MFC
- 6. contrôle OwnerDrawn dans MFC
- 7. Détail grille dans MFC
- 8. Quel est le nouveau marqueur de ligne dans un document Word téléchargé?
- 9. Lire un document dans Lucene
- 10. skinning applications MFC
- 11. MFC LoadString dans dll échoue
- 12. Contrôles de redimensionnement dans MFC
- 13. Comment puis-je créer un nouveau pool d'applications dans un projet de configuration Web?
- 14. MFC CFindReplaceDialog destruction
- 15. Configuration des alertes dans SharePoint
- 16. iphone: faire un nouveau UIImage à partir de données d'un document XML
- 17. Comportement Odd Bibtex dans un document Latex
- 18. Créer un élément dans un document xml
- 19. Générer le document 2003 document
- 20. Comment créer un guid dans MFC
- 21. Création d'une grille de propriétés dans MFC
- 22. boîte de dialogue dans un programme MFC
- 23. MFC CSocket dans une bibliothèque statique
- 24. Message WM_POWERBROADCAST non détecté dans MFC Dlg
- 25. dans mfc comment implémenter le dialogue ancrable?
- 26. Obtenir Cursors.AppStarting dans Win32 ou MFC?
- 27. Bitmap XY dans une application MFC
- 28. Comment désactiver le bouton Agrandir dans MFC?
- 29. Sélection de colonne dans ListView (MFC)
- 30. nouveau TXMLDocument dans Borland C++ Builder