ちゃんと"DICE"クラスウィンドウ(ダイアログコントロール)であるDiceCtrlが動くかどうか、テスト用に「チンチロリン」というサイコロ賭博の親のプレイをシミュレートするアプリを作ってみます。題して(チンチロリンの米国別名)"Dice"です。

 

1.リソース(Dice.rc)

何度も繰り返して恐縮ですが、BCCForm and BCCSkeltonでは、先ずリソースを確保してからコーディングするので、チンチロリンをどう見せるか、から入ります。(といっても、サイコロ三つを振るのはDiceCtrlを使うのですが。なお、ResDice.hは定数定義だけなので省略します。)

 

//-----------------------------------------
//             BCCForm Ver 2.41
//    An Easy Resource Editor for BCC
//  Copyright (c) February 2002 by ysama
//-----------------------------------------
#include    "ResDice.h"

//----------------------------------
// ダイアログ (IDD_MAIN)
//----------------------------------
IDD_MAIN DIALOG DISCARDABLE 0, 0, 296, 141
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER | DS_SETFONT
CAPTION "Dice - ChinChiroRin"
FONT 8, "Times New Roman"
{
 CONTROL "", IDC_D1, "DICE", WS_CHILD | WS_VISIBLE | WS_DLGFRAME, 8, 9, 48, 42, WS_EX_WINDOWEDGE
 CONTROL "", IDC_D2, "DICE", WS_CHILD | WS_VISIBLE | WS_DLGFRAME, 85, 9, 48, 42, WS_EX_WINDOWEDGE
 CONTROL "", IDC_D3, "DICE", WS_CHILD | WS_VISIBLE | WS_DLGFRAME, 162, 9, 48, 42, WS_EX_WINDOWEDGE

 CONTROL "", IDC_EDIT, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_LEFT, 6, 61, 282, 60, WS_EX_CLIENTEDGE
 CONTROL "", IDC_STATUSBAR, "MSCTLS_STATUSBAR32", WS_CHILD | WS_VISIBLE | CCS_TOP | CCS_NOMOVEY, 0, 129, 0, 0
 CONTROL "How to use", IDC_HOWTOUSE, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 231, 3, 51, 15
 CONTROL "Roll", IDC_ROLL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 231, 22, 51, 15
 CONTROL "Exit", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 231, 42, 51, 15
}
//(解説:ダイアログに表示用のEDITコントロール、ステータスバーと操作用のボタン3つ付けて、後は単純にサイコロ("DICE")を三つ並べただけです。"DICE"コントロールはまだWindows OSには存在していないことにご注意を。なおデフォルトとして表示はTimes New Roman英語にしてあります。)


//--------------------------
// イメージ(IDI_ICON)
//--------------------------
IDI_ICON    ICON    DISCARDABLE    "Dice.ico"
//(解説:ちょいと雰囲気を出すために、サイコロにしてみました。)


//--------------------------
// サウンド(IDS_DICE)
//--------------------------
IDS_DICESOUND    WAVE    "DiceSound.wav"

//(解説:これも雰囲気を出すために、コントロールのデフォルト音源ではなく、丼に3個のサイコロを転がすチンチロリンのフリー音源にしてみました。)

/*
//--------------------
// ストリングテーブル
//--------------------
STRINGTABLE DISCARDABLE
{
 Str_00, "Dice - Chinchirorin"
 Str_01, "How to use"
 Str_02, "Roll"
 Str_03, "Exit"
 Str_04, "Record is given here"
 Str_05, "Dice - チンチロリン"
 Str_06, "使い方"
 Str_07, "投賽"
 Str_08, "終了"
 Str_09, "戦績表示"
}
*/

//(解説:ストリングテーブルはこんな表記をするのですが、プログラムの中でロードする必要があり、扱いが面倒なので「やんぴ」しました。)

 

2.CPPファイル

これは何の変哲もないプログラムです。(2重起動を許可しているのでいくつも日本語、英語で賭場を立てることができますよ。)

SkeltonWizardはModelessダイアログで出力したのですが、私が勝手にモーダルダイアログに変えちゃいました。

ポイントは"DICE"を登録するところです。

 

//////////////////////////////////////////
// Dice.cpp
//Copyright (c) 05/21/2022 by BCCSkelton
//////////////////////////////////////////
#include    "Dice.h"
#include    "DiceProc.h"

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

    //"DICE"コントロールの登録
    InitDiceCtrl(hInstance);

    //(解説:DiceCtrl.cppのこの関数を確認してください。)

 

    //モーダルダイアログを作成DoModal(HWND, LPCTSTR, DLGPROC, HINSTANCE);
    return Dice.DoModal(NULL, "IDD_MAIN", ModalProc, hInstance);
}
 

3.Dice.hファイル

モードレスダイアログ用のファイルをモーダルダイアログ様に書き換えてます。(といってもほとんど同じなのでそのままでも動きますけどね。)

後はDiceCtrl.dllを使うので、そのヘッダーとライブラリーを使うこと、InitDiceCtrl関数をインポートすること、WAVEを使うのでwinmm.libを使うこと、バイリンガル文字列変数を定義することなどでしょうか?

 

//////////////////////////////////////////
// Dice.h
// Copyright (c) 05/21/2022 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include    "BCCSkelton.h"
//リソースIDのヘッダー
#include    "ResDice.h"
//Dll.hヘッダー
#include    "Dll.h"

//(解説:DLLの場合このヘッダーを使ってください。)

//DiceCtrlのヘッダー
#include    "DiceCtrl.h"
//DiceCtrl.lib をリンクする
#pragma comment(lib, "DiceCtrl.lib")
IMPORT bool InitDiceCtrl(HINSTANCE);

//(解説:DiceCtrlを使えるようにします。旧いファイルには懐かしい「CDICECTRLのヘッダー」と書かれています。)

//winmm.lib をリンクする
#pragma comment(lib, "winmm.lib")

//(解説:チンチロリンの音源を使うので。)

//言語切替用フラグ、フォントとコンスタント文字列
bool g_JAPANESE = FALSE;
CFONT g_Font;
char* Str_00 = "Dice - Chinchirorin";
char* Str_01 = "How to use";
char* Str_02 = "Roll";
char* Str_03 = "Exit";
char* Str_04 = "Record is given here";
char* Str_05 = "Wanna exit?";
char* Str_06 = "Confirmation";
char* Str_07 = "About \"Chinchirorin\"";
char* Str_08 = "You've got %d of dice %d.";
char* Str_09 = "You have %d more time(s) to try.";
char* Str_10 = "Dice - チンチロリン";
char* Str_11 = "使い方";
char* Str_12 = "投賽";
char* Str_13 = "終了";
char* Str_14 = "戦績表示";
char* Str_15 = "終了しますか?";
char* Str_16 = "確認";
char* Str_17 = "チンチロリンについて";
char* Str_18 = "賽の目:%d (第%d番賽)";
char* Str_19 = "後%d回、賽を振ることができます。";

//(解説:バイリンガルメッセージにしたので。)


/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CDLG
{
public:    //以下はコールバック関数マクロと関連している
    //2重起動防止用のMutex用ID名称
    CMyWnd(char* UName) : CDLG(UName) {}

    //(解説:このコンストラクターを使っていますが、2重起動可能です。)

    //メンバー変数
    int m_Times = 3;

    //(解説:親は目が出る迄3回サイコロを振ることができるので。)

    //メニュー項目、ダイアログコントロール関連
    bool OnHowtouse();
    bool OnRoll();
    bool OnIdok();
    bool OnDice1(WPARAM);
    bool OnDice2(WPARAM);
    bool OnDice3(WPARAM);

    //(解説:上からゲーム説明ボタン、サイコロを振るボタン、終了ボタンと”3つの"DICE"コントロールからのメッセージ用です。)

    //ウィンドウメッセージ関連
    bool OnInit(WPARAM, LPARAM);
    bool OnClose(WPARAM, LPARAM);
};

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

BEGIN_MODALDLGMSG(ModalProc, Dice)    //コールバック関数名
    //メニュー項目、ダイアログコントロール関連
    ON_COMMAND(Dice, IDC_HOWTOUSE, OnHowtouse())
    ON_COMMAND(Dice, IDC_ROLL, OnRoll())
    ON_COMMAND(Dice, IDOK, OnIdok())
    ON_COMMAND(Dice, IDC_D1, OnDice1(wParam))
    ON_COMMAND(Dice, IDC_D2, OnDice2(wParam))
    ON_COMMAND(Dice, IDC_D3, OnDice3(wParam))

    //(解説:"DICE"コントロールはWin3.x風にWM_COMMANで親に通知し、wParamの上位16ビットにサイコロの目が入っています。)

    //ウィンドウメッセージ関連
    //自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
END_DLGMSG

///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;

//(解説:ユーザーへのメッセージの補完用です。)