テクニカルレシピ(Visual C++のレシピ)

Home>>Visual C++>>シングルDocument LastUpdate: 2009-01-21

シングルドキュメントで初級アプリ

ここではシングルドキュメントを使って○×ゲームを作ってみます。
シングルドキュメントではダイアログより格段に手順が複雑になります。
Doc-Viewアーキテクチャに留意したプログラミングが必要だからです。

なおシングルドキュメントでのイベントハンドラの設定や、
Doc-Viewアーキテクチャについてはここでは説明しませんので、
前述の該当ページを見てください。

このアプリはメニューの「○×(G)」を選択後「Start(S)」をクリックするとゲームが始まります。
あとは先手から順に画面をクリックして○と×を交互に埋めていき、
どちらかが一列をとると決着がつきます。
(ソースファイルはサンプルコードのMaruBatsu.zipにまとめています。)

  

シングルドキュメントでは何をDocのメンバ変数にするかよく考えましょう。
原則として表示に関連するデータは全てDocのメンバ変数にする必要があります。

このアプリでは以下のメンバをDocクラスに設定しました。
int m_field[3][3]; //○×フィールド。1は○、0は×、10は未入力。
int m_win; //勝負がついたかどうか。1は○、0は×、3は引き分け、10は勝負中。
BOOL m_play; //ゲーム中かどうか。TRUEはゲーム中、FALSEは停止中。
int m_token; //○と×の手番識別。1は○、0は×。

このメンバはコンストラクタでデータの初期化を行います。

このメンバを踏まえたViewクラスのOnDraw関数を示します。
GetDocumentでDocクラスのメンバを参照し、
各メンバ変数の値により表示を切り替えています。

なおこのアプリの○と×にはビットマップデータを使っています。
まずIDB_BITMAP_MARUが○のビットマップデータです。

IDB_BITMAP_BATSUが×のビットマップデータです。

ゲームの開始はメニューのイベントハンドラ関数から行います。
メニューに「○×(G)」と「Start(S)」を追加して下さい。

「Start(S)」のイベントハンドラ関数をViewクラスに作成します。

このイベントハンドラでは、DocクラスのOnStartを呼んでいるだけです。
OnStartの実体をDocクラスで作りましょう。

OnStartはメンバ変数を初期化し、
「m_play」を「TRUE」に切り替えゲーム開始を宣言します。

ゲームが開始になったら、マウスのクリックに対応して○と×を埋めなくてはいけません。
そのためマウスのクリックに対応したイベントハンドラ関数を作成する必要があります。

ここではやり方だけ書いてしまいます。
クラスビューから「C***View」クラスを選択し、プロパティの「メッセージ」を選択してください。
そして「WM_LBUTTONDOWN」に対し、「OnLButtonDown」という関数を作成します。

OnLButtonDownの中身を記述しましょう。
ここも単純にDocクラスのOnClick関数を呼んでいるだけです。

最後にDocクラスのOnClick関数を記述します。
この関数はクリック毎にフィールドに○×を入力したり、
○×のトークンを入れ替えたり、勝敗判定をする重要な関数です。

以上、ここまで書いてやっと○×ゲームの完成です。
大変に思えるかもしれませんが、慣れると1時間程度で作れるようになります。

シングルドキュメントが使えるようになるとプログラムの幅も広がるので、
是非色々作りながら憶えていってください。

ダイアログベース:前項<< ページの先頭に戻る >>次項:ダメアプリを知る


このエントリーをはてなブックマークに追加