さて、今回はBCCSkeltonの<Project名>.hファイル、IconViewer.hを見てゆきます。このファイルの位置づけ、とかはヘルプファイル「SkeltonWizard とBCCSkeltonライブラリー」の「BCCSkeltonによるプログラミングの一般的注意事項」に出ていますのでご覧ください。以下では本プログラム(IconViewer)にparticularな部分について触れます。ソース(IconViewer.h)を参照しながら読んでください。
SkeltonWIzardが作成したタイトルとインクルードファイルの下に、
//CICONクラスのヘッダー
#include "CICON.h"
とあるのは、このプログラムの為に作ったCICONクラスの宣言、定義ファイル(同じディレクトリーにある"CICON.h")を読み込む為にマニュアルで追加しました。このクラスとメンバー等については稿を改めて書きます。
次にメインダイアログのクラス定義ですが、SkeltonWizardが作ったコードではCMyWndとなるクラス名を、
class ICONVIEWER : public CDLG
とマニュアルで変更しています。これは後の(DLL化を含む)他プログラムでの転用の為です。
「//メニュー項目、ダイアログコントロール関連」は、ダイアログベースですがリストビュー等のコントロール関係はなく、すべてメニュー項目ですね。
「//ウィンドウメッセージ関連」では、マクロでビルトインされている
bool OnInit(WPARAM, LPARAM);
bool OnNotify(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
の他にSkeltonWizardで選択し、自動作成された「ON_DESTROY(IconViewer)」テーブルと「bool OnDestroy(WPARAM, LPARAM);」宣言があります。これに加え、
//ウィンドウメッセージ関連
ON_(IconViewer, WM_DROPFILES, OnDropFiles(wParam, lParam))
という見慣れないテーブルと、
//ウィンドウメッセージ関連
(省略)
bool OnDropFiles(WPARAM, LPARAM);
という宣言があります。これらは"IconViewerProc.h"のOnInit()における初期化(DragAcceptFiles()関数の実行)、OnDropFiles()関数定義と併せ、BCCSkeltonにおけるドラッグアンドドロップ処理の定番なので、すべてマニュアルで追加しています。将来再利用することがあると思われるので、覚えておくとよいでしょう。(なお、コードの意味を確認されたい方はWM_DROPFILESメッセージやDragQueryFile()、DragFinish()関数をググってみてください。)
その他、
//ユーザー定義関数
bool SetListView();
bool ShowIconData(int);
もマニュアルで追加したもので、リストビューの項目やデータ表示、エディットボックスへのデータ表示を行うものです。
マクロテーブルの後に続くのは外部変数です。以下説明します。
///////////////////
//ツールバーの作成
///////////////////
CTBAR TBar;
SkeltonWizardが書いた、メインダイアログのツールバーをコントロールするCTBARクラス変数です。予告になりますが、IconViewerProc.hのOnInit()関数定義で、SkeltonWizardが書いたコードで、ツールバーのウィンドウハンドルを与えて初期化し、長々とツールバーボタンの設定をします。
///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;
同じくSkeltonWizardが書いたメインダイアログのステータスバーをコントロールするCSBARクラス変数です。CTBARと同じくSkeltonWizardがOnInit()関数で初期化コードを書いています。
////////////////////////
//コモンダイアログの作成
////////////////////////
CMNDLG cmndlg;
これもSkeltonWizardが書いたコモンダイアログクラス変数でSkeltonWizardn第1ページの「コモンダイアログ」にチェックを入れるとSkeltonWizardが追加してくれます。「ファイルを開く」ダイアログ、色やフォントの選択ダイアログやフォールダー選択ダイアログを利用できます。
////////////////////////
//CARGインスタンスの作成
////////////////////////
CARG Arg;
ここからはマニュアルで追加した外部変数です。このCARGクラスはWinMain関数では簡単に利用できなくなったC言語の"main(int argc, char** argv)"の郷愁から作ったもので、インスタンスArgを利用してArg.c()で引数の数、Arg.v(n)でn番目の引数文字列のポインターを返したりしますが、その他Arg.Path()やArg.FileName()等色々と利用できる関数があります。
/////////////////
//ヘルプファイル
/////////////////
CSTR g_HelpFile;
BCCSkeltonの文字列クラスCSTRの外部変数で、上記のArgを利用してヘルプファイルのパス、ファイル名を記録しておくものです。
///////////////////////
//ポップアップメニュー
///////////////////////
HMENU g_hPopup;
これはリストビューの右クリックでポップアップメニューを出すためのメニューハンドルです。
///////////////////////
//ファイル起動用フラグ
///////////////////////
bool g_ByFile = FALSE;
これが噂(?)のファイル起動やドラッグアンドドロップで使うフラグです。FALSEで初期化しています。
/////////////////////
//読込ファイル用変数
/////////////////////
CSTR g_FileName;
int g_ImageType = IMAGE_ICON; //初期値はアイコン
アイコンファイル(*.ico)やカーソルファイル(*.cur)を読み込んだ時に記録する為の変数です。また、いずれのファイルかの区分も記録しておきます。(初期値はアイコンですね。)
///////////////////////
//CICONインスタンス変数
///////////////////////
CICON g_Icon;
これが今回作ったCICONクラスのインスタンスです。別途稿を変えて説明します。
////////////////////////////
//CICONホットスポット用変数
////////////////////////////
int g_Num; //書き込み処理
カーソルファイルの場合、ICONDIRENTRYのwPlanesとwBitCountにホットスポットが記録されますが、それを書き込む際に利用する変数です。
この後に、
class SAVEDLG //「名前をつけて保存」メニュー用のダイアログ
SAVEDLG savedlg; //そのインスタンス
class HOTSPOTDLG //ホットスポット入力用ダイアログ
HOTSPOTDLG hotspotdlg; //そのインスタンス
class VERSIONDLG //バージョンダイアログ
VERSIONDLG versiondlg; //そのインスタンス
とメンバー関数の宣言がつづきます。
ちょっと駆け足でしたが、基本的にHelloWorldプロジェクトでやったのと同じように、この<Project名>.hにはウィンドウやダイアログの宣言、メンバー変数や関数の宣言、外部変数としてクラスインスタンスやその他のクラスインスタンス変数や外部変数の宣言と初期化、コールバック変数のマクロテーブルが記述されます。(外部変数やユーザー定義関数等が大きくなる場合、メンテナンスを考えて"User.h"を作成する方が良い場合があります。詳しくはヘルプファイルの「BCCSkeltonによるプログラミングの一般的注意事項」を参照してください。)