【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;