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 c6fc3de..40ee23e 100644 Binary files a/sln/Release/hgsetver.exe and b/sln/Release/hgsetver.exe differ