1

次の要件を備えたMFCSDI(シングルドキュメントインターフェイス)アプリケーションを構築しようとしています。

  1. 一度に1つのドキュメントのみを表示します。

  2. ファイルを開くダイアログから選択したファイルタイプに基づいて、さまざまなビューをサポートします。たとえば、*。txtファイルを選択した場合はMyCViewTextを表示し、*。jpgファイルを選択した場合はMyCViewImageを表示します。

  3. ファイル拡張子ファイルを開くダイアログのカスタムリストを表示します。たとえば、次のようなカスタムダイアログとフィルタを使用します。CFileDialog *dlg = new CFileDialog(TRUE, NULL, NULL, NULL, L"Text Files (*.txt)|*.txt|" L"JPEG Files (*.jpg)|*.jpg||");

しかし、私には2つの問題があります。

まず、[ファイル]->[開く]ダイアログのファイル拡張子フィルターをどこに挿入するかわかりません。CWinApp::OnFileOpen()カスタムでオーバーライドすると、呼び出しの呼び出しやドキュメントテンプレートのCViewの初期化CFileDialogなど、SDIが提供する舞台裏の動作がすべて失われます。最初のファイル拡張子フィルターなしで2番目のファイルを開くダイアログが表示されるため、オーバーライドCDocument::OnDocumentOpen()を呼び出すことができません。CWinApp::OnFileOpen()

次に、ファイルを開くダイアログからファイルを選択した後、ビュートグルコードをどこに挿入するかわかりません。ドキュメントテンプレートは次のように設定されます。

pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CMyAppDoc),
    RUNTIME_CLASS(CMainFrame),
    RUNTIME_CLASS(CMyCView));

ドキュメントテンプレートビューRUNTIME_CLASS(CMyCView)をオーバーライドして切り替えたいようですがCWinApp::OnFileOpen()、これが可能かどうかはわかりません。

MFC SDIは私の3つの要件にぴったりではありませんか?代わりにMFCMDIアプリケーションを使用する必要がありますか?どういうわけかMDIを使用する必要がある場合、常に1つのドキュメントのみをロードして表示するように制限するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

3

InitInstance関数で、新しいSingleDocTemplateを作成し、それをテンプレートのコレクションに追加します。

CSingleDocTemplate* pDocTemplate2;
  pDocTemplate2 = new CSingleDocTemplate(IDR_MAINFRAME2,
     RUNTIME_CLASS(CMyDoc2),
     RUNTIME_CLASS(CMainFrame),       // main SDI frame window
     RUNTIME_CLASS(CMyView2));
  if (!pDocTemplate2)
     return FALSE;

  AddDocTemplate(pDocTemplate2);

ファイルの種類と拡張子は、文字列テーブルエントリに含まれます。

IDR_MAINFRAME2 "MyCalc Windows Application\nSheet\nWorksheet\n Worksheets (*.myc)\n.myc\nMyCalcSheet\n MyCalc Worksheet"

MFCはテンプレートを認識し、[ファイル]-[新規]または[ファイル-開く]のオプションとして提供します。要件によっては、CMyDoc2およびCMyView2の新しいクラスを作成する必要がある場合があります。または、いずれかのファイルタイプで機能させることができる場合は、元のクラスを使用する必要があります。

于 2013-02-03T20:48:56.410 に答える