ちゃんと"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;
//(解説:ユーザーへのメッセージの補完用です。)