MFCのSDI

MFCは,Doc-Viewスタイルでのプログラミングを行うようにテンプレートが完成している.そして,テンプレートの上にコードを書いていくスタイルを取るように出来ている.SDIであれば基本的に単一のViewクラスが用意される.SDIはSingle Document Interface,ドキュメントが1つなのだから,Viewも1つあれば十分だろうということなのか.きっとそうなのだろう.

SDIでのプログラミングは,Docクラスにデータを,Viewクラスに表示を追加していくことで行う.例えば,Docクラスに座標データを,Viewクラスに座標から線を引くなどするデータを用意すれば,簡易的なドローツールが出来る.

手順1:Docにデータを保存するメンバを追加
手順2:ViewのOnDrawにデータを表示する関数を構築
手順3:ユーザーからの入力に応対する関数を追加
(CMainFrameかViewに用意することになる.)
(Visual C++の左側,プロパティからイベント追加.)

処理の流れ
GUIへの入力
  -> CMainFrame や View自身が入力に対応する
  -> 対応の中で,Docのデータを変更する.
 (ついでに,Viewの更新を指示して表示を更新するのがよい)
再描画を指示された Viewクラスは再描画をする.
  -> Docのデータを読み出してきて
  -> そのデータを解釈し,描画を行う.

ここでふと気付くのが,「View自身がデータを持ってもいいじゃないか」ということ.そうしないのはひとえに

「Docクラスには,ファイルを開くなど,別の役割を持っている」
「Docに指示したいのであってViewに指示したい訳ではない場合,がある」
例えば,保存の処理,新規作成の処理など.ボタンが押されてそれに対処するのはViewでもDocでもできてしまう.Docでしか出来ない処理も,処理を指示するメンバ関数を呼び出して代用することもできる.がしかし,面倒である.
Docで処理できることをわざわざViewに処理させるのは,なにか意図があるか,単にDocを使いたくないか,などの理由ぐらいしか思いつかない.そしてなにより,MFCが用意したDoc-Viewスタイルをわざわざ無視するのもなんだろう,ということでもある.