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スタイルをわざわざ無視するのもなんだろう,ということでもある.