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をやりましょう。