2.リソースとプログラム
前回の(1)リソースの続きです。
(2)プログラム-FileList.h
いくつか手を加えたところがあるので(解説:)します。
//////////////////////////////////////////
// FileList.h
// Copyright (c) 02/08/2022 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include "BCCSkelton.h"
//リソースIDのヘッダー
#include "ResFileList.h"
/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CFILELIST : public CDLG
//(解説:まず、SkeltonWizardでつくられたコードはメインウィンドウをCMyWndクラスにするのですが、DLLにするので、一応これをCFILELISTに替えます。エディターの「一括置換」で"CMyWnd"→"CFILELIST"でFileList.hとFileListProc.hを舐めます。)
{
public: //以下はコールバック関数マクロと関連している
//2重起動防止用のMutex用ID名称
CFILELIST(char* UName) : CDLG(UName) {}
//ツールバー
CTBAR m_TBar;
//ステータスバー
CSBAR m_SBar;
//リストビュー
CLISTVIEW m_ListView;
//(解説:ツールバー、ステータスバー、リストビュー等コントロールはメンバー変数化しました。)
//メニュー項目、ダイアログコントロール関連
bool OnOpen();
bool OnSave();
bool OnExit();
bool OnAdd();
bool OnSearch();
bool OnEdit();
bool OnDelete();
bool OnSort();
bool OnVersion();
//ウィンドウメッセージ関連
bool OnInit(WPARAM, LPARAM);
bool OnNotify(WPARAM, LPARAM);
bool OnSize(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
bool OnDropFiles(WPARAM, LPARAM);
bool OnMinMax(WPARAM, LPARAM);
//(解説:手作業で追加したのはOnDropFileとOnMinMaxです。)
//ユーザー定義関数
bool ChangeMenuStatus(bool);
char* GetFileName(char*);
//(解説:処理によりメニューやツールバーボタンの状態を変える処理、および文字列からカンマやCRで区切られた文字列を切り出す関数です。)
};
////////////////////////////////////////////////////////////////////////
//派生させたCFILTERLISTクラスのインスタンスとコールバック関数(マクロ)の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CFILELIST FileList("FileList"); //ウィンドウクラスインスタンスの生成
BEGIN_MODALDLGMSG(ModalProc, FileList) //コールバック関数名は主ウィンドウの場合ModalProcにしている
//メニュー項目、ダイアログコントロール関連
ON_COMMAND(FileList, IDM_OPEN, OnOpen())
ON_COMMAND(FileList, IDM_SAVE, OnSave())
ON_COMMAND(FileList, IDM_EXIT, OnExit())
ON_COMMAND(FileList, IDM_ADD, OnAdd())
ON_COMMAND(FileList, IDM_SEARCH, OnSearch())
ON_COMMAND(FileList, IDM_EDIT, OnEdit())
ON_COMMAND(FileList, IDM_DELETE, OnDelete())
ON_COMMAND(FileList, IDM_SORT, OnSort())
ON_COMMAND(FileList, IDM_VERSION, OnVersion())
//ウィンドウメッセージ関連
//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
ON_SIZE(FileList)
ON_(FileList, WM_DROPFILES, OnDropFiles(wParam, lParam))
ON_(FileList, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
//(解説:手作業で追加したのはWM_DROPFILESとWM_GETMINMAXINFOです。)
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからEDITDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class EDITDLG : public CDLG {
public:
//コントロール関連
bool OnIdok();
bool OnIdcancel();
//(解説:IDCANCELはEscキー対応です。)
//ダイアログメッセージ関連
bool OnInit(WPARAM, LPARAM);
};
////////////////////////////////////////////////////////////////////////////
// EDITDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
EDITDLG editdlg;
BEGIN_MODALDLGMSG(editdlgProc, editdlg) //第1引数がコールバック関数の名前
ON_COMMAND(editdlg, IDOK, OnIdok())
ON_COMMAND(editdlg, IDCANCEL, OnIdcancel())
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからSEARCHDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class SEARCHDLG : public CDLG {
public:
char m_ToFind[MAX_PATH];
//(解説:ダイアログで入力する検索文字列の保存よです。)
//コントロール関連
bool OnIdok();
bool OnIdcancel();
//(解説:IDCANCELはEscキー対応です。)
//ダイアログメッセージ関連
bool OnInit(WPARAM, LPARAM);
};
////////////////////////////////////////////////////////////////////////////
// SEARCHDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
SEARCHDLG searchdlg;
BEGIN_MODALDLGMSG(searchdlgProc, searchdlg) //第1引数がコールバック関数の名前
ON_COMMAND(searchdlg, IDOK, OnIdok())
ON_COMMAND(searchdlg, IDCANCEL, OnIdcancel())
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからSORTDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class SORTDLG : public CDLG {
public:
//コントロール関連
bool OnIdok();
bool OnIdcancel();
//(解説:IDCANCELはEscキー対応です。)
//ダイアログメッセージ関連
bool OnInit(WPARAM, LPARAM);
};
////////////////////////////////////////////////////////////////////////////
// SORTDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
SORTDLG sortdlg;
BEGIN_MODALDLGMSG(sortdlgProc, sortdlg) //第1引数がコールバック関数の名前
ON_COMMAND(sortdlg, IDOK, OnIdok())
ON_COMMAND(sortdlg, IDCANCEL, OnIdcancel())
END_DLGMSG
///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
//コントロール関連
bool OnIdok();
};
////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;
BEGIN_MODALDLGMSG(versiondlgProc, versiondlg) //第1引数がコールバック関数の名前
ON_COMMAND(versiondlg, IDOK, OnIdok())
END_DLGMSG
(2)プログラム-User.h
FileListに特有の定数や外部変数、関数を定義するファイルです。
//////////////////////////////////////////
// User.h
// Copyright (c) 02/09/2022 by Ysama
//////////////////////////////////////////
////////////
//定数の定義
////////////
#define UP FALSE
#define DOWN TRUE
#define NO_OF_SUBITEM 3
//(解説:これらはソート用です。)
//////////////////
//コモンダイアログ
//////////////////
CMNDLG g_Cmndlg;
//(解説:「ファイルを開く」ダイアログの為に使用します。)
///////////////
//ファイルパス
///////////////
char* g_Path;
//(解説:「ファイルを開く」ダイアログの初期フォールダー設定用です。FileListに与えられる引数を使う予定です。)
////////////////////
//ファイルフィルター
////////////////////
char* g_LFlt; //リストファイルフィルターへのポインター
char* g_MFlt; //メディアファイルフィルターへのポインター
//(解説:「ファイルを開く」ダイアログの為のフィルターです。前者は*.plfファイル、後者はAVメディアファイルを予定しています。)
///////////////////////////////
//ファイルリストファイル(plf)
///////////////////////////////
CSTR g_File;
//(解説:*.plfファイルを読み込むCSTRファイルです。)
//////////////////////
//データ処理用CSTR変数
//////////////////////
CSTR g_Data;
//(解説:作業用変数です。)
////////////////////////////////
//ポップアップメニュ-のハンドル
////////////////////////////////
HMENU g_hPopup;
//(解説:右マウスボタンクリックで表示するポップアップメニューのハンドル用です。)
/////////////
//D&D用フラグ
/////////////
bool g_ByFile = FALSE;
//(解説:ドラッグアンドドロップでAVメディアファイルを追加することができるようにします。)
//////////////////////////
//サブアイテムのソート関連
//////////////////////////
//列とソート方法の配列
bool sortsubno[NO_OF_SUBITEM] = {FALSE};
//ソートコールバック関数
int CALLBACK CompProc(LPARAM lp1, LPARAM lp2, LPARAM lpSort) {
static int nItem1, nItem2;
static char buf1[MAX_PATH], buf2[MAX_PATH];
//アイテムの検索
nItem1 = FileList.m_ListView.FindItem(-1, NULL, lp1);
nItem2 = FileList.m_ListView.FindItem(-1, NULL, lp2);
//アイテム情報の取得
FileList.m_ListView.GetItemText(nItem1, (int)lpSort, buf1, MAX_PATH);
FileList.m_ListView.GetItemText(nItem2, (int)lpSort, buf2, MAX_PATH);
if(sortsubno[(bool)lpSort])
return(strcmp(buf1, buf2));
else
return(strcmp(buf1, buf2) * -1);
}
//(解説:これはListViewコントロールのソート用コールバック関数(文字列用)の定番です。)
////////////////////////////
//カンマ区切り文字切り出し
//★str 文字列は切り出した文
//字列だけ短縮されるので注意
////////////////////////////
char* GetDelimtStr(char* str) {
static char buff[MAX_PATH * 4]; //取り敢えず1K bytes確保
char *cp = str;
int len = 0;
switch(*cp) {
case 0:
return 0; //NULL終端を指していれば単に帰る(FALSE)
case '\"': //「""」処理
cp++; //'\"'の次に進める
while(*cp != '\"') {
buff[len] = *cp; //buffへのコピー
cp++;
len++;
}
cp++; //cpは'\"'の次の','へ進める
buff[len] = '\0'; //buffのNULL終端処理
break;
default: //「""」以外
//','でも'\n'でもNullでもなければ
while(*cp != ',' && *cp != '\n' && *cp) {
buff[len] = *cp; //strデータをbuffにコピーしてゆく
cp++;
len++;
}
buff[len] = '\0'; //buffのNULL終端処理
break;
}
if(*cp){ //cpがNULL終端を指していなければ
cp++; //','や'\n'を指しているので一つ進め
}
lstrcpy(str, cp); //残余の文字列を文字列先頭に移動
return buff; //切り取った文字列を返す(TRUE)
}
//(解説:これは','または'(CR)'で区切られた文字列を切り出す関数です。""で囲まれた文字列は','や'(CR)'があってもそのまま切り出されます。CSTRにもNext()という同様のメンバー関数がありますが、復讐のために敢えてコーディングしてみました。)
次回はFileListProc.hをやりましょう。