No.006 - 03 簡易アーカイバ(複数ファイルの合成)のGUIサンプル |
前回のhier_fier_02.hを使ったGUIサンプルです。 |
・GUIサンプル |
|||||||||||||||||||
前回のNo.006-02のhier_fier_02ファイルを使ったGUIサンプルです。 下の画像で、 ”├ 数値アイテム、 ├ 汎用アイテム、 ├ 子アイテムボックス”となってるとこが現在のデータ構造です。 青く表示されているデータはフォーカスアイテムボックスまたはそのなかの選択されているアイテムです。 キーボードの↑↓キーで選択アイテムを変更します。 各ボタンの扱いはこの表を見てください。
|
|||||||||||||||||||
|
|||||||||||||||||||
メインウィンドウ
ダイアログ | |||||||||||||||
|
//リソーススクリプト 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; } |