【LightCycle.cpp】

//////////////////////////////////////////
// LightCycle.cpp
//Copyright (c) 10/30/2021 by BCCSkelton
//////////////////////////////////////////
#include    "LightCycle.h"
#include    "LightCycleProc.h"

////////////////
// WinMain関数
////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow) {

    //2重起動防止
    if(!LightCycle.IsOnlyOne()) {
        //ここに2重起動時の処理を書く(下記は1例)
        HWND hWnd = FindWindow("MainWnd", "LightCycle");
        if(IsIconic(hWnd))
            ShowWindow(hWnd, SW_RESTORE);
        SetForegroundWindow(hWnd);
        return 0L;
    }

    //ウィンドウ登録 - Init(ClassName, hInstance, WndProc, "IDM_MAIN",
    //                        (以下省略可)MAKEINTRESOURCE(IDI_ICON), IDC_ARROW, Brush)
    LightCycle.Init("MainWnd", hInstance, SDIPROC, "IDM_MAIN", MAKEINTRESOURCE(IDI_ICON));

    //ウィンドウ作成と表示-Create(WindowTitle, (以下省略可)Style,
    //                        ExStyle, hParent, hMenu, x, y, w, h)
    if(!LightCycle.Create("LightCycle"))
        return 0L;

    //メッセージループに入る
    return LightCycle.Loop();
}
 

【LightCycle.h】

//////////////////////////////////////////
// LightCycle.h
// Copyright (c) 10/30/2021 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include    "BCCSkelton.h"
//リソースIDのヘッダー
#include    "ResLightCycle.h"
//CLightCycleクラスのヘッダー
#include    "CLightCycle.h"
//ユーザー定義のヘッダー
#include    "User.h"

/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCSDIクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CSDI
{
public:    //メンバー変数
    CANVAS m_cvs;            //仮想ウィンドウ
    int m_NoLC;                //LightCycle台数
    CTIMER m_tm[4];            //タイマー
    CLIGHTCYCLE m_LC[4];    //LightCycle競技車
public:    //以下はコールバック関数マクロと関連している
    //2重起動防止用のMutex用ID名称
    CMyWnd(char* UName) : CSDI(UName) {}
    //メニュー項目、ダイアログコントロール関連
    bool OnAdd();
    bool OnOpen();
    bool OnSave();
    bool OnExit();
    bool OnGo();
    bool OnStop();
    bool OnVersion();
    bool OnSLine();
    bool OnQCurve();
    bool OnCCurve();
    bool OnCircle();
    bool OnSine();
    //ウィンドウメッセージ関連
    bool OnCreate(WPARAM, LPARAM);
    bool OnTimer(WPARAM, LPARAM);
    bool OnLButtonDown(WPARAM, LPARAM);
    bool OnRButtonDown(WPARAM, LPARAM);
    bool OnNotify(WPARAM, LPARAM);
    bool OnSize(WPARAM, LPARAM);
    bool OnPaint(WPARAM, LPARAM);
    bool OnClose(WPARAM, LPARAM);
    bool OnMinMax(WPARAM, LPARAM);
    //ユーザー定義関数
    void ChangeMenuStatus(bool, bool);    //「ゲーム」メニューとツールバーボタン状態の変更
};

////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ)の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd LightCycle("LightCycle");    //ウィンドウクラスインスタンスの生成

BEGIN_SDIMSG(LightCycle)    //ダイアログと違い、コールバック関数名を特定しない
    //メニュー項目、ダイアログコントロール関連
    ON_COMMAND(LightCycle, IDM_ADD, OnAdd())
    ON_COMMAND(LightCycle, IDM_OPEN, OnOpen())
    ON_COMMAND(LightCycle, IDM_SAVE, OnSave())
    ON_COMMAND(LightCycle, IDM_EXIT, OnExit())
    ON_COMMAND(LightCycle, IDM_GO, OnGo())
    ON_COMMAND(LightCycle, IDM_STOP, OnStop())
    ON_COMMAND(LightCycle, IDM_VERSION, OnVersion())
    //ウィンドウメッセージ関連
    ON_CREATE(LightCycle)
    ON_TIMER(LightCycle)
    ON_LBUTTONDOWN(LightCycle)
    ON_RBUTTONDOWN(LightCycle)
    ON_NOTIFY(LightCycle)
    ON_SIZE(LightCycle)
    ON_PAINT(LightCycle)
    ON_CLOSE(LightCycle)
    ON_(LightCycle, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
END_WNDMSG

///////////////////////////////////////////
// CDLGクラスからINPUTDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class INPUTDLG : public CDLG {
public:
    //メンバー変数
    HWND m_hTip;                //IDC_IMAGE用ツールチップ
    //ウィンドウメッセージ関連
    bool OnInit(WPARAM, LPARAM);
    //コントロール関連
    bool OnSelChange(WPARAM);
    bool OnImage();
    bool OnOk();
    bool OnCancel();
    //ユーザー定義関数
    void SetData(int);
};

////////////////////////////////////////////////////////////////////////////
// INPUTDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
INPUTDLG inputdlg;

BEGIN_MODALDLGMSG(inputdlgProc, inputdlg)    //第1引数がコールバック関数の名前
    ON_COMMAND(inputdlg, IDC_COMBOBOX0, OnSelChange(wParam))
    ON_COMMAND(inputdlg, IDC_IMAGE, OnImage())
    ON_COMMAND(inputdlg, IDOK, OnOk())
    ON_COMMAND(inputdlg, 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;

 

【User.h】

///////////////////
//ユーザー定義関係
///////////////////

///////////////////////
//LightCycleの識別色名
///////////////////////
char* g_Col[8] = {"グレイ",
                "ブルー",
                "レッド",
                "マゼンダ",
                "グリーン",
                "シアン",
                "イエロー",
                "ホワイト"};

///////////////////////
//LightCycleの進行方向
///////////////////////
char* g_Dir[8] = {"上",
                "右上",
                "右",
                "右下",
                "下",
                "左下",
                "左",
                "左上"};

///////////////////////
//LightCycleのスピード
///////////////////////
char* g_Speed[3] = {"1/1000",
                "10/1000",
                "100/1000"};

int g_Velo[3] = {1, 10, 100};

///////////////////////
//LightCycleの進行方向
///////////////////////
char* g_Caprice[4] = {"転回しない",
                "100回に1回",
                "200回に1回",
                "400回に1回"};

///////////////////////////////////////
//CLIGHTCYCLEクラス静的変数インスタンス
///////////////////////////////////////
HDC CLIGHTCYCLE::m_hDC;        //表示デバイスのハンドル
int CLIGHTCYCLE::m_MinX;    //x座標最小値
int CLIGHTCYCLE::m_MinY;    //y座標最小値
int CLIGHTCYCLE::m_MaxX;    //x座標最大値
int CLIGHTCYCLE::m_MaxY;    //y座標最大値

//////////////////////
//Timer定数の外部変数
//////////////////////
UINT g_Timer[4] = {IDT_TIMER0, IDT_TIMER1, IDT_TIMER2, IDT_TIMER3};

/////////////////////
//ゲーム進行中フラグ
/////////////////////
bool g_On = FALSE;

//////////////////////////////////
//データファイル用CINIインスタンス
//////////////////////////////////
CINI g_File;