今回はHelloWorldプロジェクトを使って、(プロジェクト名).hの解説を行います。
以下では実際にHelloWorld.hを見ながら、順に解説(以下「【解説-(解説文)】」)してゆきます。
//////////////////////////////////////////
// HelloWorld.h
// Copyright (c) 05/19/2021 by BCCSkelton
//////////////////////////////////////////
【解説-自動作成のタイトルです】
//BCCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include "BCCSkelton.h"
【解説-BCCSkeltonのマクロやクラスのすべてがこのヘッダーファイルから読み込まれます。開発環境では必ずpathを通してください。例:私のBCC Developperのプロジェクト設定におけるインクルードパスの画像です。】
//リソースIDのヘッダー
#include "ResHelloWorld.h"
【解説-これはリソースの定数定義ファイルです。同じプロジェクトフォールダーにある前提でSkeltonWizardが""としています。】
//メッセージの定義
const LPSTR g_lpMsg = "Hello World!!";
【解説-これはマニュアルで追加したものです。何度も"Hello World!!"と書くのが面倒だし、他のメッセージに変えられるのでconst外部変数にしています。勿論constを外した単なる文字列(char*)の外部変数や#defineにしても結構です。】
/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
【解説-いよいよ本題です。以下は↑のコメントの通り、メインのウィンドウ(ダイアログ)をクラス定義します。】
class CMyWnd : public CDLG
【解説-ウィンドウベースでもダイアログベースでもSkeltonWizardは定義するメインウィンドウをCMyWndとします。一方、他の補足的なダイアログの場合にはダイアログIDが"IDD_ETC"である場合、クラス名を"IDD_"以下の名称+大文字DLGで"ETCDLG"とし、作成するインスタンス名をクラス名の全小文字化によるetcdlgとしています。CMyWndではなく、IDD_HELLOWORLDだから、HELLOWORLDDLG、helloworlddlgにしたい、という場合には手作業で変更してください。】
{
public: //以下はコールバック関数マクロと関連している
//2重起動防止用のMutex用ID名称
CMyWnd(char* UName) : CDLG(UName) {}
【解説-これは前に触れましたが、BCCSkeltonが2重起動対応のためにミューテックスを作成しているのでSkeltonWizardが本ファイルのここと、cppファイルの冒頭にデフォルトで二重起動対応の記載があります。詳しくはミューテックスの記事、BCCSkeltonのCSDI、CMDI、CDLGのクラス定義をご参照ください。なお、ミューテックスを作成しているのですが、作成したミューテックスを破棄している記述が見当たらず、これら3クラスのデストラクターに破棄記述を追加しています。汗;本日「20年ぶり」訂正版をアップロードします。】
//メンバー変数の追加
RECT m_client;
【解説-これはメインダイアログのクライアントエリアを記録するために追加した変数です。一般にユーザーが使用する変数はその適用規模に応じて、「関数内のローカル変数(使い捨て)<クラス内のメンバー変数(私は"m_"接頭詞を付けます)<クラス全体およびpublicにすればクラス外からも参照可<名前空間内で自由にアクセスできる(その為バグの原因ともなる)グローバル変数(私は"g_"接頭詞を付けます)にしてください。
//メニュー項目、ダイアログコントロール関連
bool OnExit();
bool OnDisp();
bool OnTitle();
bool OnStatusbar();
bool OnVersion();
【解説-これはすべてメニュー割り込みに対応した関数の宣言です。】
//ウィンドウメッセージ関連
bool OnInit(WPARAM, LPARAM);
bool OnLButtonDown(WPARAM, LPARAM);
bool OnSize(WPARAM, LPARAM);
bool OnPaint(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
bool OnDestroy(WPARAM, LPARAM);
【解説-これはすべてウィンドウメッセージ割り込みに対応した関数の宣言です。なお、最初のOnInitはウィンドウベースの場合、OnCreateになります。】
};
////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ)の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd HelloWorld("HelloWorld"); //ウィンドウクラスインスタンスの生成
【解説-これは上記で定義したクラスのインスタンス(実体)を生成するための宣言です。一般の変数宣言と同じですね。また、カッコ内の"HelloWorld"がミューテックスを作成するために使われます。】
BEGIN_MODELESSDLGMSG(ModelessProc, HelloWorld) //コールバック関数名は主ウィンドウの場合ModelessProcにしている
//メニュー項目、ダイアログコントロール関連
ON_COMMAND(HelloWorld, IDM_EXIT, OnExit())
ON_COMMAND(HelloWorld, IDM_DISP, OnDisp())
ON_COMMAND(HelloWorld, IDM_TITLE, OnTitle())
ON_COMMAND(HelloWorld, IDM_STATUSBAR, OnStatusbar())
ON_COMMAND(HelloWorld, IDM_VERSION, OnVersion())
//ウィンドウメッセージ関連
//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
ON_LBUTTONDOWN(HelloWorld)
ON_SIZE(HelloWorld)
ON_PAINT(HelloWorld)
ON_DESTROY(HelloWorld)
END_DLGMSG
【解説-このBEGIN_MODELESSDLGMSG~END_DLGMSGがマクロによってコールバック関数に展開されます。モーダルダイアログの場合にはBEGIN_MODALDLGMSG~END_DLGMSG、ウィンドウベースの場合にはBEGIN_SDIMSG~END_WNDMSGやBEGIN_MDIMSG/BEGIN_MDICHILDMSG~END_MDIMSG/END_MDICHILDMSGとなります。なお、必ず使われる関数については予めマクロに入っていますが、その際には上のOnInit()、OnClose()のようにコメントで注意書きを入れています。】
///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;
【解説-SkeltonWizardでステータスバーを含めるとこのように自動的に記述されます。】
/////////////////////////
//コモンダイアログクラス
/////////////////////////
CMNDLG cmndlg;
【解説-SkeltonWizardでコモンダイアログクラスを含めるとこのように自動的に記述されます。】
///////////////////////
//仮想ウィンドウの作成
///////////////////////
CANVAS cvs;
【解説-SkeltonWizardで仮想ウィンドウを含めるとこのように自動的に記述されます。】
///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
bool OnIdok();
};
////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;
【解説-これが一般的なその他ダイアログのクラス記述(IDD_VERSION→VERSIONDLGクラス→versiondlgインスタンス)です。】
BEGIN_MODALDLGMSG(versiondlgProc, versiondlg) //第1引数がコールバック関数の名前
【解説-カッコ内のコールバック関数のポインターは「インスタンス名+Proc」となっています。】
ON_COMMAND(versiondlg, IDOK, OnIdok())
【解説-OKボタンの記述だけですが、IDOKはシステムで定義されており、ResHelloWorld.hファイルには#define定義されません。】
END_DLGMSG

















