// DlgSaveScheme.cpp: 实现文件 // #include "DlgSaveScheme.h" #include "resource.h" #include "scanned_img.h" // for local_trans #include "gb_json.h" #include "mem_dc.h" #include "../../sdk/include/lang/app_language.h" #define WIDTH_MARGINS 10 dlg_save_scheme::dlg_save_scheme(HWND parent) : dlg_base(parent, IDD_SAVE_SCHEME) { create(); std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_TITLE)); int dif = 0; RECT rc = { 0 }; SetWindowTextW(hwnd(), title.c_str()); title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_DISCARD); set_item_text(IDC_RADIO_DISCARD, title.c_str()); set_item_fit_to_text(IDC_RADIO_DISCARD); title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_OVERWRITE); set_item_text(IDC_RADIO_OVERWRITE, title.c_str()); dif = set_item_fit_to_text(IDC_RADIO_OVERWRITE); title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_NEW); set_item_text(IDC_RADIO_NEW, title.c_str()); dif = set_item_fit_to_text(IDC_RADIO_NEW); offset_item(IDC_NAME, dif, 0); GetWindowRect(get_item(IDC_NAME), &rc); if(dif < RECT_W(rc) / 2) expand_item(IDC_NAME, -dif, 0); { RECT r = { 0 }, rc = { 0 }; GetWindowRect(hwnd(), &r); GetWindowRect(get_item(IDC_NAME), &rc); if (rc.right + WIDTH_MARGINS > r.right) { dif = rc.right + WIDTH_MARGINS - r.right; r.right = rc.right + WIDTH_MARGINS; MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE); offset_item(IDOK, dif / 2, 0); } } title = local_trans::lang_trans_between_hz936(CONST_STRING_OK); set_item_text(IDOK, title.c_str()); } dlg_save_scheme::~dlg_save_scheme() { } BOOL dlg_save_scheme::handle_message(UINT msg, WPARAM wp, LPARAM lp) { wchar_t text[40] = { 0 }; BOOL ret = TRUE; switch (msg) { case WM_INITDIALOG: on_init_dlg(); UpdateWindow(hwnd()); break; case WM_COMMAND: handle_command(HIWORD(wp), LOWORD(wp), (HWND)lp); break; case WM_NOTIFY: handle_notify(wp, (LPNMHDR)lp); break; case WM_PAINT: { PAINTSTRUCT ps = { 0 }; HDC hdc = BeginPaint(hwnd(), &ps); { compatible_dc dc(hdc); on_paint(dc.get_dc()); } EndPaint(hwnd(), &ps); } break; default: ret = FALSE; } return ret; } void dlg_save_scheme::handle_command(WORD code, WORD id, HANDLE ctrl) { wchar_t cls[128] = { 0 }; GetClassNameW((HWND)ctrl, cls, _countof(cls) - 1); if (IS_BUTTON(cls)) { if (code == BN_CLICKED) { EnableWindow(get_item(IDC_NAME), FALSE); if (id == IDOK) { if (method_ == SAVE_NEW) { std::wstring text(get_wnd_text(get_item(IDC_NAME))); if (text.empty() || std::find(existing_.begin(), existing_.end(), text) != existing_.end()) { std::wstring info(L""), title(local_trans::lang_trans_between_hz936(CONST_STRING_ERROR)); if (text.empty()) { info = local_trans::lang_trans_between_hz936(CONST_STRING_REINPUT_SCHEME_NAME); } else { info = local_trans::lang_trans_between_hz936(CONST_STRING_LEFT_QUOTE) + text + local_trans::lang_trans_between_hz936(CONST_STRING_RIGHT_QUOTE) + local_trans::lang_trans_between_hz936(CONST_STRING_REINPUT_WHEN_EXISTING); } EnableWindow(get_item(IDC_NAME), TRUE); MessageBoxW(hwnd(), info.c_str(), title.c_str(), MB_OK); goto_name(); return; } name_ = std::move(text); } if (method_ == SAVE_DISCARD) log_info((L"Discard changes on scheme '" + name_ + L"'.\r\n").c_str(), 0); else log_info((L"Save changes to scheme '" + name_ + L"'.\r\n").c_str(), 0); quit_modal(id); } else if (id == IDC_RADIO_DISCARD) method_ = SAVE_DISCARD; else if (id == IDC_RADIO_OVERWRITE) method_ = SAVE_OVERWRITE; else if (id == IDC_RADIO_NEW) { method_ = SAVE_NEW; EnableWindow(get_item(IDC_NAME), TRUE); goto_name(); } } } } void dlg_save_scheme::handle_notify(UINT id, LPNMHDR pnhdr) { } void dlg_save_scheme::layout(void) { } void dlg_save_scheme::on_init_dlg(void) { check_radio(IDC_RADIO_DISCARD); } void dlg_save_scheme::on_paint(HDC hdc) { } void dlg_save_scheme::goto_name(void) { SendMessageW(get_item(IDC_NAME), EM_SETSEL, 0, -1); SetFocus(get_item(IDC_NAME)); } void dlg_save_scheme::check_radio(UINT id, bool check) { SendMessage(get_item(id), BM_SETCHECK, check ? (WPARAM)BST_CHECKED : (WPARAM)BST_UNCHECKED, 0); } void dlg_save_scheme::set_info(const wchar_t* name, std::vector& existing, int mask, const wchar_t* new_name) { bool set_method = false; name_ = name; existing_ = existing; set_item_text(IDC_NAME, new_name ? new_name : name); { std::wstring schem(local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_OVERWRITE)); schem += L" - '"; schem += name; schem += L"'"; set_item_text(IDC_RADIO_OVERWRITE, schem.c_str()); set_item_fit_to_text(IDC_RADIO_OVERWRITE); RECT r = { 0 }, rc = { 0 }; GetWindowRect(get_item(IDC_RADIO_OVERWRITE), &rc); GetWindowRect(hwnd(), &r); if (RECT_W(r) < RECT_W(rc) + WIDTH_MARGINS) { int diff = r.left + RECT_W(rc) + WIDTH_MARGINS - r.right; r.right = r.left + RECT_W(rc) + WIDTH_MARGINS; MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE); offset_item(IDOK, diff / 2, 0); } } if (mask & SAVE_METHOD_MASK(SAVE_DISCARD)) { set_method = true; method_ = SAVE_DISCARD; EnableWindow(get_item(IDC_RADIO_DISCARD), TRUE); check_radio(IDC_RADIO_DISCARD); } else EnableWindow(get_item(IDC_RADIO_DISCARD), FALSE); if (mask & SAVE_METHOD_MASK(SAVE_OVERWRITE)) { if (!set_method) { set_method = true; method_ = SAVE_OVERWRITE; check_radio(IDC_RADIO_OVERWRITE); } EnableWindow(get_item(IDC_RADIO_OVERWRITE), TRUE); } else EnableWindow(get_item(IDC_RADIO_OVERWRITE), FALSE); if (mask & SAVE_METHOD_MASK(SAVE_NEW)) { if (!set_method) { set_method = true; method_ = SAVE_NEW; check_radio(IDC_RADIO_NEW); EnableWindow(get_item(IDC_NAME), TRUE); } EnableWindow(get_item(IDC_RADIO_NEW), TRUE); } else EnableWindow(get_item(IDC_RADIO_NEW), FALSE); } save_method dlg_save_scheme::get_dispose(void) { return method_; } std::wstring dlg_save_scheme::get_name(void) { return name_; }