リソースを消化しましたので、次はCPPファイルとHファイルを解説します。
【MENACE.cpp】
//////////////////////////////////////////
// MENACE.cpp
//Copyright (c) 12/11/2021 by BCCSkelton
//////////////////////////////////////////
#include "MENACE.h"
#include "MENACEProc.h"
////////////////
// WinMain関数
////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
//2重起動防止
if(!MENACE.IsOnlyOne()) {
//ここに2重起動時の処理を書く(下記は1例)
HWND hWnd = FindWindow("MainWnd", "MENACE");
if(IsIconic(hWnd))
ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
return 0L;
}
//モードレスダイアログを作成Create(hParent, DlgName, DlgProc);
if(!MENACE.Create(NULL, hInstance, "IDD_MENACE", ModelessProc))
return 0L;
//メッセージループに入る
return MENACE.Loop();
}
正直解説するところがありません。いつもながらのモードレスダイアログベースのcppファイルです。(二重起動は禁止)
【MENACE.hファイル】
こちらの方はやや(解説:。)が必要です。
//////////////////////////////////////////
// MENACE.h
// Copyright (c) 12/11/2021 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include "BCCSkelton.h"
//リソースIDのヘッダー
#include "ResMENACE.h"
//CMENACEのヘッダー
#include "CMENACE.h"
(解説:既にCUIプログラムでテストしたCMENACEの宣言、定義ファイルです。これを読み込むとBOARD構造体、CBOARDクラスおよびSTL関連が使えるようになります。)
/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CDLG
{
public: //以下はコールバック関数マクロと関連している
//2重起動防止用のMutex用ID名称
CMyWnd(char* UName) : CDLG(UName) {}
//メンバー変数
CMENACE m_Menace; //MENACE本体
int m_You; //Player(先手-1、後手-2、機械対戦-3)
int m_Result; //ゲーム結果(未了0、先手勝利1、後手勝利2、引き分け3)
int m_Times; //各対戦の手数カウンター
int m_Games; //連続機械対戦のゲーム数
int m_1st; //先手の勝数
int m_2nd; //後手の勝数
int m_Draw; //引き分け数
CSTR m_FileName; //データファイル名
(解説:。CUIプログラムでmain関数内にあったものをIDD_MENACEダイアログのクラス(CMyWnd)へ移植します。順にCMENACE本体(インスタンス)、先手・後手・機械対戦選択フラグ、ゲーム勝敗結果フラグ、手数カウンター、対戦数カウンター、先手勝利・後手勝利・引き分けカウンターとMENACE.datというデータファイルのファイルパス、名の記録用CSTR変数です。)
//メニュー項目、ダイアログコントロール関連
bool On0();
bool On1();
bool On2();
bool On3();
bool On4();
bool On5();
bool On6();
bool On7();
bool On8();
(解説:0 - 8は〇×ゲーム盤の打手用ボタンです。)
bool OnOpen();
bool OnSave();
bool OnSaveas();
bool OnExit();
bool OnFm();
bool OnSm();
bool OnAuto();
bool OnAbout();
bool OnVersion();
(解説:メニューアイテムです。)
//ウィンドウメッセージ関連
bool OnInit(WPARAM, LPARAM);
bool OnNotify(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
bool OnDestroy(WPARAM, LPARAM);
//ユーザー定義関数
void Init(); //ゲーム初期化関数
int Turn(int); //ゲーム処理関数
void WhenOver(); //ゲーム終了関数
void ChangeMenuStatus(bool); //メニュー関係有効無効化処理
(解説:ユーザー定義関数として、順に対戦前の初期化、一手ごとに通過する打手処理、勝負判定処理の関数、勝敗が決着した際の処理関数、メニューとツールバーボタンを対戦中無効にする関数です。)
};
////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ)の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd MENACE("MENACE"); //ウィンドウクラスインスタンスの生成
BEGIN_MODELESSDLGMSG(ModelessProc, MENACE) //コールバック関数名は主ウィンドウの場合ModelessProcにしている
//メニュー項目、ダイアログコントロール関連
ON_COMMAND(MENACE, IDC_0, On0())
ON_COMMAND(MENACE, IDC_1, On1())
ON_COMMAND(MENACE, IDC_2, On2())
ON_COMMAND(MENACE, IDC_3, On3())
ON_COMMAND(MENACE, IDC_4, On4())
ON_COMMAND(MENACE, IDC_5, On5())
ON_COMMAND(MENACE, IDC_6, On6())
ON_COMMAND(MENACE, IDC_7, On7())
ON_COMMAND(MENACE, IDC_8, On8())
ON_COMMAND(MENACE, IDM_OPEN, OnOpen())
ON_COMMAND(MENACE, IDM_SAVE, OnSave())
ON_COMMAND(MENACE, IDM_SAVEAS, OnSaveas())
ON_COMMAND(MENACE, IDM_EXIT, OnExit())
ON_COMMAND(MENACE, IDM_FM, OnFm())
ON_COMMAND(MENACE, IDM_SM, OnSm())
ON_COMMAND(MENACE, IDM_AUTO, OnAuto())
ON_COMMAND(MENACE, IDM_ABOUT, OnAbout())
ON_COMMAND(MENACE, IDM_VERSION, OnVersion())
//ウィンドウメッセージ関連
//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
ON_DESTROY(MENACE)
END_DLGMSG
(解説:マクロでウィンドウコールバック関数に展開される部分です。)
///////////////////////////////////////////
// CDLGクラスからINPUTDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class INPUTDLG : public CDLG {
public:
//コントロール関連
bool OnInit(WPARAM, LPARAM);
bool OnOk();
bool OnCancel();
};
(解説:機械対戦(自動対戦)の際の何回勝負にするかの入力ダイアログです。)
////////////////////////////////////////////////////////////////////////////
// INPUTDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
INPUTDLG inputdlg;
BEGIN_MODALDLGMSG(inputdlgProc, inputdlg) //第1引数がコールバック関数の名前
ON_COMMAND(inputdlg, IDOK, OnOk())
ON_COMMAND(inputdlg, IDCANCEL, OnCancel())
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからINFODLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class INFODLG : public CDLG {
public:
//コントロール関連
bool OnInit(WPARAM, LPARAM);
bool OnOk();
bool OnCancel();
};
(解説:現在のMENACE.datに記録され、毎回DBに読み込まれる盤面データの数、先手勝利、後手勝利、引き分けの毎回使用時の集計です。再shMessageBoxで表示していたのですが、専用ダイアログを作ってあげました。なお、iniファイルをつかって累計を記録することも考えましたが、最後は引き分けばかりで無駄なので止めました。)
////////////////////////////////////////////////////////////////////////////
// INFODLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
INFODLG infodlg;
BEGIN_MODALDLGMSG(infodlgProc, infodlg) //第1引数がコールバック関数の名前
ON_COMMAND(infodlg, IDOK, OnOk())
ON_COMMAND(infodlg, IDCANCEL, OnCancel())
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
//コントロール関連
bool OnOk();
bool OnCancel();
};
(解説:単なるバージョン表示ダイアログです。)
////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;
BEGIN_MODALDLGMSG(versiondlgProc, versiondlg) //第1引数がコールバック関数の名前
ON_COMMAND(versiondlg, IDOK, OnOk())
ON_COMMAND(versiondlg, IDCANCEL, OnCancel())
END_DLGMSG
///////////////////
//ツールバーの作成
///////////////////
CTBAR TBar;
///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;
////////////////////////
//コモンダイアログの作成
////////////////////////
CMNDLG cmndlg;
////////////////////////
//CARGインスタンスの作成
////////////////////////
CARG arg;
(解説:ツールバーやステータスバー、コモンダイアログは説明不要でしょう。CARGクラスは、Windowsプログラムが起動した際に、昔のCのプログラムのint argc、char** argvをarg.c()、arg.v()で実現するツールクラスです。)
///////////////////////////////
//ボタン貼り付け用ビットマップ
///////////////////////////////
HBITMAP g_hNought;
HBITMAP g_hCross;
HBITMAP g_hVacant;
(解説:。OnCreate()でリソースのビットマップを読み込んでおきますが、そのハンドルです。
あっ!!!OnClose()で廃棄するのを忘れていました!!!
ブログのおかげでメモリーリークが防げました。差し替え版を本日アップしました。)
後はProc.hですね。年内に完了しそうでほっとします。