リソースを消化しましたので、次は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ですね。年内に完了しそうでほっとします。