006-02  前へ←  ホームへ  →次へ  006-04

No.006 - 03  簡易アーカイバ(複数ファイルの合成)のGUIサンプル


前回のhier_fier_02.hを使ったGUIサンプルです。


・GUIサンプル
前回のNo.006-02のhier_fier_02ファイルを使ったGUIサンプルです。

下の画像で、
”├ 数値アイテム、 ├ 汎用アイテム、 ├ 子アイテムボックス”となってるとこが現在のデータ構造です。
青く表示されているデータはフォーカスアイテムボックスまたはそのなかの選択されているアイテムです。

キーボードの↑↓キー選択アイテムを変更します。

各ボタンの扱いはこの表を見てください。
セーブボタンを押す 現在のデータを保存する。
ロードボタンを押す データ読込む。
クリアボタンを押す データを初期化します。
アイテムボックス追加ボタンを押す ダイアログを呼び出し、「アイテム名」の名前の子アイテムボックスを作成します。
数値アイテム追加ボタンを押す ダイアログを呼び出し、「アイテム名」の名前、「アイテムの値」の値を
数値変換した数値アイテムを作成します。
汎用アイテム追加ボタンを押す ダイアログを呼び出し、「アイテム名」の名前、「アイテムの値」の値の
文字列とした汎用アイテムを作成します。
ファイルアイテム追加ボタンを押す ダイアログを呼び出したあと、
「ファイル名」のパスにあるファイルを「アイテム名」で、
「読込開始位置」から「データ長」分だけを保存する、という情報をアイテムとして追加します。

チェックボックス
「ファイルのパスも保存」はファイルのパスをアーカイブファイル内に保存します。
この情報が入ってると再編集時に便利ですが、個人のディレクトリ構造が保存されるので
注意が必要です。
「再読込のときにメモリ展開」は作成したアーカイブファイルから
各ファイルをメモリ上に読込むかどうかです。
あまり大きなファイルなら適宜、部分読込が必要になるからです。

文字列としたファイルアイテムを作成します。
アイテムをファイル出力ボタンを押す セーブファイルダイアログを呼び出し、選択されているアイテムを
アーカイブファイルから読み出しファイルに保存します。
選択されているアイテムがアイテムボックスの時は何もしません。
アイテム削除ボタンを押す 選択されているアイテムを削除します。



メインウィンドウ


ダイアログ
数値アイテム追加 汎用アイテム追加 アイテムボックス追加

  
ファイルアイテム追加
ファイルデータ読込長が-1なら
データサイズ=ファイルサイズ


//リソーススクリプト
hier_filer_03.rc


#define IDC_FILE_REF    0x101
#define IDC_FILE_LOAD   0x102
#define IDC_FILE_SAVE   0x103
#define IDC_FILE_CLEAR  0x104
#define IDC_ADD_BOX     0x111
#define IDC_ADD_NUM     0x112
#define IDC_ADD_ANY     0x113
#define IDC_ADD_FILE    0x114
#define IDC_FILE_OUT    0x115
#define IDC_DEL         0x116
#define IDC_ITEMNAME_EDIT   0x131
#define IDC_ITEMVALUE_EDIT  0x132
#define IDC_FILENAME_EDIT   0x134
#define IDC_OFFSET_EDIT     0x135
#define IDC_LEN_EDIT        0x136
#define IDC_ALL_CONTAIN     0x137
#define IDC_SAVE_PATH       0x140
#define IDC_FILE_LOAD_MEM   0x141

#define IDC_OK          0x200
#define IDC_CANCEL      0x201


IDD_ADD_BOX DIALOG  20, 20, 110 , 50
FONT 11 , "MS Shell Dlg"
STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU
CAPTION "アイテムボックスの追加" {
    LTEXT "アイテム名",     0,  5, 5,  30, 22
    CONTROL "", IDC_ITEMNAME_EDIT,  "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 5,  60, 12, 0
    DEFPUSHBUTTON   "OK",       IDC_OK,     5,  30, 45, 12
    PUSHBUTTON      "キャンセル",    IDC_CANCEL, 55, 30, 45, 12
}

IDD_ADD_NUM DIALOG  20, 20, 110 , 60
FONT 11 , "MS Shell Dlg"
STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU
CAPTION "数値アイテムの追加" {
    LTEXT "アイテム名",     0,  5, 5,  30, 22
    LTEXT "値" ,            0,  5, 20, 30, 22
    CONTROL "", IDC_ITEMNAME_EDIT,  "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 5,  60, 12, 0
    CONTROL "", IDC_ITEMVALUE_EDIT, "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 20, 60, 12, 0
    DEFPUSHBUTTON   "OK",       IDC_OK,     5,  40, 45, 12
    PUSHBUTTON      "キャンセル",    IDC_CANCEL, 55, 40, 45, 12
}

IDD_ADD_ANY DIALOG  20, 20, 110 , 60
FONT 11 , "MS Shell Dlg"
STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU
CAPTION "汎用アイテムの追加" {
    LTEXT "アイテム名",     0,  5, 5,  30, 22
    LTEXT "値" ,            0,  5, 20, 30, 22
    CONTROL "", IDC_ITEMNAME_EDIT,  "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 5,  60, 12, 0
    CONTROL "", IDC_ITEMVALUE_EDIT, "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 20, 60, 12, 0
    DEFPUSHBUTTON   "OK",       IDC_OK,     5,  40, 45, 12
    PUSHBUTTON      "キャンセル",    IDC_CANCEL, 55, 40, 45, 12
}

IDD_ADD_FILE DIALOG  20, 20, 230 , 110
FONT 11 , "MS Shell Dlg"
STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU
CAPTION "ファイルアイテムの追加" {
    LTEXT "アイテム名",     0,  5, 5,  30, 22
    LTEXT "ファイル名" ,    0,  5, 20, 30, 22
    CONTROL "", IDC_ITEMNAME_EDIT, "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 5,  60, 12, 0
    CONTROL "", IDC_FILENAME_EDIT, "edit", ES_AUTOHSCROLL | WS_BORDER, 40, 20, 160, 12, 0
    PUSHBUTTON      "参照", IDC_FILE_REF,   205, 20, 22, 12
    LTEXT "・読込スタート位置" ,    0,  20, 35, 220, 12
    LTEXT "・データサイズ" ,        0,  20, 50, 220, 12
    CONTROL "0",  IDC_OFFSET_EDIT, "edit", ES_AUTOHSCROLL | WS_BORDER, 80, 35, 40, 12, 0
    CONTROL "-1", IDC_LEN_EDIT,    "edit", ES_AUTOHSCROLL | WS_BORDER, 60, 50, 40, 12, 0
    CONTROL "ファイルの終端まで",       IDC_ALL_CONTAIN,    "Button",BS_AUTOCHECKBOX, 105, 50, 100, 12, 0
    CONTROL "ファイルのパスも保存する", IDC_SAVE_PATH,      "Button",BS_AUTOCHECKBOX, 20,  70, 80, 12, 0
    CONTROL "ロード時実データをメモリに読込む", IDC_FILE_LOAD_MEM,  "Button",BS_AUTOCHECKBOX, 110, 70, 120, 12, 0

    DEFPUSHBUTTON   "OK",       IDC_OK,     5,  90, 45, 12
    PUSHBUTTON      "キャンセル",    IDC_CANCEL, 55, 90, 45, 12
}



hier_filer_03.cpp

#include "hier_filer_02.h"

#define IDC_FILE_REF    0x101
#define IDC_FILE_LOAD   0x102
#define IDC_FILE_SAVE   0x103
#define IDC_FILE_CLEAR  0x104
#define IDC_ADD_BOX     0x111
#define IDC_ADD_NUM     0x112
#define IDC_ADD_ANY     0x113
#define IDC_ADD_FILE    0x114
#define IDC_FILE_OUT    0x115
#define IDC_DEL         0x116
#define IDC_ITEMNAME_EDIT   0x131
#define IDC_ITEMVALUE_EDIT  0x132
#define IDC_FILENAME_EDIT   0x134
#define IDC_OFFSET_EDIT     0x135
#define IDC_LEN_EDIT        0x136
#define IDC_ALL_CONTAIN     0x137
#define IDC_SAVE_PATH       0x140
#define IDC_FILE_LOAD_MEM   0x141

#define IDC_OK          0x200
#define IDC_CANCEL      0x201

// 簡易子ウィンドウ作成
HWND create_win(HWND parent, char *winc, char *caption, int style, int x, int y, int cx, int cy, int id){
    return CreateWindow(
        winc, caption, WS_CHILD | WS_VISIBLE | style,
        x, y, cx, cy, parent, (HMENU)id, GetModuleHandle(NULL), NULL
    );
}
// テキスト作成
HWND make_stext(HWND parent, char *caption, int x, int y, int cx, int cy){
    return create_win(parent, TEXT("static"), caption, 0, x, y, cx, cy, 0);
};
// ボタン作成
HWND make_button(HWND parent, char *caption, int x, int y, int cx, int cy, int id){
    return create_win(parent, TEXT("BUTTON"), caption, BS_PUSHBUTTON, x, y, cx, cy, id);
};
// エディットボックス作成
HWND make_edit(HWND parent, char *caption, int x, int y, int cx, int cy, int id){
    return create_win(parent, TEXT("EDIT"), caption, WS_BORDER | ES_LEFT | ES_AUTOHSCROLL, x, y, cx, cy, id);
};
// グループボックス作成
HWND make_groupbox(HWND parent, char *caption, int x, int y, int cx, int cy){
    return create_win(parent, TEXT("BUTTON"), caption, BS_GROUPBOX, x, y, cx, cy, 0);
};
// チェックボックス作成
HWND make_checkbox(HWND parent, char *caption, int x, int y, int cx, int cy, int id){
    return create_win(parent, TEXT("BUTTON"), caption, BS_AUTOCHECKBOX, x, y, cx, cy, id);
};
// ファイルオープン・ダイアログ
int call_open_dialog(HWND hwnd, char *s, int len){
    static OPENFILENAME ofn;
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = TEXT("All files {*.*}\0*.*\0\0");
    ofn.lpstrCustomFilter = NULL;
    ofn.nMaxCustFilter = 0;
    ofn.nFilterIndex = 0;
    ofn.lpstrFile = s;
    ofn.nMaxFile = len;
    ofn.Flags = OFN_FILEMUSTEXIST;
    return GetOpenFileName(&ofn);
}
// ファイルセーブ・ダイアログ
int call_save_dialog(HWND hwnd, char *s, int len){
    static OPENFILENAME ofn;
    ofn.lStructSize = sizeof (OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = TEXT("All files {*.*}\0*.*\0\0");
    ofn.lpstrCustomFilter = NULL;
    ofn.nMaxCustFilter = 0;
    ofn.nFilterIndex = 0;
    ofn.lpstrFile = s;
    ofn.nMaxFile = len;
    ofn.Flags = 0;
    return GetSaveFileName(&ofn);
}
// テキスト描画
SIZE text_out(HDC hdc, int x, int y, char *s, int len=-1){
    SIZE size;
    memset(&size, 0, sizeof(SIZE));
    if (s) {
        if (len<0) len = lstrlen(s);
        TextOut(hdc, x, y, s, len);
        GetTextExtentPoint32(hdc, s, len, &size);
    }
    return size;
}

// ====== EAZY_FONT ===============
class EAZY_FONT {
    public :
    HFONT m_hfont;
    set_size(int val);
    //フォントサイズ変更
    EAZY_FONT() { m_hfont=NULL; }
    ~EAZY_FONT(){ DeleteObject(m_hfont);    }
};
EAZY_FONT::set_size(int val){
    LOGFONT lf;
    if (!GetObject(m_hfont, sizeof(LOGFONT), &lf)){
        memset(&lf, 0, sizeof(LOGFONT));
        lf.lfCharSet = SHIFTJIS_CHARSET;
    }
    lf.lfHeight=val;
    DeleteObject(m_hfont);
    m_hfont=CreateFontIndirect(&lf);
    return 0;
}

// ====== APP ===============
class APP {
    public:
    EAZY_FONT m_eazy_font;
    HIER_FILER m_hier_filer;
    char m_tmp_str[MAX_PATH], m_tmp_str2[MAX_PATH];
    int m_focus_data_type;
    int m_focus_data_num;
    int m_dlg_type;

    // アイテムボックス描画(再帰関数)
    int draw_item_box(HDC hdc, int sx, int *py, HIER_FILER_ITEM::ITEM_BOX *p_box);
    enum { ID_BOX_TYPE, ID_NUM_TYPE, ID_ANY_TYPE, ID_FILE_TYPE };
    enum { ID_ADD_BOX_DLG, ID_ADD_NUM_DLG, ID_ADD_ANY_DLG, ID_ADD_FILE_DLG };

    static LRESULT CALLBACK StaticWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    APP(){
        m_eazy_font.set_size(14);
        m_tmp_str[0]=NULL;
        m_tmp_str2[0]=NULL;
        m_focus_data_type = ID_BOX_TYPE;
        m_focus_data_num = 0;
    }
    void focus_before();
    void focus_next();
    AddBoxProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    AddNumProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    AddAnyProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    AddFileProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    static BOOL CALLBACK StaticDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
    is_focus(HIER_FILER_ITEM::ITEM_BOX *p_box, int type, int num);
};
// フォーカス・アイテムボックスを次へ移動
void APP::focus_next(){
    int data_type = m_focus_data_type, data_num = m_focus_data_num;
    HIER_FILER_ITEM::ITEM_BOX *tmp_p_box = m_hier_filer.m_focus;
    switch(data_type){
    case ID_BOX_TYPE  :
        data_type=ID_NUM_TYPE;
        data_num=-1;
    case ID_NUM_TYPE  :
        data_num++;
        if (data_num<tmp_p_box->m_num_list.size()) break;
        data_type=ID_ANY_TYPE;
        data_num=-1;
    case ID_ANY_TYPE  :
        data_num++;
        if (data_num<tmp_p_box->m_any_list.size()) break;
        data_type=ID_FILE_TYPE;
        data_num=-1;
    case ID_FILE_TYPE :
        data_num++;
        if (data_num<tmp_p_box->m_file_list.size()) break;
        data_type=ID_BOX_TYPE;

    // アイテムボックス間移動
        // 子アイテムボックス移動
        if (tmp_p_box->m_box_list.size()) {
            tmp_p_box = tmp_p_box->m_box_list[0];
            break;
        }
        // 同位アイテムボックス移動
        while(1){
            if (!tmp_p_box->m_parent) return;
            data_num = m_hier_filer.get_child_num(tmp_p_box)+1;
            if (data_num<tmp_p_box->m_box_list.size()) {
                tmp_p_box = tmp_p_box->m_parent->m_box_list[data_num];
                break;
            }
            tmp_p_box = tmp_p_box->m_parent;
        }
        break;
    }

    m_hier_filer.m_focus = tmp_p_box;
    m_focus_data_type = data_type;
    m_focus_data_num = data_num;
}
// フォーカス・アイテムボックスを前へ移動
void APP::focus_before(){
    int data_type = m_focus_data_type, data_num = m_focus_data_num;
    HIER_FILER_ITEM::ITEM_BOX *tmp_p_box = m_hier_filer.m_focus;
    switch(data_type){
    case ID_BOX_TYPE  :
        if (!tmp_p_box->m_parent) return;
        data_num = m_hier_filer.get_child_num(tmp_p_box)-1;
        if (data_num>=0) break;
        tmp_p_box = tmp_p_box->m_parent;
        data_type=ID_FILE_TYPE;
        data_num = tmp_p_box->m_file_list.size();
    case ID_FILE_TYPE :
        data_num--;
        if (data_num>=0 && data_num<tmp_p_box->m_file_list.size()) break;
        data_type = ID_ANY_TYPE;
        data_num = tmp_p_box->m_any_list.size();
    case ID_ANY_TYPE  :
        data_num--;
        if (data_num>=0 && data_num<tmp_p_box->m_any_list.size()) break;
        data_type = ID_NUM_TYPE;
        data_num = tmp_p_box->m_num_list.size();
    case ID_NUM_TYPE  :
        data_num--;
        if (data_num>=0 && data_num<tmp_p_box->m_num_list.size()) break;
        data_type = ID_BOX_TYPE;
        break;
    }

    m_hier_filer.m_focus = tmp_p_box;
    m_focus_data_type = data_type;
    m_focus_data_num = data_num;
}
// アイテム追加プロシージャstatic
BOOL CALLBACK APP::StaticDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    APP *pwin = (APP*)GetWindowLong(hwnd, GWL_USERDATA);
    if (!pwin && (msg==WM_INITDIALOG)){
        pwin = (APP*)lp;
        SetWindowLong(hwnd, GWL_USERDATA, (LONG)pwin);
    }
    if (msg==WM_CLOSE) {
        EndDialog(hwnd, IDC_CANCEL);
        return TRUE;
    }
    if (pwin) {
        switch(pwin->m_dlg_type){
        case ID_ADD_BOX_DLG: return pwin->AddBoxProc(hwnd, msg, wp, lp);
        case ID_ADD_NUM_DLG: return pwin->AddNumProc(hwnd, msg, wp, lp);
        case ID_ADD_ANY_DLG: return pwin->AddAnyProc(hwnd, msg, wp, lp);
        case ID_ADD_FILE_DLG: return pwin->AddFileProc(hwnd, msg, wp, lp);
        }
    }
    return FALSE;
}

// アイテムボックス追加プロシージャ
APP::AddBoxProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch(msg) {
    case WM_COMMAND :
        switch(LOWORD(wp)){
        case IDC_OK:
            GetDlgItemText(hwnd, IDC_ITEMNAME_EDIT, m_tmp_str, MAX_PATH);
            m_hier_filer.add_item_box(m_tmp_str);
        case IDC_CANCEL:
            EndDialog(hwnd, 0);
            break;
        }
        break;
    }
    return FALSE;
}
// 数値アイテム追加プロシージャ
APP::AddNumProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    int n;
    switch(msg) {
    case WM_COMMAND :
        switch(LOWORD(wp)){
        case IDC_OK:
            GetDlgItemText(hwnd, IDC_ITEMNAME_EDIT, m_tmp_str, MAX_PATH);
            n = GetDlgItemInt(hwnd, IDC_ITEMVALUE_EDIT, NULL, TRUE);
            m_hier_filer.add_item_num(m_tmp_str, n);
        case IDC_CANCEL:
            EndDialog(hwnd, 0);
            break;
        }
        break;
    }
    return FALSE;
}
// 汎用アイテム追加プロシージャ
APP::AddAnyProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch(msg) {
    case WM_COMMAND :
        switch(LOWORD(wp)){
        case IDC_OK:
            GetDlgItemText(hwnd, IDC_ITEMNAME_EDIT,  m_tmp_str,  MAX_PATH);
            GetDlgItemText(hwnd, IDC_ITEMVALUE_EDIT, m_tmp_str2, MAX_PATH);
            m_hier_filer.add_item_any(m_tmp_str, m_tmp_str2, strlen(m_tmp_str2));
        case IDC_CANCEL:
            EndDialog(hwnd, 0);
            break;
        }
        break;
    }
    return FALSE;
}

// ファイルアイテム追加プロシージャ
APP::AddFileProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    int offset, len, save_path_flag, load_mem_flag, all_contain_flag;
    switch(msg) {
    case WM_COMMAND :
        switch(LOWORD(wp)){
        case IDC_ALL_CONTAIN:
            all_contain_flag = (BST_CHECKED==SendMessage(GetDlgItem(hwnd, IDC_ALL_CONTAIN), BM_GETCHECK, 0, 0))? 1 : 0;
            EnableWindow(GetDlgItem(hwnd, IDC_LEN_EDIT), !all_contain_flag);
            break;
        case IDC_FILE_REF : // ファイル参照
            if (!call_open_dialog(hwnd, m_tmp_str, MAX_PATH)) break;
            SetDlgItemText(hwnd, IDC_FILENAME_EDIT, m_tmp_str);
            break;
        case IDC_OK:
            save_path_flag = (BST_CHECKED==SendMessage(GetDlgItem(hwnd, IDC_SAVE_PATH), BM_GETCHECK, 0, 0))? 1 : 0;
            load_mem_flag  = (BST_CHECKED==SendMessage(GetDlgItem(hwnd, IDC_FILE_LOAD_MEM), BM_GETCHECK, 0, 0))? 1 : 0;
            all_contain_flag = (BST_CHECKED==SendMessage(GetDlgItem(hwnd, IDC_ALL_CONTAIN), BM_GETCHECK, 0, 0))? 1 : 0;
            GetDlgItemText(hwnd, IDC_ITEMNAME_EDIT, m_tmp_str, MAX_PATH);
            GetDlgItemText(hwnd, IDC_FILENAME_EDIT, m_tmp_str2, MAX_PATH);

            offset = GetDlgItemInt(hwnd, IDC_OFFSET_EDIT, NULL, TRUE);
            len    = (all_contain_flag)? -1 : GetDlgItemInt(hwnd, IDC_LEN_EDIT, NULL, TRUE);
            m_hier_filer.add_item_file(m_tmp_str, m_tmp_str2, offset, len, save_path_flag, load_mem_flag);
        case IDC_CANCEL:
            EndDialog(hwnd, 0);
            break;
        }
        break;
    }
    return FALSE;
}
APP::is_focus(HIER_FILER_ITEM::ITEM_BOX *p_box, int type, int num){
    if (m_hier_filer.m_focus!=p_box) return 0;
    if (m_focus_data_type!=type) return 0;
    if (ID_BOX_TYPE==type) return 1;    // ID_BOX_TYPE ならm_focus_data_numは無関係
    if (m_focus_data_num!=num) return 0;
    return 1;
}

// アイテムボックス描画(再帰関数)
int APP::draw_item_box(HDC hdc, int sx, int *py, HIER_FILER_ITEM::ITEM_BOX *p_box){
    char *s, sa[40];
    int i, tmp_x;
    SIZE size;
    SetBkMode(hdc, TRANSPARENT);
    if (is_focus(p_box, ID_BOX_TYPE, 0)) { SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); }
    SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
    s="■"; size = text_out(hdc, sx, *py, s);
    text_out(hdc, sx+size.cx, *py, "   ");
    text_out(hdc, sx+size.cx+2, *py, p_box->m_name.m_buf);
    *py += 18;
    if (is_focus(p_box, ID_BOX_TYPE, 0)) { SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(0,0,0)); }

    sprintf(sa, "┣ 数値アイテム  %d 個", p_box->m_num_list.size());
    TextOut(hdc, sx, *py, sa, lstrlen(sa));
    *py += 18;
    for(i=0;i<p_box->m_num_list.size();i++){
        s=p_box->m_num_list[i]->m_name.m_buf;
        if (s) {
            if (is_focus(p_box, ID_NUM_TYPE, i)) { SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); }
            size = text_out(hdc, sx+20, *py, s);
            sprintf(sa, " = %d", *(p_box->m_num_list[i]->m_data));
            TextOut(hdc, sx+size.cx+20, *py, sa, lstrlen(sa));
            if (is_focus(p_box, ID_NUM_TYPE, i)) { SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(0,0,0)); }
        }
        *py += 18;
    }
    sprintf(sa, "┣ 汎用アイテム  %d 個", p_box->m_any_list.size());
    TextOut(hdc, sx, *py, sa, lstrlen(sa));
    *py += 20;
    for(i=0;i<p_box->m_any_list.size();i++){
        s=p_box->m_any_list[i]->m_name.m_buf;
        if (s) {
            if (is_focus(p_box, ID_ANY_TYPE, i)) { SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); }
            size = text_out(hdc, sx+20, *py, s);        tmp_x=sx+size.cx+20;
            size = text_out(hdc, tmp_x, *py, " = ");    tmp_x+=size.cx;
            text_out(hdc, tmp_x, *py, p_box->m_any_list[i]->m_data, p_box->m_any_list[i]->m_data_len);
            if (is_focus(p_box, ID_ANY_TYPE, i)) { SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(0,0,0)); }
        }
        *py += 18;
    }
    sprintf(sa, "┣ ファイルアイテム  %d 個", p_box->m_file_list.size());
    TextOut(hdc, sx, *py, sa, lstrlen(sa));
    *py += 18;
    for(i=0;i<p_box->m_file_list.size();i++){
        s=p_box->m_file_list[i]->m_name.m_buf;
        if (s) {
            if (is_focus(p_box, ID_FILE_TYPE, i)) { SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); }
            size = text_out(hdc, sx+20, *py, s);        tmp_x=sx+size.cx+20;
            size = text_out(hdc, tmp_x, *py, " = ");    tmp_x+=size.cx;
            if (p_box->m_file_list[i]->m_filename.m_buf)
                    text_out(hdc, tmp_x, *py, p_box->m_file_list[i]->m_filename.m_buf);
            if (is_focus(p_box, ID_FILE_TYPE, i)) { SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(0,0,0)); }
        }
        *py += 18;
    }
    sprintf(sa, "┗ 子アイテムボックス  %d 個", p_box->m_box_list.size());
    TextOut(hdc, sx, *py, sa, lstrlen(sa));
    *py += 20;
    for(i=0;i<p_box->m_box_list.size();i++){
        s="┗"; size = text_out(hdc, sx+20, *py, s);
        draw_item_box(hdc, sx+size.cx+20, py, p_box->m_box_list[i]);
        *py += 18;
    }
}
// メイン・プロシージャ
LRESULT CALLBACK APP::StaticWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    APP *pwin = (APP*)GetWindowLong(hwnd, GWL_USERDATA);
    if (!pwin && (msg==WM_CREATE || msg==WM_NCCREATE)){
        pwin = (APP*)((LPCREATESTRUCT)lp)->lpCreateParams;
        SetWindowLong(hwnd, GWL_USERDATA, (LONG)pwin);
    }
    if (pwin) return pwin->WndProc(hwnd, msg, wp, lp);
    return DefWindowProc(hwnd, msg, wp, lp);
}
// メイン・プロシージャ
APP::WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    HDC hdc;
    PAINTSTRUCT ps;
    int x, y;
    HWND tmp_hwnd;
    FILE *fp;
    char ss[40];
    switch(msg) {
    case WM_CREATE :
        x = 300; y = 15;
        tmp_hwnd = make_groupbox(hwnd, "アイテムの追加", x, y, 180, 160);                   x += 15; y += 30;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
        tmp_hwnd = make_button(hwnd, "数値アイテム追加", x, y, 150, 25, IDC_ADD_NUM);       y += 30;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
        tmp_hwnd = make_button(hwnd, "汎用アイテム追加", x, y, 150, 25, IDC_ADD_ANY);       y += 30;
        tmp_hwnd = make_button(hwnd, "ファイルアイテム追加", x, y, 150, 25, IDC_ADD_FILE); y += 30;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
        tmp_hwnd = make_button(hwnd, "アイテムボックス追加", x, y, 150, 25, IDC_ADD_BOX);   x -= 10;y += 50;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
                        
        tmp_hwnd = make_button(hwnd, "アイテムをファイル出力", x, y, 180, 25, IDC_FILE_OUT);    x += 10;y += 50;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);

        tmp_hwnd = make_button(hwnd, "アイテム削除", x, y, 160, 30, IDC_DEL);
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);

        x = 410; y = 300;
        tmp_hwnd = make_button(hwnd, "クリア", x, y, 70, 30, IDC_FILE_CLEAR);   y += 50; x -= 10;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
        x = 290; y = 350;
        tmp_hwnd = make_button(hwnd, "セーブ", x, y, 90, 35, IDC_FILE_SAVE);    x += 100;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);
        tmp_hwnd = make_button(hwnd, "ロード", x, y, 90, 35, IDC_FILE_LOAD);    x += 60; y += 50;
        SendMessage(tmp_hwnd, WM_SETFONT, (WPARAM)m_eazy_font.m_hfont, TRUE);

        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        switch(LOWORD(wp)){
        case IDC_FILE_SAVE :    // ファイル書き込み
            memset(m_tmp_str, 0, MAX_PATH);
            if (!call_save_dialog(hwnd, m_tmp_str, MAX_PATH)) break;
            m_hier_filer.save(m_tmp_str);
            SetFocus(hwnd);
            break;
        case IDC_FILE_LOAD :    // ファイル読み込み
            memset(m_tmp_str, 0, MAX_PATH);
            if (!call_open_dialog(hwnd, m_tmp_str, MAX_PATH)) break;
            m_hier_filer.load_full_inner(m_tmp_str);
            m_focus_data_type=ID_BOX_TYPE;
            m_focus_data_num=0;
            SetFocus(hwnd);
            break;
        case IDC_FILE_CLEAR :
            m_hier_filer.clear();
            m_focus_data_type=ID_BOX_TYPE;
            m_focus_data_num=0;
            break;  // アイテム全消去
        case IDC_ADD_BOX :  // アイテムボックス追加
            m_dlg_type=ID_ADD_BOX_DLG;
            DialogBoxParam(GetModuleHandle(NULL), TEXT("IDD_ADD_BOX"), hwnd, StaticDlgProc, (LPARAM)this);
            break;
        case IDC_ADD_NUM :  // 数値アイテム追加
            m_dlg_type=ID_ADD_NUM_DLG;
            DialogBoxParam(GetModuleHandle(NULL), TEXT("IDD_ADD_NUM"), hwnd, StaticDlgProc, (LPARAM)this);
            break;
        case IDC_ADD_ANY :  // 汎用アイテム追加
            m_dlg_type=ID_ADD_ANY_DLG;
            DialogBoxParam(GetModuleHandle(NULL), TEXT("IDD_ADD_ANY"), hwnd, StaticDlgProc, (LPARAM)this);
            break;
        case IDC_ADD_FILE : // ファイルアイテム追加
            m_dlg_type=ID_ADD_FILE_DLG;
            DialogBoxParam(GetModuleHandle(NULL), TEXT("IDD_ADD_FILE"), hwnd, StaticDlgProc, (LPARAM)this);
            break;
        case IDC_DEL :  // アイテムボックス削除
            if (m_focus_data_type==ID_BOX_TYPE){
                if (!m_hier_filer.m_focus->m_parent) {
                    MessageBox(hwnd, "最上位アイテムボックスは削除できません", "エラー", MB_OK);
                    break;
                }
                m_focus_data_num = m_hier_filer.get_focus_num();
                m_hier_filer.focus_up();
                m_hier_filer.del_item_box(m_focus_data_num);
                focus_before();
            }
            else {
                switch(m_focus_data_type){
                case ID_NUM_TYPE: m_hier_filer.del_item_num(m_focus_data_num); break;
                case ID_ANY_TYPE: m_hier_filer.del_item_any(m_focus_data_num); break;
                case ID_FILE_TYPE: m_hier_filer.del_item_file(m_focus_data_num); break;
                }
                focus_before();
                break;
            }
            break;
        case IDC_FILE_OUT : // ファイルアイテム追加
            if (m_focus_data_type==ID_BOX_TYPE){
                MessageBox(hwnd, "アイテムボックスはファイル出力できません", "エラー", MB_OK);
                break;
            }
            if (!call_save_dialog(hwnd, m_tmp_str, MAX_PATH)) break;
            if (m_focus_data_type==ID_FILE_TYPE){
                m_hier_filer.load_data_file_output(m_focus_data_num, m_tmp_str);
            }
            else if (m_focus_data_type==ID_NUM_TYPE){
                if (fp = fopen(m_tmp_str, "wb")){
                    sprintf(ss, "%d", m_hier_filer.get_data_num(m_focus_data_num));
                    fwrite(ss, 1, strlen(ss), fp);
                    fclose(fp);
                }
            }
            else if (m_focus_data_type==ID_ANY_TYPE){
                if (fp = fopen(m_tmp_str, "wb")){
                    fwrite(m_hier_filer.get_data_any(m_focus_data_num), 1,
                            m_hier_filer.get_data_any_len(m_focus_data_num), fp);
                    fclose(fp);
                }
            }
            break;
        }
        InvalidateRect(hwnd, NULL, 1);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd , &ps);
        SetBkMode(hdc, TRANSPARENT);
        y= 10;
        SelectObject(hdc, m_eazy_font.m_hfont);
        draw_item_box(hdc, 5, &y, &(m_hier_filer.m_top));

        EndPaint(hwnd , &ps);
        break;
    case WM_KEYDOWN:
        if (GetKeyState(VK_DOWN)<0) focus_next();
        else if (GetKeyState(VK_UP)<0)focus_before();
        InvalidateRect(hwnd, NULL, 1);
        break;
    }
    return DefWindowProc(hwnd, msg, wp, lp);
}

// WinMain関数
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) {
    HWND hwnd;
    WNDCLASS winc;
    MSG msg;
    APP app;

    winc.style      = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc    = APP::StaticWndProc;
    winc.cbClsExtra = winc.cbWndExtra   = 0;
    winc.hInstance      = hInstance;
    winc.hIcon      = LoadIcon(NULL , IDI_APPLICATION);
    winc.hCursor        = LoadCursor(NULL , IDC_ARROW);
    winc.hbrBackground  = (HBRUSH)(COLOR_BTNFACE+1);
    winc.lpszMenuName   = NULL;
    winc.lpszClassName  = TEXT("eazy_archiver");
    if (!RegisterClass(&winc)) return 0;

    hwnd = CreateWindow(
            TEXT("eazy_archiver") , TEXT("簡易アーカイバ"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 430, NULL, NULL, hInstance , &app
    );

    if (hwnd == NULL) return 0;

    while(GetMessage(&msg , NULL , 0 , 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}





 006-02  前へ←  ホームへ  →次へ  006-04