From 04389c65bb556555622c2e277a227d3faff24b57 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Sun, 29 Jan 2023 15:03:32 +0800 Subject: [PATCH] =?UTF-8?q?TWAIN=E6=94=AF=E6=8C=81=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/DlgArea.cpp | 105 ++++++++++++++++++++++++++++++- sane/DlgArea.h | 1 + sane/DlgGamma.cpp | 131 +++++++++++++++++++++++++++++++++++---- sane/DlgGamma.h | 1 + sane/DlgIndicator.cpp | 64 ++++++++++++++++--- sane/DlgPage.cpp | 95 +++++++++++++++++++++++++--- sane/DlgPage.h | 9 +++ sane/DlgSetting.cpp | 14 ++++- sane/gb_json.h | 1 + sane/resource.h | 13 +++- sane/sane.rc | 28 ++++----- sane/scanner.cpp | 34 ++++++---- sln/Release/hgsetver.exe | Bin 96768 -> 98304 bytes 13 files changed, 438 insertions(+), 58 deletions(-) diff --git a/sane/DlgArea.cpp b/sane/DlgArea.cpp index a5938b9..c850a83 100644 --- a/sane/DlgArea.cpp +++ b/sane/DlgArea.cpp @@ -18,11 +18,51 @@ dlg_area::dlg_area(HWND parent) : dlg_base(parent, IDD_AREA) , paper_w_0_(paper_w_), paper_h_0_(paper_h_), cursor_(NULL), drag_(DRAG_POS_NONE) , in_set_func_(false) { + std::wstring title(dlg_base::language_from_hz936(L"\u81EA\u5B9A\u4E49\u626B\u63CF\u533A\u57DF")); + create(); - SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)L"\u6beb\u7c73\uff08mm\uff09"); - SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)L"\u82f1\u5bf8\uff08inch\uff09"); - SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)L"\u50cf\u7d20\uff08px\uff09"); + + SetWindowTextW(hwnd(), title.c_str()); + title = dlg_base::language_from_hz936(L"\u6BEB\u7C73") + L" (mm)"; + SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]); + title = dlg_base::language_from_hz936(L"\u82F1\u5BF8") + L" (inch)"; + SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]); + title = dlg_base::language_from_hz936(L"\u50CF\u7D20") + L" (px)"; + SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]); SendMessage(get_item(IDC_UNIT), CB_SETCURSEL, 0, 0); + + + if (!dlg_base::is_language_pack_default_code_page()) + { + int width_diff = 0, w = 0; + RECT r = { 0 }, rp = { 0 }; + + title = dlg_base::language_from_hz936(L"\u7EB8\u5F20\u5C3A\u5BF8") + L":"; + set_item_text(IDC_STATIC_PAPER, title.c_str()); + title = dlg_base::language_from_hz936(L"\u5355\u4F4D") + L":"; + set_item_text(IDC_STATIC_UNIT, title.c_str()); + title = L"DPI (" + dlg_base::language_from_hz936(L"\u50CF\u7D20") + L"/" + dlg_base::language_from_hz936(L"\u82F1\u5BF8") + L"):"; + set_item_text(IDC_STATIC_DPI, title.c_str()); + title = dlg_base::language_from_hz936(L"\u533A\u57DF\u8BBE\u7F6E") + L":"; + set_item_text(IDC_STATIC_AREA, title.c_str()); + title = dlg_base::language_from_hz936(L"\u5DE6") + L":"; + set_item_text(IDC_STATIC_LEFT, title.c_str()); + title = dlg_base::language_from_hz936(L"\u4E0A") + L":"; + set_item_text(IDC_STATIC_TOP, title.c_str()); + title = dlg_base::language_from_hz936(L"\u5BBD") + L":"; + set_item_text(IDC_STATIC_W, title.c_str()); + title = dlg_base::language_from_hz936(L"\u9AD8") + L":"; + set_item_text(IDC_STATIC_H, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u6062\u590D\u533A\u57DF"); + set_item_text(IDC_BUTTON_RESET, title.c_str()); + title = dlg_base::language_from_hz936(L"\u53D6\u6D88"); + set_item_text(IDCANCEL, title.c_str()); + title = dlg_base::language_from_hz936(L"\u786E\u5B9A"); + set_item_text(IDOK, title.c_str()); + + layout(); + } } dlg_area::~dlg_area() { @@ -195,6 +235,65 @@ void dlg_area::handle_command(WORD code, WORD id, HANDLE ctrl) } } } +void dlg_area::layout(void) +{ + RECT r = { 0 }; + int w_dif = get_width_diff_as_text_length(IDC_STATIC_LEFT), + top1 = get_width_diff_as_text_length(IDC_STATIC_PAPER), + top21 = get_width_diff_as_text_length(IDC_STATIC_UNIT), + top22 = get_width_diff_as_text_length(IDC_STATIC_DPI); + +#define CHECK_CTRL_W(id) \ + if(w_dif < get_width_diff_as_text_length(id)) \ + w_dif = get_width_diff_as_text_length(id); + + CHECK_CTRL_W(IDC_STATIC_TOP); + CHECK_CTRL_W(IDC_STATIC_W); + CHECK_CTRL_W(IDC_STATIC_H); + CHECK_CTRL_W(IDC_BUTTON_RESET); + if (w_dif < top21 + top22) + w_dif = top21 + top22; + + // layout ... + if (w_dif > 0) + { + GetWindowRect(hwnd(), &r); + r.right += w_dif; + MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE); + + expand_item(IDC_STATIC_PAPER, top1, 0); + offset_item(IDC_EDIT_PAPER, top1, 0); + expand_item(IDC_EDIT_PAPER, w_dif - top1, 0); + + expand_item(IDC_STATIC_UNIT, top21, 0); + offset_item(IDC_UNIT, top21, 0); + + offset_item(IDC_STATIC_DPI, w_dif - top22, 0); + expand_item(IDC_STATIC_DPI, top22, 0); + offset_item(IDC_EDIT_DPI, top21 + top22, 0); + + expand_item(IDC_STATIC_AREA, w_dif, 0); + + expand_item(IDC_STATIC_LEFT, w_dif, 0); + offset_item(IDC_EDIT_x, w_dif, 0); + + expand_item(IDC_STATIC_TOP, w_dif, 0); + offset_item(IDC_EDIT_y, w_dif, 0); + + expand_item(IDC_STATIC_W, w_dif, 0); + offset_item(IDC_EDIT_W, w_dif, 0); + + expand_item(IDC_STATIC_H, w_dif, 0); + offset_item(IDC_EDIT_H, w_dif, 0); + + top1 = get_width_diff_as_text_length(IDC_BUTTON_RESET); + expand_item(IDC_BUTTON_RESET, top1, 0); + offset_item(IDC_BUTTON_RESET, (w_dif - top1) / 2, 0); + + offset_item(IDOK, w_dif, 0); + offset_item(IDCANCEL, w_dif, 0); + } +} float dlg_area::as_mm(float v) { diff --git a/sane/DlgArea.h b/sane/DlgArea.h index 83f5006..7c0feaf 100644 --- a/sane/DlgArea.h +++ b/sane/DlgArea.h @@ -57,6 +57,7 @@ class dlg_area: public dlg_base BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override; void handle_command(WORD code, WORD id, HANDLE ctrl); + void layout(void); float as_mm(float v); float from_mm(float v); diff --git a/sane/DlgGamma.cpp b/sane/DlgGamma.cpp index 41f5133..7695c16 100644 --- a/sane/DlgGamma.cpp +++ b/sane/DlgGamma.cpp @@ -97,7 +97,36 @@ namespace calc dlg_gamma::dlg_gamma(HWND parent, bool color) : dlg_base(parent, IDD_GAMMA), exit_code_(0), is_color_(color), bkgnd_(NULL) , show_all_(false) { + std::wstring title(dlg_base::language_from_hz936(L"\u81EA\u5B9A\u4E49\u8272\u8C03\u66F2\u7EBF")); + create(); + SetWindowTextW(hwnd(), title.c_str()); + + if (!dlg_base::is_language_pack_default_code_page()) + { + title = dlg_base::language_from_hz936(L"\u8272\u8C03\u65B9\u6848"); + set_item_text(IDC_STATIC_SCHEME, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u989C\u8272\u901A\u9053"); + set_item_text(IDC_STATIC_COLOR, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u521D\u59CB\u5316"); + set_item_text(IDC_BUTTON_RESET, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u8F93\u5165"); + set_item_text(IDC_STATIC_INPUT, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u8F93\u51FA"); + set_item_text(IDC_STATIC_OUTPUT, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u53D6\u6D88"); + set_item_text(IDCANCEL, title.c_str()); + + title = dlg_base::language_from_hz936(L"\u786E\u5B9A"); + set_item_text(IDOK, title.c_str()); + + layout(); + } } dlg_gamma::~dlg_gamma() { @@ -183,6 +212,58 @@ void dlg_gamma::handle_command(WORD code, WORD id, HANDLE ctrl) on_combo_sel_changed(id, SendMessage((HWND)ctrl, CB_GETCURSEL, 0, 0)); } } +void dlg_gamma::layout(void) +{ + int r1 = get_width_diff_as_text_length(IDC_STATIC_SCHEME), + r21 = get_width_diff_as_text_length(IDC_STATIC_COLOR), + r22 = get_width_diff_as_text_length(IDC_BUTTON_RESET), + r31 = get_width_diff_as_text_length(IDC_STATIC_INPUT), + r32 = get_width_diff_as_text_length(IDC_STATIC_OUTPUT), + r33 = get_width_diff_as_text_length(IDCANCEL), + r34 = get_width_diff_as_text_length(IDOK), + diff = 0; + + if (diff < r1) + diff = r1; + if (diff < r21 + r22) + diff = r21 + r22; + if (diff < r31 + r32 + r33 + r34) + diff = r31 + r32 + r33 + r34; + + if (diff > 0) + { + RECT r = { 0 }; + + GetWindowRect(hwnd(), &r); + r.right += diff; + MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE); + + expand_item(IDC_STATIC_SCHEME, r1, 0); + offset_item(IDC_SCHEME, r1, 0); + expand_item(IDC_SCHEME, diff - r1, 0); + + expand_item(IDC_STATIC_COLOR, r21, 0); + offset_item(IDC_CHANNEL, r21, 0); + + expand_item(IDC_BUTTON_RESET, r22, 0); + offset_item(IDC_BUTTON_RESET, diff - r22, 0); + + expand_item(IDC_STATIC_INPUT, r31, 0); + offset_item(IDC_EDIT_INPUT, r31, 0); + + offset_item(IDC_STATIC_OUTPUT, r31, 0); + expand_item(IDC_STATIC_OUTPUT, r32, 0); + offset_item(IDC_EDIT_OUTPUT, r31 + r32, 0); + + offset_item(IDCANCEL, diff - r33, 0); + expand_item(IDCANCEL, r33, 0); + + offset_item(IDOK, diff - r34, 0); + expand_item(IDOK, r34, 0); + + expand_item(IDC_STATIC_PAINT, diff, 0); + } +} void dlg_gamma::create_background(void) { COLORREF bclr = RGB(128, 128, 128); @@ -409,23 +490,34 @@ void dlg_gamma::on_init_dlg(void) init_curve(&green_, RGB(0, 255, 0)); init_curve(&blue_, RGB(0, 0, 255)); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u81ea\u5b9a\u4e49"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u8d1f\u7247\uff08RGB\uff09"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u5f69\u8272\u8d1f\u7247\uff08RGB\uff09"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u8f83\u6697\uff08RGB\uff09"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u8f83\u4eae\uff08RGB\uff09"); + std::wstring lang(dlg_base::language_from_hz936(L"\u81ea\u5b9a\u4e49")); + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u8d1f\u7247") + L" (RGB)"; + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u5f69\u8272\u8d1f\u7247") + L" (RGB)"; + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u8f83\u6697") + L" (RGB)"; + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u8f83\u4eae") + L" (RGB)"; + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); SendMessage(combo, CB_SETCURSEL, 0, 0); combo = get_item(IDC_CHANNEL); if (is_color_) { SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"RGB"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u7ea2"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u7eff"); - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u84dd"); + lang = dlg_base::language_from_hz936(L"\u7ea2"); + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u7eff"); + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + lang = dlg_base::language_from_hz936(L"\u84dd"); + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); } else - SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"\u7070"); + { + lang = dlg_base::language_from_hz936(L"\u7070"); + SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]); + } SendMessage(combo, CB_SETCURSEL, 0, 0); cur_ = &rgb_gray_; @@ -702,6 +794,8 @@ void dlg_gamma::get_gamma(SANE_Gamma* gamma) void dlg_gamma::set_gamma(const SANE_Gamma* gamma, bool gray) { int sel = 0; + std::wstring text(L""); + SendMessage(get_item(IDC_CHANNEL), CB_RESETCONTENT, 0, 0); is_color_ = !gray; cur_ = &rgb_gray_; @@ -712,7 +806,15 @@ void dlg_gamma::set_gamma(const SANE_Gamma* gamma, bool gray) cur_->points.push_back(pt); } cur_->coefs = calc::coefs_from_points(cur_->points); - SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, is_color_ ? (LPARAM)L"RGB" : (LPARAM)L"\u7070"); + if (is_color_) + { + SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)L"RGB"); + } + else + { + text = dlg_base::language_from_hz936(L"\u7070"); + SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]); + } if(!gray) { @@ -745,9 +847,12 @@ void dlg_gamma::set_gamma(const SANE_Gamma* gamma, bool gray) cur_->coefs = calc::coefs_from_points(cur_->points); // SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)L"RGB"); - SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)L"\u7ea2"); - SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)L"\u7eff"); - SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)L"\u84dd"); + text = dlg_base::language_from_hz936(L"\u7ea2"); + SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]); + text = dlg_base::language_from_hz936(L"\u7eff"); + SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]); + text = dlg_base::language_from_hz936(L"\u84dd"); + SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]); } cur_ = &rgb_gray_; sel = 0; diff --git a/sane/DlgGamma.h b/sane/DlgGamma.h index cbb7e40..e96b096 100644 --- a/sane/DlgGamma.h +++ b/sane/DlgGamma.h @@ -32,6 +32,7 @@ class dlg_gamma: public dlg_base BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override; void handle_command(WORD code, WORD id, HANDLE ctrl); + void layout(void); void create_background(void); void init_curve(GAMMACURVE* curv, COLORREF clr = RGB(255, 255, 255)); int add_drag_point(int x, int y); diff --git a/sane/DlgIndicator.cpp b/sane/DlgIndicator.cpp index 7c9b7e7..66da931 100644 --- a/sane/DlgIndicator.cpp +++ b/sane/DlgIndicator.cpp @@ -17,6 +17,46 @@ dlg_indicator::dlg_indicator(HWND parent) : dlg_base(parent, IDD_INDICATOR) { create(); SetWindowLongW(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE, GetWindowLong(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE) | SS_OWNERDRAW); + + if (!dlg_base::is_language_pack_default_code_page()) + { + std::wstring text(dlg_base::get_wnd_text(hwnd())); + + text = dlg_base::language_from_hz936(text.c_str()); + SetWindowTextW(hwnd(), text.c_str()); + + text = dlg_base::language_from_hz936(L"\u7EB8\u5F20"); + set_item_text(IDC_STATIC_PAPER, text.c_str()); + + text = dlg_base::language_from_hz936(L"\u56FE\u7247"); + set_item_text(IDC_STATIC_IMAGE, text.c_str()); + + text = dlg_base::language_from_hz936(L"\u53D6\u6D88"); + set_item_text(IDCANCEL, text.c_str()); + + int paper = get_width_diff_as_text_length(IDC_STATIC_PAPER), + img = get_width_diff_as_text_length(IDC_STATIC_IMAGE), + btn = get_width_diff_as_text_length(IDCANCEL), + diff = paper >= img + btn ? paper : img + btn; + + if (diff > 0) + { + RECT r = { 0 }; + + GetWindowRect(hwnd(), &r); + r.right += diff; + MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE); + + expand_item(IDC_STATIC_PAPER, paper, 0); + offset_item(IDC_EDIT_PAPER, paper, 0); + + expand_item(IDC_STATIC_IMAGE, img, 0); + offset_item(IDC_EDIT_IMAGE, img, 0); + + offset_item(IDCANCEL, diff - btn, 0); + expand_item(IDCANCEL, btn, 0); + } + } } dlg_indicator::~dlg_indicator() { @@ -82,21 +122,21 @@ BOOL dlg_indicator::handle_message(UINT msg, WPARAM wp, LPARAM lp) } else { - wchar_t msg[128] = { 0 }; std::string* str = (std::string*)wp; - swprintf_s(msg, _countof(msg) - 1, L"\u603b\u8ba1\u626b\u63cf\u56fe\u7247\uff1a%u \u5f20", images_); + std::wstring txt(dlg_base::language_from_hz936(L"\u603b\u8ba1\u626b\u63cf\u56fe\u7247")); - SetDlgItemTextW(hwnd_, IDC_STATIC_ERR, msg); + txt += L": " + std::to_wstring(images_); + SetDlgItemTextW(hwnd_, IDC_STATIC_ERR, txt.c_str()); delete str; SetTimer(hwnd_, 1, 3000, NULL); } - SetDlgItemTextW(hwnd_, IDCANCEL, L"\u5173\u95ed"); + SetDlgItemTextW(hwnd_, IDCANCEL, dlg_base::language_from_hz936(L"\u5173\u95ed").c_str()); ShowWindow(GetDlgItem(hwnd_, IDC_STATIC_PAPER), SW_HIDE); ShowWindow(GetDlgItem(hwnd_, IDC_STATIC_IMAGE), SW_HIDE); ShowWindow(GetDlgItem(hwnd_, IDC_EDIT_PAPER), SW_HIDE); ShowWindow(GetDlgItem(hwnd_, IDC_EDIT_IMAGE), SW_HIDE); ShowWindow(GetDlgItem(hwnd_, IDC_STATIC_ERR), SW_SHOW); - SetWindowTextW(hwnd_, L"\u626b\u63cf\u7ed3\u675f"); + SetWindowTextW(hwnd_, dlg_base::language_from_hz936(L"\u626b\u63cf\u7ed3\u675f").c_str()); UpdateWindow(hwnd_); break; case WM_TIMER: @@ -165,14 +205,18 @@ dlg_choose_dev::dlg_choose_dev(HWND parent, const std::map::const_iterator it = devs.begin(); @@ -199,6 +243,12 @@ dlg_choose_dev::dlg_choose_dev(HWND parent, const std::mapconfig_changed(id - dlg_page::dyn_id_base, (char*)val, len); + { + if (type == SANE_TYPE_STRING) + { + std::string def_lang(to_default_language((char*)val, nullptr)); + cfg->config_changed(id - dlg_page::dyn_id_base, &def_lang[0], def_lang.length()); + } + else + cfg->config_changed(id - dlg_page::dyn_id_base, (char*)val, len); + } } if (statu == SANE_STATUS_INVAL) { - std::wstring attr(L"\u6B64\u8BBE\u5907\u4E0D\u652F\u6301\u5C06 \u201C" + local_trans::a2u(sane_.sane_get_option_descriptor_api(dev_, id - dlg_page::dyn_id_base)->title, CP_UTF8) + L"\u201D \u8BBE\u7F6E\u4E3A\uFF1A"), + std::wstring attr(dlg_base::language_from_hz936(L"\u6B64\u8BBE\u5907\u4E0D\u652F\u6301\u5C06") + L" \"" + + local_trans::a2u(sane_.sane_get_option_descriptor_api(dev_, id - dlg_page::dyn_id_base)->title, CP_UTF8) + + L"\" " + dlg_base::language_from_hz936(L"\u8BBE\u7F6E\u4E3A") + L": "), attr_v(local_trans::a2u(to_v.c_str(), CP_UTF8)); - MessageBoxW(hwnd(), (attr + attr_v).c_str(), L"\u53C2\u6570\u9519\u8BEF", MB_OK); + MessageBoxW(hwnd(), (attr + attr_v).c_str(), dlg_base::language_from_hz936(L"\u53C2\u6570\u9519\u8BEF").c_str(), MB_OK); set_ctrl_value(wnd, type, val, true); } else @@ -1119,9 +1196,11 @@ void dlg_page::control_action(HWND wnd) std::string tov(hg_sane_middleware::option_value_2_string(type, val)); if (tov != to_v) { - std::wstring attr(L"\u539F\u53C2\u6570 \u201C" + local_trans::a2u(to_v.c_str(), CP_UTF8) + L"\u201D \u4E0D\u7CBE\u786E\u6216\u8BBE\u5907\u4E0D\u652F\u6301\uFF0C\u5DF2\u8C03\u6574\u4E3A\uFF1A"), + std::wstring attr(dlg_base::language_from_hz936(L"\u539F\u53C2\u6570") + L" \"" + + local_trans::a2u(to_v.c_str(), CP_UTF8) + L"\" " + + dlg_base::language_from_hz936(L"\u4E0D\u7CBE\u786E\u6216\u8BBE\u5907\u4E0D\u652F\u6301\uFF0C\u5DF2\u8C03\u6574\u4E3A")), attr_v(local_trans::a2u(tov.c_str(), CP_UTF8)); - MessageBoxW(hwnd(), (attr + attr_v).c_str(), L"\u53C2\u6570\u8C03\u6574", MB_OK); + MessageBoxW(hwnd(), (attr + attr_v).c_str(), dlg_base::language_from_hz936(L"\u53C2\u6570\u8C03\u6574").c_str(), MB_OK); } set_ctrl_value(wnd, type, val, false, !(after || statu)); } @@ -1310,9 +1389,10 @@ bool dlg_page::add_control(int sn, const SANE_Option_Descriptor* desc, void* cur // custom area ... int w = 69; HWND host = wnd; + std::wstring t(dlg_base::language_from_hz936(L"\u8bbe\u7f6e\u533a\u57df")); id_custom_area_ = sn; - wnd = CreateWindowW(WC_BUTTONW, L"\u8bbe\u7f6e\u533a\u57df", WS_CHILD | WS_VISIBLE, pos_.x + text.cx, pos_.y - 1, w, text.cy + 3, hwnd(), NULL, g_my_inst, NULL); + wnd = CreateWindowW(WC_BUTTONW, t.c_str(), WS_CHILD | WS_VISIBLE, pos_.x + text.cx, pos_.y - 1, w, text.cy + 3, hwnd(), NULL, g_my_inst, NULL); text.cx += w + dlg_page::gap_x; EnableWindow(wnd, (desc->cap & SANE_CAP_INACTIVE) == 0 && *(SANE_Bool*)cur_val == SANE_TRUE); SetWindowLong(wnd, GWL_ID, dlg_page::dyn_id_base + sn); @@ -1338,9 +1418,10 @@ bool dlg_page::add_control(int sn, const SANE_Option_Descriptor* desc, void* cur // custom gamma control ... int w = 78; HWND host = wnd; + std::wstring t(dlg_base::language_from_hz936(L"\u8bbe\u7f6e\u8272\u8c03\u66f2\u7ebf")); id_custom_gamma_ = sn; - wnd = CreateWindowW(WC_BUTTONW, L"\u8bbe\u7f6e\u8272\u8c03\u66f2\u7ebf", WS_CHILD | WS_VISIBLE, pos_.x + text.cx, pos_.y - 1, w, text.cy + 3, hwnd(), NULL, g_my_inst, NULL); + wnd = CreateWindowW(WC_BUTTONW, t.c_str(), WS_CHILD | WS_VISIBLE, pos_.x + text.cx, pos_.y - 1, w, text.cy + 3, hwnd(), NULL, g_my_inst, NULL); text.cx += w + dlg_page::gap_x; EnableWindow(wnd, (desc->cap& SANE_CAP_INACTIVE) == 0 && *(SANE_Bool*)cur_val == SANE_TRUE); SetWindowLong(wnd, GWL_ID, dlg_page::dyn_id_base + sn); diff --git a/sane/DlgPage.h b/sane/DlgPage.h index 306ea50..d9bd119 100644 --- a/sane/DlgPage.h +++ b/sane/DlgPage.h @@ -52,6 +52,9 @@ public: static bool get_max_size(SIZE& dst, const SIZE& src); // return whether changed dst static bool get_max_size(SIZE& dst, int cx, int cy); // return whether changed dst static int select_combo_text(HWND combo, const wchar_t* text); + static std::wstring language_from_hz936(const wchar_t* hz936); + static std::wstring get_wnd_text(HWND h); + static bool is_language_pack_default_code_page(void); public: void set_ui_event_notify(void(__stdcall* notify)(int, void*, void*), void* param); @@ -64,6 +67,12 @@ public: BOOL set_font(HFONT font); HFONT get_font(void); int get_string_width(const wchar_t* str); + bool get_item_rect(UINT id, LPRECT r, bool client = true); + std::wstring get_item_text(UINT id); + int get_width_diff_as_text_length(UINT id); // + void offset_item(UINT id, int dx, int dy); + void expand_item(UINT id, int dx, int dy); + bool set_item_text(UINT id, const wchar_t* text); void show_scroll_bar(int bar = SB_VERT, bool show = true); bool track_mouse_hover(void); }; diff --git a/sane/DlgSetting.cpp b/sane/DlgSetting.cpp index ab8183e..ba76acb 100644 --- a/sane/DlgSetting.cpp +++ b/sane/DlgSetting.cpp @@ -7,6 +7,8 @@ #include "DlgPage.h" #include "gb_json.h" +#include "../../sdk/include/lang/app_language.h" + // CDlgIndicator 对话框 @@ -17,8 +19,10 @@ dlg_setting::dlg_setting(HWND parent, LPSANEAPI api, SANE_Handle dev, bool with_ , sane_api_(*api), sane_dev_(dev), with_scan_(with_scan) , papers_(0), images_(0), err_(false), tab_(NULL), cfg_(NULL), cfg_file_(L"") { + std::wstring setting(local_trans::a2u(from_default_language("\350\256\276\347\275\256", nullptr), CP_UTF8)); + create(); - SetWindowTextW(hwnd(), (std::wstring(name) + L" \u8bbe\u7f6e").c_str()); + SetWindowTextW(hwnd(), (std::wstring(name) + L" " + setting).c_str()); } dlg_setting::~dlg_setting() { @@ -216,6 +220,14 @@ void dlg_setting::on_init_dialog(void) if (with_scan_) ShowWindow(get_item(IDC_BUTTON_SCAN), SW_SHOW); + if (!dlg_base::is_language_pack_default_code_page()) + { + ::SetDlgItemTextW(hwnd(), IDC_BUTTON_SCAN, dlg_base::language_from_hz936(L"\u626B\u63CF").c_str()); + ::SetDlgItemTextW(hwnd(), IDC_BUTTON_RESTORE, dlg_base::language_from_hz936(L"\u6062\u590D\u9ED8\u8BA4\u503C").c_str()); + ::SetDlgItemTextW(hwnd(), IDC_BUTTON_HELP, dlg_base::language_from_hz936(L"\u5E2E\u52A9").c_str()); + ::SetDlgItemTextW(hwnd(), IDOK, dlg_base::language_from_hz936(L"\u786E\u5B9A").c_str()); + } + select_page(0); UpdateWindow(hwnd()); } diff --git a/sane/gb_json.h b/sane/gb_json.h index 75f7940..021d1cb 100644 --- a/sane/gb_json.h +++ b/sane/gb_json.h @@ -107,6 +107,7 @@ namespace gb std::string decode(const char* data, size_t bytes); }; + // NOTE: 2021-01-28 all stored string value are in default language (i.e. Chinese-Simplified), user should call app_language::to_default_language/from_default_language for real value class sane_config_schm : public refer { std::string scheme_name_; diff --git a/sane/resource.h b/sane/resource.h index 951fb53..d033bfc 100644 --- a/sane/resource.h +++ b/sane/resource.h @@ -31,6 +31,17 @@ #define IDC_EDIT_INPUT 1018 #define IDC_EDIT_OUTPUT 1019 #define IDC_LIST1 1020 +#define IDC_STATIC_UNIT 1021 +#define IDC_STATIC_DPI 1022 +#define IDC_STATIC_AREA 1023 +#define IDC_STATIC_LEFT 1024 +#define IDC_STATIC_TOP 1025 +#define IDC_STATIC_W 1026 +#define IDC_STATIC_H 1027 +#define IDC_STATIC_SCHEME 1028 +#define IDC_STATIC_COLOR 1029 +#define IDC_STATIC_INPUT 1030 +#define IDC_STATIC_OUTPUT 1031 // Next default values for new objects // @@ -38,7 +49,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 109 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1021 +#define _APS_NEXT_CONTROL_VALUE 1032 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/sane/sane.rc b/sane/sane.rc index 8a9a40c..e1484c0 100644 --- a/sane/sane.rc +++ b/sane/sane.rc @@ -52,7 +52,7 @@ END IDD_INDICATOR DIALOGEX 0, 0, 145, 38 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION -CAPTION "ɨ衭" +CAPTION "ɨ衭." FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN PUSHBUTTON "ȡɨ",IDCANCEL,96,19,42,12 @@ -93,16 +93,16 @@ BEGIN PUSHBUTTON "ָ",IDC_BUTTON_RESET,172,156,50,14 DEFPUSHBUTTON "ȷ",IDOK,189,209,33,13 DEFPUSHBUTTON "ȡ",IDCANCEL,134,209,33,13 - LTEXT "ֽųߴ磺",IDC_STATIC,7,7,41,8 - LTEXT "DPI/Ӣ磩",IDC_STATIC,118,28,70,8 - LTEXT "λ",IDC_STATIC,7,28,25,8 - EDITTEXT IDC_EDIT_PAPER,45,5,177,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "ֽųߴ磺",IDC_STATIC_PAPER,7,7,40,8 + LTEXT "DPI/Ӣ磩",IDC_STATIC_DPI,116,28,70,8 + LTEXT "λ",IDC_STATIC_UNIT,7,28,25,8 + EDITTEXT IDC_EDIT_PAPER,53,5,169,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_EDIT_DPI,187,26,34,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "",IDC_STATIC,173,66,17,8 - LTEXT "ϣ",IDC_STATIC,173,87,17,8 - LTEXT "",IDC_STATIC,173,108,17,8 - LTEXT "ߣ",IDC_STATIC,173,129,17,8 - GROUPBOX "",IDC_STATIC,7,47,215,160 + LTEXT "",IDC_STATIC_LEFT,173,66,17,8 + LTEXT "ϣ",IDC_STATIC_TOP,173,87,17,8 + LTEXT "",IDC_STATIC_W,173,108,17,8 + LTEXT "ߣ",IDC_STATIC_H,173,129,17,8 + GROUPBOX "",IDC_STATIC_AREA,7,47,215,160 LTEXT "Static",IDC_STATIC_PAINT,9,60,159,144,NOT WS_VISIBLE | WS_BORDER END @@ -115,13 +115,13 @@ BEGIN PUSHBUTTON "ʼ",IDC_BUTTON_RESET,128,23,50,14 DEFPUSHBUTTON "ȷ",IDOK,145,204,33,13 DEFPUSHBUTTON "ȡ",IDCANCEL,108,204,33,13 - LTEXT "ɫ",IDC_STATIC,7,7,41,8 - LTEXT "ɫͨ",IDC_STATIC,7,26,41,8 + LTEXT "ɫ",IDC_STATIC_SCHEME,7,7,41,8 + LTEXT "ɫͨ",IDC_STATIC_COLOR,7,26,41,8 LTEXT "Static",IDC_STATIC_PAINT,7,41,171,158,NOT WS_VISIBLE | WS_BORDER COMBOBOX IDC_SCHEME,49,5,129,103,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT_OUTPUT,80,205,18,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "",IDC_STATIC,56,207,24,8 - LTEXT "룺",IDC_STATIC,7,207,25,8 + LTEXT "",IDC_STATIC_OUTPUT,56,207,24,8 + LTEXT "룺",IDC_STATIC_INPUT,7,207,25,8 EDITTEXT IDC_EDIT_INPUT,33,205,18,12,ES_AUTOHSCROLL | ES_NUMBER END diff --git a/sane/scanner.cpp b/sane/scanner.cpp index fca243b..1bb0eb6 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -11,6 +11,7 @@ #include "DlgIndicator.h" #include "DlgSetting.h" #include "gb_json.h" +#include "../../sdk/include/lang/app_language.h" #pragma comment(lib, "Shlwapi.lib") @@ -537,11 +538,11 @@ void scanner::transport_config_file(void) pid += scanner_name_.substr(pos + 3); if (scanner_name_.find(L"HUAGOSCAN ") != std::wstring::npos) { - old = local_trans::a2u("\345\215\216\351\253\230\346\211\253\346\217\217\344\273\252\342\200\224", CP_UTF8); + old = dlg_base::language_from_hz936(L"\u534E\u9AD8\u626B\u63CF\u4EEA\u2014"); } else if (scanner_name_.find(L"LANXUMSCAN ") != std::wstring::npos) { - old = local_trans::a2u("\347\253\213\346\200\235\350\276\260\346\211\253\346\217\217\344\273\252\342\200\224", CP_UTF8); + old = dlg_base::language_from_hz936(L"\u7ACB\u601D\u8FB0\u626B\u63CF\u4EEA\u2014"); pid += L"S"; } old += pid; @@ -557,7 +558,7 @@ void scanner::update_config(void) cfg_->update(&scanner::is_option_float, handle_, &callback::option_title_2_name, ¬ice); if (notice.length()) { - std::wstring msg(L"\u4E0B\u5217\u914D\u7F6E\u6570\u636E\u9519\u8BEF\uFF0C\u5DF2\u7ECF\u6062\u590D\u5230\u9ED8\u8BA4\u503C\u3002\u5982\u679C\u9700\u8981\uFF0C\u8BF7\u91CD\u65B0\u8BBE\u7F6E\uFF1A\r\n\r\n"); + std::wstring msg(dlg_base::language_from_hz936(L"\u4E0B\u5217\u914D\u7F6E\u6570\u636E\u9519\u8BEF\uFF0C\u5DF2\u7ECF\u6062\u590D\u5230\u9ED8\u8BA4\u503C\u3002\u5982\u679C\u9700\u8981\uFF0C\u8BF7\u91CD\u65B0\u8BBE\u7F6E") + L"\r\n\r\n"); size_t pos = notice.find("\r\n"); while (pos != std::string::npos) @@ -567,8 +568,8 @@ void scanner::update_config(void) pos = notice.find("\r\n"); } if (!IsWindow(app_wnd_)) - callback::bring_message_box_topmost(L"\u52A0\u8F7D\u914D\u7F6E"); - MessageBoxW(app_wnd_, msg.c_str(), L"\u52A0\u8F7D\u914D\u7F6E", MB_OK | MB_ICONINFORMATION); + callback::bring_message_box_topmost(dlg_base::language_from_hz936(L"\u52A0\u8F7D\u914D\u7F6E").c_str()); + MessageBoxW(app_wnd_, msg.c_str(), dlg_base::language_from_hz936(L"\u52A0\u8F7D\u914D\u7F6E").c_str(), MB_OK | MB_ICONINFORMATION); } } void scanner::load_config(const wchar_t* file) @@ -612,6 +613,7 @@ void scanner::apply_config(void) } else { + v = from_default_language(v.c_str(), nullptr); void* data = &v[0]; SANE_Fixed fixed = 0; const SANE_Option_Descriptor* desc = hg_sane_middleware::instance()->get_option_descriptor(handle_, (const void*)id); @@ -770,8 +772,8 @@ int scanner::open(void) HWND parent = callback::find_main_wnd(); if (!IsWindow(parent)) - callback::bring_message_box_topmost(L"\u6253\u5F00\u5931\u8D25"); - MessageBoxW(parent, msg.c_str(), L"\u6253\u5F00\u5931\u8D25", MB_OK | MB_ICONERROR); + callback::bring_message_box_topmost(dlg_base::language_from_hz936(L"\u6253\u5F00\u5931\u8D25").c_str()); + MessageBoxW(parent, msg.c_str(), dlg_base::language_from_hz936(L"\u6253\u5F00\u5931\u8D25").c_str(), MB_OK | MB_ICONERROR); } return ret; @@ -823,7 +825,15 @@ int scanner::init_options_id(void) break; } if (len) - cfg_->set_default_value(op_id, desc->name, (char*)val, len); + { + if (desc->type == SANE_TYPE_STRING) + { + std::string deflan(to_default_language((char*)val, nullptr)); + cfg_->set_default_value(op_id, desc->name, &deflan[0], deflan.length()); + } + else + cfg_->set_default_value(op_id, desc->name, (char*)val, len); + } local_utility::free_memory(val); } @@ -2245,8 +2255,8 @@ COM_API_IMPLEMENT(scanner, int, start(void)) if (indicator_.get()) indicator_->show(false); if (!IsWindow(app_wnd_)) - callback::bring_message_box_topmost(L"\u542F\u52A8\u5931\u8D25"); - MessageBoxW(app_wnd_, msg.c_str(), L"\u542F\u52A8\u5931\u8D25", MB_OK | MB_ICONERROR); + callback::bring_message_box_topmost(dlg_base::language_from_hz936(L"\u542F\u52A8\u5931\u8D25").c_str()); + MessageBoxW(app_wnd_, msg.c_str(), dlg_base::language_from_hz936(L"\u542F\u52A8\u5931\u8D25").c_str(), MB_OK | MB_ICONERROR); } prev_start_result_ = ret; is_scanning_ = ret == SANE_STATUS_GOOD; @@ -2852,8 +2862,8 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) { std::wstring msg(local_trans::a2u((char*)data, CP_UTF8)); if(!IsWindow(app_wnd_)) - callback::bring_message_box_topmost(L"\u9519\u8BEF"); - MessageBoxW(app_wnd_, msg.c_str(), L"\u9519\u8BEF", MB_OK); + callback::bring_message_box_topmost(dlg_base::language_from_hz936(L"\u9519\u8BEF").c_str()); + MessageBoxW(app_wnd_, msg.c_str(), dlg_base::language_from_hz936(L"\u9519\u8BEF").c_str(), MB_OK); } on_ui_event(ev_code, (void*)ev_code); } diff --git a/sln/Release/hgsetver.exe b/sln/Release/hgsetver.exe index c6fc3dee55efed98ce6f08fd408a4ecdbeadc648..40ee23eeec4e4c17d53f8827cd7585851d122dcb 100644 GIT binary patch delta 17767 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