2009-05-13 8 views
0

ユーザがSDIアプリケーションで新しいドキュメントを作成するとき、最初に置くドキュメントの詳細を指定するダイアログを表示する必要があります(考えられるもの:解像度、ビット深度など) OnNewDocument()でこのダイアログを表示するコード(既存のドキュメントを開くときには必要ありません)が、ドキュメントクラスにユーザーインターフェイスコードを配置するだけでは気になりません(また、 CWnd *をダイアログの親として使用する)。
MFCでこれを行うのに適した場所はありますか?MFCで新しいドキュメントを設定する

答えて

2

あなたはそうです、ドキュメントクラスはUIのための良い場所ではありません。

CDocTemplate::[OpenDocumentFile][1](pszPath)は、より良い候補者のようになります。

pszPathは== NULLは '新しい文書を作成する' という意味します。

メソッドは仮想である - ちょうどので、私はそれを置くのに良い場所だと思い、このクラスは、ドキュメント、フレームとビューを作成する責任があるCSingleDocTemplateからCMySingleDocTemplateを導出し、CMyWinApp::InitInstance().

で、このクラスのインスタンスを使用します> UI操作。

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,...,...); 
    } 
} 

これは理想的ではないかもしれませんが、SDIには唯一のdocオブジェクトがあります。ファイル/ロードとファイル/新規操作の間で再利用されます。

この機能は、初めてと呼ばれ、の最初のメインフレームが作成されます。フレームが作成される前に、ユーザにというダイアログを表示させたくない場合があります。おお!これはもう少し複雑です: 上記のようにOpenDocumentFile(NULL)でGUIをポップアップするのではなく、投稿メインフレームにカスタムメッセージ/コマンドを投稿するだけです。その後、シーケンスポップアップGUI /更新のdoc/updateビューによって反応するハンドラを追加します。そうすることで、メインフレームが表示されてからGUIがポップアップされ、ユーザーはより幸せになれます。

これはまた、CWndの親を持たない場合の問題を解決します。メインフレームはすでに作成されており、ダイアログはデフォルトでそれを使用します。

もう1つの解決策は、CMyWinAppのメッセージマップにID_FILE_NEWのコマンドハンドラを追加し、独自のOnFileNew()のオーバーライドを追加することです。しかし、あなたがOnFileNew()を書くとき、あなたはすぐにそれが醜い解決策であることを知っていると信じています:-(

関連する問題