2009-05-13 8 views
0

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

2

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 :-(

Questions connexes