ドキュメント/ビュー アーキテクチャの代替手段
通常、MFC アプリケーションでは、ドキュメント/ビュー アーキテクチャを使用して、情報、ファイル形式、およびユーザーへのデータ表示を管理できます。 ドキュメント/ビュー アーキテクチャは、大部分のデスクトップ アプリケーションに対して適切で効率的なアプリケーション アーキテクチャです。 このアーキテクチャでは、データ管理がデータ表示から切り離されるので、ほとんどの場合に、アプリケーションが単純化され、冗長なコードが減ります。
ただし、ドキュメント/ビュー アーキテクチャが適さない場合もあります。 たとえば、次のような場合です。
C で記述された Windows 対応のアプリケーションを移植していて、アプリケーションにドキュメント/ビューのサポートを追加することよりも、移植作業自体を完了することの方が先である場合。
簡単なユーティリティを作成していて、ドキュメント/ビュー アーキテクチャは不要と判断できる場合。
元のコードで既にデータ管理とデータ表示が混在している場合は、その 2 つを分離する必要があるため、コードをドキュメント/ビュー モデルに書き直す作業には手間がかかります。 元のコードをそのまま使用することをお勧めします。
ドキュメント/ビュー アーキテクチャを使わないアプリケーションを作成するには、MFC のアプリケーション ウィザードのステップ 1 で [ドキュメント ビュー アーキテクチャ サポート] チェック ボックスをオフにします。 詳細については、「MFC アプリケーション ウィザード」を参照してください。
注意
MFC のアプリケーション ウィザードで作成されるダイアログ ベースのアプリケーションは、ドキュメント/ビュー アーキテクチャを使用しません。ダイアログ アプリケーション タイプを選択した場合、[ドキュメント ビュー アーキテクチャ サポート] チェック ボックスは使用不可になります。
Visual C++ の各ウィザードでは、ソース エディターおよびダイアログ エディターと同じく、生成されたアプリケーションをほかのウィザードで生成されたアプリケーションと同様に編集できます。 このアプリケーションには、ツール バー、スクロール バー、およびステータス バーをサポートでき、[バージョン情報] ダイアログ ボックスも使用されています。 ただし、ドキュメント テンプレートが登録されず、ドキュメント クラスもありません。
生成されたアプリケーションには、CWnd の派生ビュー クラスである CChildView が定義されています。 アプリケーションで作成されたフレーム ウィンドウには、MFC によって作成されたビュー クラスのインスタンスが 1 つ配置されます。 MFC で依然としてビュー ウィンドウを使用する理由は、アプリケーションのコンテンツの配置と管理を簡単に行うことができるためです。 このクラスの OnPaint メンバーには、描画コードを追加できます。 コードでは、スクロール バーをフレームではなくビューに追加します。
MFC のドキュメント/ビュー アーキテクチャによって、アプリケーションの基本機能の多くが実装されます。このアーキテクチャを使用しないプロジェクトでは、次のように、アプリケーションの多くの主要機能を自分で実装する必要があります。
MFC のアプリケーション ウィザードの既定では、アプリケーションの [ファイル] メニューには [新規作成] と [アプリケーションの終了] だけが用意されます。 [新規作成] は、MDI アプリケーションだけでサポートされます。ドキュメント/ビュー サポートのない SDI アプリケーションには対応していません。生成されるメニュー リソースでは、MRU リスト (最近使ったファイルの一覧) はサポートされません。
[ファイル] メニューの [開く] と [上書き保存] など、アプリケーションでサポートするコマンドについては、ハンドラー関数および実装を追加する必要があります。 通常、これらの機能をサポートするコードは MFC で用意されます。ただし、このようなサポートは、ドキュメント/ビュー アーキテクチャ専用になります。
アプリケーションのツール バーは、作成を要求しても、最小限の要素だけになります。
ドキュメント/ビュー アーキテクチャを使わずにアプリケーションを開発するときは、MFC のアプリケーション ウィザードの使用をお勧めします。これは、アプリケーション ウィザードによって、正しい MFC アーキテクチャが保証されるためです。 ただし、ウィザードを使用できない場合は、ドキュメント/ビュー アーキテクチャに代わる方法として次のようにコードを記述できます。
前述したように、ドキュメントは使用せず、ビュー クラスでデータ管理コードを実装します。 ドキュメントのオーバーヘッドは、比較的低くなります。 1 つの CDocument オブジェクトにはそれだけで少量のオーバーヘッドがあります。それに加えて、CDocument の基本クラスである CCmdTarget と CObject の小さなオーバーヘッドもあります。 CDocument の 2 つの基本クラスは、どちらも小さなクラスです。
CDocument で宣言される内容は次のとおりです。
2 つの CString オブジェクト。
3 つの BOOL。
1 つの CDocTemplate ポインター。
1 つの CPtrList オブジェクト。ドキュメントのビューのリストを保持しています。
さらに、ドキュメントでは、ドキュメント オブジェクト、そのビュー オブジェクト、フレーム ウィンドウ、およびドキュメント テンプレート オブジェクトを作成する時間が必要です。
ドキュメントとビューを単なる付属物として扱い、どちらも使いません。 データ管理とデータ表示のコードは、ビューではなくフレーム ウィンドウに実装します。 これは、C 言語プログラミング モデルに近い方法です。
ドキュメントとビューが作成されないように、MFC フレームワークの該当部分をオーバーライドします。 ドキュメントの作成処理は、CWinApp::AddDocTemplate の呼び出しで開始されます。 アプリケーション クラスの InitInstance メンバー関数からの呼び出しを削除し、その代わりに InitInstance でフレーム ウィンドウを作成します。 データ管理コードをフレーム ウィンドウ クラスに入れます。 ドキュメント/ビュー作成処理の手順については、「ドキュメントおよびビューの作成」を参照してください。 この方法は作業上の負担が大きく、フレームワークに関する十分な理解が必要ですが、ドキュメント/ビューによるオーバーヘッドを皆無にできます。
「MFC:データベース ドキュメント クラスとビューを使用してデータベース アプリケーションのコンテキストでのドキュメント/ビュー代替手段のより具体的な例を与えます。