TWAIN支持多语言包

This commit is contained in:
gb 2023-01-29 15:03:32 +08:00
parent 6e15875952
commit 04389c65bb
13 changed files with 438 additions and 58 deletions

View File

@ -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)
{

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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<std::string, std::str
HWND lst = GetDlgItem(hwnd_, IDC_LIST1);
LV_COLUMNW col = { 0 };
int ind = 0;
std::wstring text(dlg_base::language_from_hz936(L"\u8BF7\u9009\u62E9\u8BBE\u5907"));
SetWindowTextW(hwnd(), text.c_str());
ListView_SetExtendedListViewStyle(lst, ListView_GetExtendedListViewStyle(lst) | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
SetWindowLong(lst, GWL_STYLE, GetWindowLong(lst, GWL_STYLE) | LVS_SINGLESEL);
col.mask = LVCF_TEXT | LVCF_WIDTH;
col.cx = 180;
col.pszText = (wchar_t*)L"\u8BBE\u5907\u540D\u79F0";
text = dlg_base::language_from_hz936(L"\u8BBE\u5907\u540D\u79F0");
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
col.pszText = (wchar_t*)L"\u5E8F\u5217\u53F7";
text = dlg_base::language_from_hz936(L"\u5E8F\u5217\u53F7");
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
for (std::map<std::string, std::string>::const_iterator it = devs.begin();
@ -199,6 +243,12 @@ dlg_choose_dev::dlg_choose_dev(HWND parent, const std::map<std::string, std::str
SetFocus(lst);
}
}
text = dlg_base::language_from_hz936(L"\u53D6\u6D88");
set_item_text(IDCANCEL, text.c_str());
text = dlg_base::language_from_hz936(L"\u786E\u5B9A");
set_item_text(IDOK, text.c_str());
}
dlg_choose_dev::~dlg_choose_dev()
{}

View File

@ -8,6 +8,7 @@
#include "DlgGamma.h"
#include "gb_json.h"
#include "../../code_device/hgsane/sane_hg_mdw.h" // for
#include "../../sdk/include/lang/app_language.h"
// #pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
@ -139,6 +140,30 @@ int dlg_base::select_combo_text(HWND combo, const wchar_t* text)
return ret;
}
std::wstring dlg_base::language_from_hz936(const wchar_t* hz936)
{
std::string utf8(local_trans::u2a(hz936, CP_UTF8));
std::wstring lang(local_trans::a2u(from_default_language(utf8.c_str(), nullptr), CP_UTF8));
return std::move(lang);
}
std::wstring dlg_base::get_wnd_text(HWND h)
{
int len = GetWindowTextLengthW(h);
wchar_t* buf = new wchar_t[len + 8];
std::wstring ret(L"");
memset(buf, 0, (len + 8) * 2);
GetWindowTextW(h, buf, len + 2);
ret = buf;
delete[] buf;
return std::move(ret);
}
bool dlg_base::is_language_pack_default_code_page(void)
{
return lang_get_cur_code_page() == DEFAULT_CODE_PAGE;
}
BOOL dlg_base::handle_message(UINT msg, WPARAM wp, LPARAM lp)
{
@ -284,6 +309,48 @@ int dlg_base::get_string_width(const wchar_t* str)
return size.cx;
}
bool dlg_base::get_item_rect(UINT id, LPRECT r, bool client)
{
if (client)
return GetClientRect(GetDlgItem(hwnd_, id), r) == TRUE;
else
return GetWindowRect(GetDlgItem(hwnd_, id), r) == TRUE;
}
std::wstring dlg_base::get_item_text(UINT id)
{
return std::move(dlg_base::get_wnd_text(get_item(id)));
}
int dlg_base::get_width_diff_as_text_length(UINT id)
{
RECT r = { 0 };
get_item_rect(id, &r);
return get_string_width(get_item_text(id).c_str()) - RECT_W(r);
}
void dlg_base::offset_item(UINT id, int dx, int dy)
{
RECT r = { 0 };
get_item_rect(id, &r, false);
OffsetRect(&r, dx, dy);
screen_2_client(&r);
MoveWindow(get_item(id), r.left, r.top, RECT_W(r), RECT_H(r), FALSE);
}
void dlg_base::expand_item(UINT id, int dx, int dy)
{
RECT r = { 0 };
get_item_rect(id, &r, false);
r.right += dx;
r.bottom += dy;
screen_2_client(&r);
MoveWindow(get_item(id), r.left, r.top, RECT_W(r), RECT_H(r), FALSE);
}
bool dlg_base::set_item_text(UINT id, const wchar_t* text)
{
return SetWindowTextW(GetDlgItem(hwnd_, id), text) == TRUE;
}
void dlg_base::show_scroll_bar(int bar, bool show)
{
DWORD style = GetWindowLong(hwnd(), GWL_STYLE);
@ -1105,13 +1172,23 @@ void dlg_page::control_action(HWND wnd)
break;
}
if (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);

View File

@ -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);
};

View File

@ -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());
}

View File

@ -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_;

View File

@ -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

View File

@ -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

View File

@ -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, &notice);
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)
{
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);
}

Binary file not shown.