This commit is contained in:
13038267101 2023-02-13 17:02:55 +08:00
commit b9abfad34b
24 changed files with 2258 additions and 1201 deletions

View File

@ -14,20 +14,20 @@ int dlg_area::area_min_pixel = 50;
dlg_area::dlg_area(HWND parent) : dlg_base(parent, IDD_AREA)
, unit_(PAPER_UNIT_MM), paper_w_(210), paper_h_(297), dpi_(200)
, x_(0), y_(0), w_(paper_w_), h_(paper_h_)
, exit_code_(0), paper_(L"A4")
, paper_(L"A4")
, 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"));
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_CUSTOM_AREA));
create();
SetWindowTextW(hwnd(), title.c_str());
title = dlg_base::language_from_hz936(L"\u6BEB\u7C73") + L" (mm)";
title = local_trans::lang_trans_between_hz936(CONST_STRING_UNIT_MM) + L" (mm)";
SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]);
title = dlg_base::language_from_hz936(L"\u82F1\u5BF8") + L" (inch)";
title = local_trans::lang_trans_between_hz936(CONST_STRING_UNIT_INCH) + L" (inch)";
SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]);
title = dlg_base::language_from_hz936(L"\u50CF\u7D20") + L" (px)";
title = local_trans::lang_trans_between_hz936(CONST_STRING_UNIT_PIXEL) + L" (px)";
SendMessageW(get_item(IDC_UNIT), CB_ADDSTRING, 0, (LPARAM)&title[0]);
SendMessage(get_item(IDC_UNIT), CB_SETCURSEL, 0, 0);
@ -37,28 +37,28 @@ dlg_area::dlg_area(HWND parent) : dlg_base(parent, IDD_AREA)
int width_diff = 0, w = 0;
RECT r = { 0 }, rp = { 0 };
title = dlg_base::language_from_hz936(L"\u7EB8\u5F20\u5C3A\u5BF8") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_OPT_PAPER) + L":";
set_item_text(IDC_STATIC_PAPER, title.c_str());
title = dlg_base::language_from_hz936(L"\u5355\u4F4D") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_UNIT) + 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"):";
title = L"DPI (" + local_trans::lang_trans_between_hz936(CONST_STRING_UNIT_PIXEL) + L"/" + local_trans::lang_trans_between_hz936(CONST_STRING_UNIT_INCH) + L"):";
set_item_text(IDC_STATIC_DPI, title.c_str());
title = dlg_base::language_from_hz936(L"\u533A\u57DF\u8BBE\u7F6E") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_AREA_SET) + L":";
set_item_text(IDC_STATIC_AREA, title.c_str());
title = dlg_base::language_from_hz936(L"\u5DE6") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_LEFT) + L":";
set_item_text(IDC_STATIC_LEFT, title.c_str());
title = dlg_base::language_from_hz936(L"\u4E0A") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_TOP) + L":";
set_item_text(IDC_STATIC_TOP, title.c_str());
title = dlg_base::language_from_hz936(L"\u5BBD") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_WIDTH) + L":";
set_item_text(IDC_STATIC_W, title.c_str());
title = dlg_base::language_from_hz936(L"\u9AD8") + L":";
title = local_trans::lang_trans_between_hz936(CONST_STRING_HEIGHT) + L":";
set_item_text(IDC_STATIC_H, title.c_str());
title = dlg_base::language_from_hz936(L"\u6062\u590D\u533A\u57DF");
title = local_trans::lang_trans_between_hz936(CONST_STRING_RESTORE_AREA);
set_item_text(IDC_BUTTON_RESET, title.c_str());
title = dlg_base::language_from_hz936(L"\u53D6\u6D88");
title = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
set_item_text(IDCANCEL, title.c_str());
title = dlg_base::language_from_hz936(L"\u786E\u5B9A");
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
layout();
@ -142,11 +142,11 @@ void dlg_area::handle_command(WORD code, WORD id, HANDLE ctrl)
}
else if (id == IDCANCEL)
{
exit_code_ = id;
quit_modal(id);
}
else if (id == IDOK)
{
exit_code_ = id;
quit_modal(id);
}
else if (id == IDC_BUTTON_RESET)
{
@ -344,7 +344,7 @@ std::wstring dlg_area::format_number(float v)
}
void dlg_area::refresh_paper_info(void)
{
SetWindowTextW(get_item(IDC_EDIT_PAPER), (paper_ + L"" + format_number(paper_w_) + L"\u00d7" + format_number(paper_h_) + L"").c_str());
SetWindowTextW(get_item(IDC_EDIT_PAPER), (paper_ + L"" + format_number(paper_w_) + local_trans::lang_trans_between_hz936(CONST_STRING_MULTIPLE) + format_number(paper_h_) + L"").c_str());
SetDlgItemInt(hwnd(), IDC_EDIT_DPI, UINT(dpi_), FALSE);
in_set_func_ = true;
@ -796,43 +796,6 @@ void dlg_area::set_area(float x, float y, float w, float h)
refresh_paper_info();
}
int dlg_area::do_modal(HWND parent)
{
BOOL enable_parent = FALSE,
got = TRUE;
MSG msg = { 0 };
if (IsWindow(parent) && parent != GetDesktopWindow())
{
EnableWindow(parent, FALSE);
enable_parent = TRUE;
}
ShowWindow(hwnd(), SW_SHOW);
while ((got = GetMessage(&msg, NULL, 0, 0)))
{
if ((DWORD)got == -1)
break;
//if (enable_parent && msg.hwnd == parent &&
// msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST &&
// msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
// continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
if (exit_code_ == IDOK || exit_code_ == IDCANCEL)
break;
}
ShowWindow(hwnd(), SW_HIDE);
if (enable_parent)
{
EnableWindow(parent, TRUE);
}
return exit_code_;
}
float dlg_area::x_in_mm(void)
{
return as_mm(x_);

View File

@ -43,7 +43,6 @@ class dlg_area: public dlg_base
float y_;
float w_;
float h_;
int exit_code_;
RECT whole_;
RECT user_sel_;
@ -92,7 +91,6 @@ public:
public:
void set_paper(const wchar_t* name, float width_mm, float height_mm, float dpi);
void set_area(float x, float y, float w, float h);
int do_modal(HWND parent); // return IDOK or IDCANCEL
float x_in_mm(void);
float y_in_mm(void);
float w_in_mm(void);

208
sane/DlgCfgMgr.cpp Normal file
View File

@ -0,0 +1,208 @@
// DlgIndicator.cpp: 实现文件
//
#include "DlgCfgMgr.h"
#include "resource.h"
#include "scanned_img.h" // for local_trans
#include "mem_dc.h"
#include "gb_json.h"
// CDlgIndicator 对话框
dlg_cfg_mgr::dlg_cfg_mgr(gb::scanner_cfg* cfg, HWND parent) : cfg_(cfg), dlg_base(parent, IDD_CFG_MGR)
{
create();
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_CFG_MANAGER));
int dif = 0;
SetWindowTextW(hwnd(), title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_CFG_SCHEME);
set_item_text(IDC_STATIC_PAPER, title.c_str());
set_item_fit_to_text(IDC_STATIC_PAPER);
title = local_trans::lang_trans_between_hz936(CONST_STRING_DEL_SELECTED);
set_item_text(IDC_BUTTON_DEL_SEL, title.c_str());
dif = set_item_fit_to_text(IDC_BUTTON_DEL_SEL);
if (dif)
offset_item(IDC_BUTTON_DEL_SEL, -dif, 0);
title = local_trans::lang_trans_between_hz936(CONST_STRING_DEL_ALL);
set_item_text(IDC_BUTTON_DEL_ALL, title.c_str());
set_item_fit_to_text(IDC_BUTTON_DEL_ALL);
title = local_trans::lang_trans_between_hz936(CONST_STRING_CFG_CONTENT);
set_item_text(IDC_STATIC_SKETCH, title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
}
dlg_cfg_mgr::~dlg_cfg_mgr()
{
}
BOOL dlg_cfg_mgr::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_cfg_mgr::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)
{
if (id == IDOK || id == IDCANCEL)
quit_modal(id);
else if (id == IDC_BUTTON_DEL_SEL)
on_del_selected();
else if (id == IDC_BUTTON_DEL_ALL)
on_del_all();
}
}
else if (IS_EDIT(cls))
{
//if (code == EN_SETFOCUS)
// label_edit_ = (HWND)ctrl;
}
}
void dlg_cfg_mgr::handle_notify(UINT id, LPNMHDR pnhdr)
{
if (id == IDC_LIST1)
{
if (pnhdr->code == LVN_BEGINLABELEDITW)
{
LPNMLVDISPINFOW pdisp = (LPNMLVDISPINFOW)pnhdr;
label_ = pdisp->item.pszText;
}
else if (pnhdr->code == LVN_ENDLABELEDITW)
{
LPNMLVDISPINFOW pdisp = (LPNMLVDISPINFOW)pnhdr;
if (pdisp->item.pszText && label_ != pdisp->item.pszText)
{
ListView_SetItemText(get_item(IDC_LIST1), pdisp->item.iItem, pdisp->item.iSubItem, pdisp->item.pszText);
if (cfg_)
{
if (!cfg_->rename_scheme(local_trans::u2a(label_.c_str(), CP_UTF8).c_str(), local_trans::u2a(pdisp->item.pszText, CP_UTF8).c_str()))
{
std::wstring input(pdisp->item.pszText);
input += L" " + local_trans::lang_trans_between_hz936(CONST_STRING_ALREADY_EXISTS);
::MessageBoxW(hwnd(), input.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_RE_INPUT).c_str(), MB_OK | MB_ICONINFORMATION);
dlg_base::list_set_item_text(get_item(IDC_LIST1), pdisp->item.iItem, 0, label_.c_str());
}
}
}
}
else if (pnhdr->code == LVN_ITEMCHANGED)
{
LPNMLISTVIEW pv = (LPNMLISTVIEW)pnhdr;
if ((pv->uNewState & LVIS_SELECTED) && (pv->uOldState & LVIS_SELECTED) == 0)
on_sel_changed(pv->iItem);
}
}
}
void dlg_cfg_mgr::layout(void)
{
}
void dlg_cfg_mgr::on_init_dlg(void)
{
HWND lstwnd = get_item(IDC_LIST1);
std::vector<std::string> schemes;
cfg_->get_all_schemes(schemes);
dlg_base::list_insert_column(lstwnd, local_trans::lang_trans_between_hz936(CONST_STRING_CFG_NAME).c_str(), 270);
for (size_t i = 1; i < schemes.size(); ++i) // 0 is default scheme
{
dlg_base::list_insert_item(lstwnd, local_trans::a2u(schemes[i].c_str(), CP_UTF8).c_str());
}
}
void dlg_cfg_mgr::on_paint(HDC hdc)
{
}
void dlg_cfg_mgr::on_sel_changed(int sel)
{
std::wstring name(dlg_base::list_get_text(get_item(IDC_LIST1), sel));
gb::sane_config_schm* schm = cfg_->get_scheme(local_trans::u2a(name.c_str(), CP_UTF8).c_str());
name = L"";
if (schm)
{
std::string key(""), val("");
int cnt = 1;
if (schm->first_config(key, val))
{
do
{
std::string v(gb::sane_config_schm::sane_option_value_2_string(&val[0], val.length(), (SANE_Value_Type)cfg_->option_value_type(key.c_str())));
name += std::to_wstring(cnt++) + L" - " + local_trans::a2u(cfg_->option_title(key.c_str()).c_str(), CP_UTF8) + L"\r\n ";
if (cfg_->option_value_type(key.c_str()) == SANE_TYPE_STRING)
v = local_trans::u2a(local_trans::lang_trans_between_hz936(local_trans::a2u(v.c_str(), CP_UTF8).c_str()).c_str(), CP_UTF8);
name += local_trans::a2u(v.c_str(), CP_UTF8) + L"\r\n\r\n";
} while (schm->next_config(key, val));
}
schm->release();
}
dlg_base::set_item_text(IDC_EDIT1, name.c_str());
}
void dlg_cfg_mgr::on_del_selected(void)
{
std::vector<int> sels;
HWND lwnd = get_item(IDC_LIST1);
bool changed = false;
dlg_base::list_get_selected_items(lwnd, sels);
for(int i = sels.size() - 1; i >= 0; i--)
{
std::string name(local_trans::u2a(dlg_base::list_get_text(lwnd, sels[i]).c_str(), CP_UTF8));
if (cfg_->remove_scheme(name.c_str()))
{
changed = true;
ListView_DeleteItem(lwnd, sels[i]);
}
}
}
void dlg_cfg_mgr::on_del_all(void)
{
cfg_->remove_all_schemes();
}

35
sane/DlgCfgMgr.h Normal file
View File

@ -0,0 +1,35 @@
#pragma once
#include <Windows.h>
#include <string>
#include "DlgPage.h"
// CDlgIndicator 对话框
namespace gb
{
class scanner_cfg;
}
class dlg_cfg_mgr: public dlg_base
{
gb::scanner_cfg* cfg_;
std::wstring label_;
BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override;
void handle_command(WORD code, WORD id, HANDLE ctrl);
void handle_notify(UINT id, LPNMHDR pnhdr);
void layout(void);
void on_init_dlg(void);
void on_paint(HDC hdc);
void on_sel_changed(int sel);
void on_del_selected(void);
void on_del_all(void);
public:
dlg_cfg_mgr(gb::scanner_cfg* cfg, HWND parent);
~dlg_cfg_mgr();
public:
};

View File

@ -5,6 +5,7 @@
#include "resource.h"
#include "mem_dc.h"
#include "scanned_img.h"
#define MAX_KEY_POINTS 4 // not include (0, 0) and (255, 255)
@ -94,35 +95,35 @@ namespace calc
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// dlg_gamma
dlg_gamma::dlg_gamma(HWND parent, bool color) : dlg_base(parent, IDD_GAMMA), exit_code_(0), is_color_(color), bkgnd_(NULL)
dlg_gamma::dlg_gamma(HWND parent, bool color) : dlg_base(parent, IDD_GAMMA), is_color_(color), bkgnd_(NULL)
, show_all_(false)
{
std::wstring title(dlg_base::language_from_hz936(L"\u81EA\u5B9A\u4E49\u8272\u8C03\u66F2\u7EBF"));
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_CUSTOM_TONE));
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");
title = local_trans::lang_trans_between_hz936(CONST_STRING_TONE_SCHEME);
set_item_text(IDC_STATIC_SCHEME, title.c_str());
title = dlg_base::language_from_hz936(L"\u989C\u8272\u901A\u9053");
title = local_trans::lang_trans_between_hz936(CONST_STRING_COLOR_CHANNEL);
set_item_text(IDC_STATIC_COLOR, title.c_str());
title = dlg_base::language_from_hz936(L"\u521D\u59CB\u5316");
title = local_trans::lang_trans_between_hz936(CONST_STRING_INITIALIZE);
set_item_text(IDC_BUTTON_RESET, title.c_str());
title = dlg_base::language_from_hz936(L"\u8F93\u5165");
title = local_trans::lang_trans_between_hz936(CONST_STRING_INPUT);
set_item_text(IDC_STATIC_INPUT, title.c_str());
title = dlg_base::language_from_hz936(L"\u8F93\u51FA");
title = local_trans::lang_trans_between_hz936(CONST_STRING_OUTPUT);
set_item_text(IDC_STATIC_OUTPUT, title.c_str());
title = dlg_base::language_from_hz936(L"\u53D6\u6D88");
title = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
set_item_text(IDCANCEL, title.c_str());
title = dlg_base::language_from_hz936(L"\u786E\u5B9A");
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
layout();
@ -184,7 +185,7 @@ void dlg_gamma::handle_command(WORD code, WORD id, HANDLE ctrl)
}
else
{
exit_code_ = id;
quit_modal(id);
}
}
else if (code == EN_CHANGE)
@ -490,15 +491,15 @@ void dlg_gamma::on_init_dlg(void)
init_curve(&green_, RGB(0, 255, 0));
init_curve(&blue_, RGB(0, 0, 255));
std::wstring lang(dlg_base::language_from_hz936(L"\u81ea\u5b9a\u4e49"));
std::wstring lang(local_trans::lang_trans_between_hz936(CONST_STRING_CUSTOM));
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u8d1f\u7247") + L" (RGB)";
lang = local_trans::lang_trans_between_hz936(CONST_STRING_NEG_PHOTO) + L" (RGB)";
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u5f69\u8272\u8d1f\u7247") + L" (RGB)";
lang = local_trans::lang_trans_between_hz936(CONST_STRING_COLOR_NEG_PHOTO) + L" (RGB)";
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u8f83\u6697") + L" (RGB)";
lang = local_trans::lang_trans_between_hz936(CONST_STRING_DARKER) + L" (RGB)";
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u8f83\u4eae") + L" (RGB)";
lang = local_trans::lang_trans_between_hz936(CONST_STRING_BRIGHTER) + L" (RGB)";
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
SendMessage(combo, CB_SETCURSEL, 0, 0);
@ -506,16 +507,16 @@ void dlg_gamma::on_init_dlg(void)
if (is_color_)
{
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"RGB");
lang = dlg_base::language_from_hz936(L"\u7ea2");
lang = local_trans::lang_trans_between_hz936(CONST_STRING_RED);
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u7eff");
lang = local_trans::lang_trans_between_hz936(CONST_STRING_GREEN);
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
lang = dlg_base::language_from_hz936(L"\u84dd");
lang = local_trans::lang_trans_between_hz936(CONST_STRING_BLUE);
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
}
else
{
lang = dlg_base::language_from_hz936(L"\u7070");
lang = local_trans::lang_trans_between_hz936(CONST_STRING_GRAY);
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)&lang[0]);
}
SendMessage(combo, CB_SETCURSEL, 0, 0);
@ -702,43 +703,6 @@ void dlg_gamma::on_combo_sel_changed(int id, int sel)
}
}
int dlg_gamma::do_modal(HWND parent)
{
BOOL enable_parent = FALSE,
got = TRUE;
MSG msg = { 0 };
if (IsWindow(parent) && parent != GetDesktopWindow())
{
EnableWindow(parent, FALSE);
enable_parent = TRUE;
}
ShowWindow(hwnd(), SW_SHOW);
while ((got = GetMessage(&msg, NULL, 0, 0)))
{
if ((DWORD)got == -1)
break;
//if (enable_parent && msg.hwnd == parent &&
// msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST &&
// msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
// continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
if (exit_code_ == IDOK || exit_code_ == IDCANCEL)
break;
}
ShowWindow(hwnd(), SW_HIDE);
if (enable_parent)
{
EnableWindow(parent, TRUE);
}
return exit_code_;
}
void dlg_gamma::get_gamma(SANE_Gamma* gamma)
{
gamma->apply_to_back = SANE_FALSE;
@ -812,7 +776,7 @@ void dlg_gamma::set_gamma(const SANE_Gamma* gamma, bool gray)
}
else
{
text = dlg_base::language_from_hz936(L"\u7070");
text = local_trans::lang_trans_between_hz936(CONST_STRING_GRAY);
SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]);
}
@ -847,11 +811,11 @@ 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");
text = dlg_base::language_from_hz936(L"\u7ea2");
text = local_trans::lang_trans_between_hz936(CONST_STRING_RED);
SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]);
text = dlg_base::language_from_hz936(L"\u7eff");
text = local_trans::lang_trans_between_hz936(CONST_STRING_GREEN);
SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]);
text = dlg_base::language_from_hz936(L"\u84dd");
text = local_trans::lang_trans_between_hz936(CONST_STRING_BLUE);
SendMessageW(get_item(IDC_CHANNEL), CB_ADDSTRING, 0, (LPARAM)&text[0]);
}
cur_ = &rgb_gray_;

View File

@ -9,7 +9,6 @@
class dlg_gamma: public dlg_base
{
int exit_code_;
bool is_color_;
bool show_all_;
RECT paint_area_;
@ -54,7 +53,6 @@ public:
~dlg_gamma();
public:
int do_modal(HWND parent);
void get_gamma(SANE_Gamma* gamma);
void set_gamma(const SANE_Gamma* gamma, bool gray);
};

View File

@ -20,17 +20,17 @@ dlg_indicator::dlg_indicator(HWND parent) : dlg_base(parent, IDD_INDICATOR)
if (!dlg_base::is_language_pack_default_code_page())
{
std::wstring text(dlg_base::language_from_hz936(L"\u6B63\u5728\u626B\u63CF\u2026\u2026"));
std::wstring text(local_trans::lang_trans_between_hz936(CONST_STRING_SCANNING));
SetWindowTextW(hwnd(), text.c_str());
text = dlg_base::language_from_hz936(L"\u7EB8\u5F20");
text = local_trans::lang_trans_between_hz936(CONST_STRING_PAPER);
set_item_text(IDC_STATIC_PAPER, text.c_str());
text = dlg_base::language_from_hz936(L"\u56FE\u7247");
text = local_trans::lang_trans_between_hz936(CONST_STRING_IMAGE);
set_item_text(IDC_STATIC_IMAGE, text.c_str());
text = dlg_base::language_from_hz936(L"\u53D6\u6D88");
text = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
set_item_text(IDCANCEL, text.c_str());
int paper = get_width_diff_as_text_length(IDC_STATIC_PAPER),
@ -122,20 +122,20 @@ BOOL dlg_indicator::handle_message(UINT msg, WPARAM wp, LPARAM lp)
else
{
std::string* str = (std::string*)wp;
std::wstring txt(dlg_base::language_from_hz936(L"\u603b\u8ba1\u626b\u63cf\u56fe\u7247"));
std::wstring txt(local_trans::lang_trans_between_hz936(CONST_STRING_TOTAL_SCANNED));
txt += L": " + std::to_wstring(images_);
SetDlgItemTextW(hwnd_, IDC_STATIC_ERR, txt.c_str());
delete str;
SetTimer(hwnd_, 1, 3000, NULL);
}
SetDlgItemTextW(hwnd_, IDCANCEL, dlg_base::language_from_hz936(L"\u5173\u95ed").c_str());
SetDlgItemTextW(hwnd_, IDCANCEL, local_trans::lang_trans_between_hz936(CONST_STRING_CLOSE).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_, dlg_base::language_from_hz936(L"\u626b\u63cf\u7ed3\u675f").c_str());
SetWindowTextW(hwnd_, local_trans::lang_trans_between_hz936(CONST_STRING_SCAN_OVER).c_str());
UpdateWindow(hwnd_);
break;
case WM_TIMER:
@ -204,17 +204,17 @@ 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"));
std::wstring text(local_trans::lang_trans_between_hz936(CONST_STRING_CHOOSE_DEVICE));
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;
text = dlg_base::language_from_hz936(L"\u8BBE\u5907\u540D\u79F0");
text = local_trans::lang_trans_between_hz936(CONST_STRING_DEVICE_NAME);
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
text = dlg_base::language_from_hz936(L"\u5E8F\u5217\u53F7");
text = local_trans::lang_trans_between_hz936(CONST_STRING_SERIAL_NUM);
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
@ -243,10 +243,10 @@ dlg_choose_dev::dlg_choose_dev(HWND parent, const std::map<std::string, std::str
}
}
text = dlg_base::language_from_hz936(L"\u53D6\u6D88");
text = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
set_item_text(IDCANCEL, text.c_str());
text = dlg_base::language_from_hz936(L"\u786E\u5B9A");
text = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, text.c_str());
}
dlg_choose_dev::~dlg_choose_dev()

108
sane/DlgInput.cpp Normal file
View File

@ -0,0 +1,108 @@
// DlgIndicator.cpp: 实现文件
//
#include "DlgInput.h"
#include "resource.h"
#include "scanned_img.h" // for local_trans
#include "mem_dc.h"
#include "gb_json.h"
// CDlgIndicator 对话框
dlg_input::dlg_input(HWND parent, const wchar_t* init_val) : dlg_base(parent, IDD_INPUT), val_(init_val ? init_val : L"")
{
create();
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_INPUT_VAL));
SetWindowTextW(hwnd(), title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
set_item_text(IDCANCEL, title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
}
dlg_input::~dlg_input()
{
}
BOOL dlg_input::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;
default:
ret = FALSE;
}
return ret;
}
void dlg_input::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)
{
if (id == IDOK || id == IDCANCEL)
{
if (id == IDOK)
{
std::wstring input(dlg_base::get_item_text(IDC_EDIT1));
if (input.empty())
{
MessageBoxW(hwnd(), local_trans::lang_trans_between_hz936(CONST_STRING_RE_INPUT).c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_NO_INPUT).c_str(), MB_OK | MB_ICONSTOP);
SetFocus(get_item(IDC_EDIT1));
return;
}
for (auto& v : no_repeats_)
{
if (v == input)
{
input += L" " + local_trans::lang_trans_between_hz936(CONST_STRING_ALREADY_EXISTS);
::MessageBoxW(hwnd(), input.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_RE_INPUT).c_str(), MB_OK | MB_ICONINFORMATION);
SetFocus(get_item(IDC_EDIT1));
return;
}
}
val_ = std::move(input);
}
quit_modal(id);
}
}
}
else if (IS_EDIT(cls))
{
//if (code == EN_SETFOCUS)
// label_edit_ = (HWND)ctrl;
}
}
void dlg_input::on_init_dlg(void)
{
dlg_base::set_item_text(IDC_EDIT1, val_.c_str());
}
void dlg_input::set_no_repeats(const std::vector<std::wstring>& vals)
{
no_repeats_ = vals;
}
std::wstring dlg_input::get_value(void)
{
return val_;
}

28
sane/DlgInput.h Normal file
View File

@ -0,0 +1,28 @@
#pragma once
#include <Windows.h>
#include <string>
#include <vector>
#include "DlgPage.h"
// CDlgIndicator 对话框
class dlg_input: public dlg_base
{
std::vector<std::wstring> no_repeats_;
std::wstring val_;
BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override;
void handle_command(WORD code, WORD id, HANDLE ctrl);
void on_init_dlg(void);
public:
dlg_input(HWND parent, const wchar_t* init_val);
~dlg_input();
public:
void set_no_repeats(const std::vector<std::wstring>& vals);
std::wstring get_value(void);
};

View File

@ -16,13 +16,6 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
#define FLOAT_FORMAT L"%.2f"
#define IS_STR_EQUAL(s1, s2) (wcscmp(s1, s2) == 0)
#define IS_EDIT(cls) IS_STR_EQUAL(cls, WC_EDITW)
#define IS_COMBOX(cls) IS_STR_EQUAL(cls, WC_COMBOBOXW)
#define IS_BUTTON(cls) IS_STR_EQUAL(cls, WC_BUTTONW)
#define IS_TRACKBAR(cls) IS_STR_EQUAL(cls, TRACKBAR_CLASSW)
#define IS_UPDOWN_ARROW(cls) IS_STR_EQUAL(cls, UPDOWN_CLASSW)
static IMPLEMENT_OPTION_STRING_COMPARE(is_sane_opt);
@ -140,13 +133,6 @@ 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);
@ -164,6 +150,91 @@ bool dlg_base::is_language_pack_default_code_page(void)
{
return lang_get_cur_code_page() == DEFAULT_CODE_PAGE;
}
std::wstring dlg_base::get_menu_text(HMENU menu, int ind)
{
MENUITEMINFOW mi = { 0 };
wchar_t text[128] = { 0 };
mi.cbSize = sizeof(mi);
mi.fMask = mi.fType = MIIM_STRING; // MFT_STRING;
mi.dwTypeData = text;
mi.cch = _countof(text) - 1;
GetMenuItemInfoW(menu, ind, MF_BYPOSITION, &mi);
return text;
}
int dlg_base::list_insert_column(HWND list_wnd, const wchar_t* text, int cx, int ind)
{
LVCOLUMNW col = { 0 };
if (ind == -1)
ind = dlg_base::list_get_column_count(list_wnd);
col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
col.pszText = (LPWSTR)text;
col.iSubItem = 0;
col.cx = cx;
return ListView_InsertColumn(list_wnd, ind, &col);
}
int dlg_base::list_insert_item(HWND list_wnd, const wchar_t* text, int ind)
{
LV_ITEMW item = { 0 };
if (ind == -1)
ind = dlg_base::list_get_item_count(list_wnd);
item.mask = LVIF_TEXT;
item.pszText = (PWSTR)text;
item.iItem = ind;
return ListView_InsertItem(list_wnd, &item);
}
int dlg_base::list_get_item_count(HWND list_wnd)
{
return ListView_GetItemCount(list_wnd);
}
int dlg_base::list_get_column_count(HWND list_wnd)
{
return ListView_GetItemCount((HWND)ListView_GetHeader(list_wnd));
}
std::wstring dlg_base::list_get_text(HWND list_wnd, int ind, int sub)
{
LV_ITEMW item = { 0 };
wchar_t text[128] = { 0 };
item.mask = LVIF_TEXT;
item.pszText = (PWSTR)text;
item.iItem = ind;
item.iSubItem = sub;
item.cchTextMax = _countof(text) - 1;
ListView_GetItem(list_wnd, &item);
return text;
}
void dlg_base::list_get_selected_items(HWND list_wnd, std::vector<int>& sels)
{
LV_ITEMW item = { 0 };
item.mask = LVIF_STATE;
for (int i = 0; i < dlg_base::list_get_item_count(list_wnd); ++i)
{
item.iItem = i;
item.stateMask = LVIS_SELECTED;
ListView_GetItem(list_wnd, &item);
if (item.state & LVIS_SELECTED)
sels.push_back(i);
}
}
int dlg_base::list_set_item_text(HWND list_wnd, int item, int sub_item, const wchar_t* text)
{
LV_ITEMW lvi = { 0 };
lvi.iItem = item;
lvi.iSubItem = sub_item;
lvi.pszText = (LPWSTR)text;
lvi.mask = LVIF_TEXT;
return ListView_SetItem(list_wnd, &lvi) ? 0 : 1;
}
BOOL dlg_base::handle_message(UINT msg, WPARAM wp, LPARAM lp)
{
@ -183,11 +254,11 @@ void dlg_base::notify_ui_event(int ev)
if (ui_event_notify_)
ui_event_notify_(ev, this, ui_notify_param_);
}
gb::sane_config_schm* dlg_base::get_config(void)
gb::sane_config_schm* dlg_base::get_config(bool* create)
{
gb::sane_config_schm* cfg = NULL;
SendMessage(parent_, WM_GET_CONFIG_OBJ, 0, (LPARAM)&cfg);
SendMessage(parent_, WM_GET_CONFIG_OBJ, (WPARAM)create, (LPARAM)&cfg);
return cfg;
}
@ -264,6 +335,49 @@ void dlg_base::show(bool visible, bool hold)
}
}
}
int dlg_base::do_modal(HWND parent)
{
BOOL enable_parent = FALSE,
got = TRUE;
MSG msg = { 0 };
modal_exit_ = 0;
if (IsWindow(parent) && parent != GetDesktopWindow())
{
EnableWindow(parent, FALSE);
enable_parent = TRUE;
}
ShowWindow(hwnd(), SW_SHOW);
while ((got = GetMessage(&msg, NULL, 0, 0)))
{
if ((DWORD)got == -1)
break;
//if (enable_parent && msg.hwnd == parent &&
// msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST &&
// msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
// continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
if (modal_exit_)
break;
}
ShowWindow(hwnd(), SW_HIDE);
if (enable_parent)
{
EnableWindow(parent, TRUE);
}
return modal_exit_;
}
void dlg_base::quit_modal(int non_zero_code)
{
// assert ( non_zero_code );
modal_exit_ = non_zero_code;
}
void dlg_base::enable(bool enable)
{
EnableWindow(hwnd_, enable);
@ -299,13 +413,16 @@ HFONT dlg_base::get_font(void)
{
return (HFONT)SendMessage(hwnd_, WM_GETFONT, 0, 0);
}
int dlg_base::get_string_width(const wchar_t* str)
int dlg_base::get_string_width(const wchar_t* str, HWND wnd)
{
HDC hdc = GetWindowDC(hwnd_);
if (!wnd)
wnd = hwnd_;
HDC hdc = GetWindowDC(wnd);
SIZE size = { 0 };
GetTextExtentPointW(hdc, str, lstrlenW(str), &size);
ReleaseDC(hwnd_, hdc);
ReleaseDC(wnd, hdc);
return size.cx;
}
@ -351,6 +468,27 @@ bool dlg_base::set_item_text(UINT id, const wchar_t* text)
{
return SetWindowTextW(GetDlgItem(hwnd_, id), text) == TRUE;
}
int dlg_base::set_item_fit_to_text(UINT id)
{
HWND wnd = get_item(id);
std::wstring text(get_item_text(id));
RECT r = { 0 };
int w = get_string_width(text.c_str(), wnd);
get_item_rect(id, &r, false);
if (w > RECT_W(r) || w <= RECT_W(r) / 2)
{
if (w > RECT_W(r))
w -= RECT_W(r);
else
w -= RECT_W(r) / 2;
expand_item(id, w, 0);
}
else
w = 0;
return w;
}
void dlg_base::show_scroll_bar(int bar, bool show)
{
DWORD style = GetWindowLong(hwnd(), GWL_STYLE);
@ -863,7 +1001,8 @@ void dlg_page::handle_command(WORD code, WORD id, HANDLE ctrl)
{
SANE_Fixed val = SANE_FIX(dlg.x_in_mm());
SANE_Int after = 0;
gb::sane_config_schm* cfg = get_config();
bool created = true;
gb::sane_config_schm* cfg = get_config(&created);
sane_.sane_control_option_api(dev_, id_custom_left_, SANE_ACTION_SET_VALUE, &val, &after);
if (cfg)
@ -882,7 +1021,10 @@ void dlg_page::handle_command(WORD code, WORD id, HANDLE ctrl)
val = SANE_FIX(dlg.y_in_mm() + dlg.h_in_mm());
sane_.sane_control_option_api(dev_, id_custom_bottom_, SANE_ACTION_SET_VALUE, &val, &after);
if (cfg)
{
cfg->config_changed(id_custom_bottom_, (char*)&val, sizeof(val));
cfg->release();
}
}
return;
}
@ -891,6 +1033,7 @@ void dlg_page::handle_command(WORD code, WORD id, HANDLE ctrl)
dlg_gamma dlg(parent_, true);
SANE_Gamma gamma = { 0 };
unsigned int len = sizeof(gamma);
bool created = true;
sane_.sane_io_control_api(dev_, IO_CTRL_CODE_GET_CUSTOM_GAMMA, &gamma, &len);
dlg.set_gamma(&gamma, len < 2);
@ -900,9 +1043,12 @@ void dlg_page::handle_command(WORD code, WORD id, HANDLE ctrl)
dlg.get_gamma(&gamma);
sane_.sane_io_control_api(dev_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &gamma, &len);
gb::sane_config_schm* cfg = get_config();
gb::sane_config_schm* cfg = get_config(&created);
if (cfg)
{
cfg->config_changed(id_custom_gamma_, (char*)&gamma, sizeof(gamma), true);
cfg->release();
}
}
return;
@ -1149,7 +1295,8 @@ void dlg_page::control_action(HWND wnd)
SANE_Int after = 0;
std::string to_v(hg_sane_middleware::option_value_2_string(type, val));
SANE_Status statu = sane_.sane_control_option_api(dev_, id - dlg_page::dyn_id_base, SANE_ACTION_SET_VALUE, val, &after);
gb::sane_config_schm* cfg = get_config();
bool created = true;
gb::sane_config_schm* cfg = get_config(&created);
done_ = false;
if (cfg)
{
@ -1181,14 +1328,15 @@ void dlg_page::control_action(HWND wnd)
else
cfg->config_changed(id - dlg_page::dyn_id_base, (char*)val, len);
}
cfg->release();
}
if (statu == SANE_STATUS_INVAL)
{
std::wstring attr(dlg_base::language_from_hz936(L"\u6B64\u8BBE\u5907\u4E0D\u652F\u6301\u5C06") + L" \""
std::wstring attr(local_trans::lang_trans_between_hz936(CONST_STRING_NOT_SUPPORT_SET) + 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": "),
+ L"\" " + local_trans::lang_trans_between_hz936(CONST_STRING_SET_TO_BE) + L": "),
attr_v(local_trans::a2u(to_v.c_str(), CP_UTF8));
MessageBoxW(hwnd(), (attr + attr_v).c_str(), dlg_base::language_from_hz936(L"\u53C2\u6570\u9519\u8BEF").c_str(), MB_OK);
MessageBoxW(hwnd(), (attr + attr_v).c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_PARAMETER_ERROR).c_str(), MB_OK);
set_ctrl_value(wnd, type, val, true);
}
else
@ -1196,11 +1344,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(dlg_base::language_from_hz936(L"\u539F\u53C2\u6570") + L" \""
std::wstring attr(local_trans::lang_trans_between_hz936(CONST_STRING_PARAMETER_ORIGIN) + 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")),
+ local_trans::lang_trans_between_hz936(CONST_STRING_PARAMETER_INEXACT)),
attr_v(local_trans::a2u(tov.c_str(), CP_UTF8));
MessageBoxW(hwnd(), (attr + attr_v).c_str(), dlg_base::language_from_hz936(L"\u53C2\u6570\u8C03\u6574").c_str(), MB_OK);
MessageBoxW(hwnd(), (attr + attr_v).c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_PARAMETER_ADJUSTED).c_str(), MB_OK);
}
set_ctrl_value(wnd, type, val, false, !(after || statu));
}
@ -1389,7 +1537,7 @@ 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"));
std::wstring t(local_trans::lang_trans_between_hz936(CONST_STRING_SET_AREA));
id_custom_area_ = sn;
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);
@ -1418,7 +1566,7 @@ 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"));
std::wstring t(local_trans::lang_trans_between_hz936(CONST_STRING_SET_TONE));
id_custom_gamma_ = sn;
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);

View File

@ -6,17 +6,26 @@
#include <vector>
#include <sane/sane_ex.h>
#include <sane/sane_option_definitions.h>
#include "const_str.h"
// CDlgIndicator 对话框
#define RECT_W(r) (r.right - r.left)
#define RECT_H(r) (r.bottom - r.top)
#define FLOAT_FORMAT L"%.2f"
#define IS_STR_EQUAL(s1, s2) (wcscmp(s1, s2) == 0)
#define IS_EDIT(cls) IS_STR_EQUAL(cls, WC_EDITW)
#define IS_COMBOX(cls) IS_STR_EQUAL(cls, WC_COMBOBOXW)
#define IS_BUTTON(cls) IS_STR_EQUAL(cls, WC_BUTTONW)
#define IS_TRACKBAR(cls) IS_STR_EQUAL(cls, TRACKBAR_CLASSW)
#define IS_UPDOWN_ARROW(cls) IS_STR_EQUAL(cls, UPDOWN_CLASSW)
#define RECT_W(r) (r.right - r.left)
#define RECT_H(r) (r.bottom - r.top)
#define WM_SCAN_WORKING WM_USER + 301 // WPARAM: unused; LPARAM: unsed
#define WM_USB_PACKET_RECEIVED WM_USER + 302
#define WM_IMAGE_RECEIVED WM_USER + 303
#define WM_SCAN_FINISHED WM_USER + 304 // WPARAM: std::string* msg; LPARAM: boo err
#define WM_REFRESH_OPTION WM_USER + 311 // WPARAM: source option SN, LPARAM: unused now
#define WM_GET_CONFIG_OBJ WM_USER + 312 // WPARAM: not use, LPARAM: to receive the gb::sane_config* object
#define WM_GET_CONFIG_OBJ WM_USER + 312 // WPARAM: bool*, [in]create new if NULL; [out]created, LPARAM: to receive the gb::sane_config* object
extern HMODULE g_my_inst;
@ -27,6 +36,8 @@ namespace gb
class dlg_base
{
int modal_exit_; // set non-ZERO code to exit modal dialog
protected:
HWND hwnd_;
HWND parent_;
@ -41,7 +52,7 @@ protected:
virtual void on_font_changed(void);
void create(void);
void notify_ui_event(int ev);
gb::sane_config_schm* get_config(void);
gb::sane_config_schm* get_config(bool* create);
public:
dlg_base(HWND parent, UINT idd);
@ -52,27 +63,38 @@ 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);
static std::wstring get_menu_text(HMENU menu, int ind);
static int list_insert_column(HWND list_wnd, const wchar_t* text, int cx = 20, int ind = -1);
static int list_insert_item(HWND list_wnd, const wchar_t* text, int ind = -1);
static int list_get_item_count(HWND list_wnd);
static int list_get_column_count(HWND list_wnd);
static std::wstring list_get_text(HWND list_wnd, int ind, int sub = 0);
static void list_get_selected_items(HWND list_wnd, std::vector<int>& sels);
static int list_set_item_text(HWND list_wnd, int item, int sub_item, const wchar_t* text);
public:
void set_ui_event_notify(void(__stdcall* notify)(int, void*, void*), void* param);
HWND hwnd(void);
void show(bool visible, bool hold = false);
int do_modal(HWND parent);
void quit_modal(int non_zero_code);
void enable(bool enable);
void screen_2_client(LPRECT r);
void client_2_screen(LPRECT r);
HWND get_item(UINT id);
BOOL set_font(HFONT font);
HFONT get_font(void);
int get_string_width(const wchar_t* str);
int get_string_width(const wchar_t* str, HWND wnd = NULL);
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);
int set_item_fit_to_text(UINT id); // return difference
void show_scroll_bar(int bar = SB_VERT, bool show = true);
bool track_mouse_hover(void);
};

View File

@ -10,7 +10,10 @@
#include "../../sdk/include/lang/app_language.h"
// CDlgIndicator 对话框
#include "DlgCfgMgr.h"
#include "DlgInput.h"
#define MENU_CMD_0 ((unsigned short)0x8888)
static IMPLEMENT_OPTION_STRING_COMPARE(cmp_sane_opt);
@ -19,10 +22,13 @@ 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));
std::wstring setting(local_trans::lang_trans_between_hz936(CONST_STRING_SETTING));
create();
SetWindowTextW(hwnd(), (std::wstring(name) + L" " + setting).c_str());
cfg_menu_ = CreatePopupMenu();
InsertMenuW(cfg_menu_, 0, MF_BYPOSITION, MENU_CMD_0, local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_CUR_CFG_AS).c_str());
InsertMenuA(cfg_menu_, 1, MF_BYPOSITION | MF_SEPARATOR, MENU_CMD_0 + 1, "");
}
dlg_setting::~dlg_setting()
{
@ -39,7 +45,15 @@ dlg_setting::~dlg_setting()
}
DestroyWindow(tab_);
}
cfg_->end_setting(false);
gb::sane_config_schm* schm = cfg_->get_scheme();
if (schm)
{
schm->end_setting(false);
schm->release();
}
cfg_->save(local_trans::u2a(cfg_file_.c_str()).c_str());
DestroyMenu(cfg_menu_);
}
BOOL dlg_setting::handle_message(UINT msg, WPARAM wp, LPARAM lp)
@ -62,7 +76,19 @@ BOOL dlg_setting::handle_message(UINT msg, WPARAM wp, LPARAM lp)
refresh_controls((int)wp);
break;
case WM_GET_CONFIG_OBJ:
*((gb::sane_config_schm**)lp) = cfg_;
{
gb::sane_config_schm* schm = cfg_->get_scheme();
if (wp)
{
if (!schm && *(bool*)wp)
{
schm = cfg_->create_empty_scheme(true);
}
else
*(bool*)wp = false;
}
*((gb::sane_config_schm**)lp) = schm;
}
break;
default:
ret = FALSE;
@ -73,11 +99,70 @@ BOOL dlg_setting::handle_message(UINT msg, WPARAM wp, LPARAM lp)
}
void dlg_setting::handle_command(WORD code, WORD id, HANDLE ctrl)
{
if (id == IDOK)
if (ctrl == NULL)
{
if (cfg_)
cfg_->save_to(NULL);
// menu command ...
if (id == MENU_CMD_0)
{
// save current scheme as ...
gb::sane_config_schm* s = cfg_->get_scheme();
if (!s)
s = cfg_->copy_scheme(nullptr);
if (s)
{
std::vector<std::string> all;
std::vector<std::wstring> allw;
std::wstring cur(local_trans::a2u(s->get_scheme_name().c_str(), CP_UTF8));
dlg_input dlg(hwnd(), cur.c_str());
cfg_->get_all_schemes(all);
for (auto& v : all)
allw.push_back(local_trans::a2u(v.c_str(), CP_UTF8));
dlg.set_no_repeats(allw);
if (dlg.do_modal(hwnd()) == IDOK)
{
std::string name(local_trans::u2a(dlg.get_value().c_str(), CP_UTF8));
gb::sane_config_schm* n = s->copy();
if (cfg_->add_scheme(n, name.c_str()))
{
cfg_->select_scheme(name.c_str());
}
n->release();
}
s->release();
}
}
else if(id > MENU_CMD_0 + 1)
{
// config scheme changed ...
std::string schm(local_trans::u2a(dlg_base::get_menu_text(cfg_menu_, id - MENU_CMD_0).c_str(), CP_UTF8));
if (cfg_->get_current_scheme_name() != schm)
{
gb::sane_config_schm* s = cfg_->get_scheme();
if (s)
{
s->end_setting(true);
s->release();
}
if (cfg_->select_scheme(schm.c_str()))
{
s = cfg_->get_scheme();
apply_scheme_(s, apply_param_);
if (s)
{
s->release();
}
refresh_controls(-1);
// cfg_->save();
}
}
}
}
else if (id == IDOK)
{
notify_over();
}
else if (id == IDC_BUTTON_HELP)
@ -92,9 +177,13 @@ void dlg_setting::handle_command(WORD code, WORD id, HANDLE ctrl)
refresh_controls(id_restore_);
if (cfg_)
{
cfg_->begin_setting(true);
cfg_->end_setting(false);
cfg_->begin_setting();
gb::sane_config_schm* schm = cfg_->get_scheme();
if (schm)
{
schm->end_setting(true);
schm->release();
}
cfg_->select_scheme(nullptr);
}
}
else if (id == IDC_BUTTON_SCAN)
@ -102,6 +191,33 @@ void dlg_setting::handle_command(WORD code, WORD id, HANDLE ctrl)
// enable(false);
notify_ui_event(SANE_EVENT_UI_SCAN_COMMAND);
}
else if (id == IDC_BUTTON_CONFIG_MGR)
{
dlg_cfg_mgr dlg(cfg_, hwnd());
dlg.do_modal(hwnd());
}
else if (id == IDC_BUTTON_CONFIG_MENU)
{
HMENU sub = cfg_menu_; // GetSubMenu(cfg_menu_, 0);
int ind = 2;
std::vector<std::string> schemes;
while (DeleteMenu(sub, 2, MF_BYPOSITION));
cfg_->get_all_schemes(schemes);
for (auto& v : schemes)
{
UINT flag = MF_BYPOSITION;
if (v == cfg_->get_current_scheme_name())
flag |= MF_CHECKED;
InsertMenuW(sub, ind, flag, MENU_CMD_0 + ind, local_trans::a2u(v.c_str(), CP_UTF8).c_str());
ind++;
}
RECT r = { 0 };
GetWindowRect(get_item(IDC_BUTTON_CONFIG_MENU), &r);
TrackPopupMenu(cfg_menu_, TPM_LEFTALIGN | TPM_BOTTOMALIGN, r.left, r.top, 0, hwnd(), NULL);
}
}
void dlg_setting::notify_over(void)
{
@ -197,35 +313,32 @@ void dlg_setting::on_init_dialog(void)
page->set_view_size(size);
}
GetWindowRect(get_item(IDC_BUTTON_SCAN), &r);
OffsetRect(&r, 0, size.cy);
screen_2_client(&r);
MoveWindow(get_item(IDC_BUTTON_SCAN), r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE);
offset_item(IDC_BUTTON_SCAN, 0, size.cy);
offset_item(IDC_BUTTON_CONFIG_MGR, size.cx - RECT_W(rme), size.cy);
offset_item(IDC_BUTTON_CONFIG_MENU, size.cx - RECT_W(rme), size.cy);
offset_item(IDC_BUTTON_HELP, size.cx - RECT_W(rme), size.cy);
offset_item(IDC_BUTTON_RESTORE, size.cx - RECT_W(rme), size.cy);
offset_item(IDOK, size.cx - RECT_W(rme), size.cy);
GetWindowRect(get_item(IDC_BUTTON_HELP), &r);
OffsetRect(&r, size.cx - (rme.right - rme.left), size.cy);
screen_2_client(&r);
MoveWindow(get_item(IDC_BUTTON_HELP), r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE);
GetWindowRect(get_item(IDC_BUTTON_RESTORE), &r);
OffsetRect(&r, size.cx - (rme.right - rme.left), size.cy);
screen_2_client(&r);
MoveWindow(get_item(IDC_BUTTON_RESTORE), r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE);
GetWindowRect(get_item(IDOK), &r);
OffsetRect(&r, size.cx - (rme.right - rme.left), size.cy);
screen_2_client(&r);
MoveWindow(get_item(IDOK), r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE);
ShowWindow(get_item(IDC_BUTTON_CONFIG_MGR), SW_SHOW);
ShowWindow(get_item(IDC_BUTTON_CONFIG_MENU), SW_SHOW);
}
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());
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_CFG_MANAGER));
::SetDlgItemTextW(hwnd(), IDC_BUTTON_CONFIG_MGR, title.c_str());
y = set_item_fit_to_text(IDC_BUTTON_CONFIG_MGR);
if (y)
offset_item(IDC_BUTTON_CONFIG_MGR, -y, 0);
::SetDlgItemTextW(hwnd(), IDC_BUTTON_SCAN, local_trans::lang_trans_between_hz936(CONST_STRING_SCAN).c_str());
::SetDlgItemTextW(hwnd(), IDC_BUTTON_RESTORE, local_trans::lang_trans_between_hz936(CONST_STRING_RESTORE).c_str());
::SetDlgItemTextW(hwnd(), IDC_BUTTON_HELP, local_trans::lang_trans_between_hz936(CONST_STRING_HELP).c_str());
::SetDlgItemTextW(hwnd(), IDOK, local_trans::lang_trans_between_hz936(CONST_STRING_OK).c_str());
}
select_page(0);
@ -363,10 +476,12 @@ void dlg_setting::refresh_controls(int src_sn)
}
}
void dlg_setting::set_config(gb::sane_config_schm* cfg, const wchar_t* file)
void dlg_setting::set_config(gb::scanner_cfg* cfg, const wchar_t* file, void(__stdcall* apply)(gb::sane_config_schm*, void*), void* param)
{
cfg_ = cfg;
cfg_file_ = file;
apply_scheme_ = apply;
apply_param_ = param;
}
HWND dlg_setting::window(void)
{

View File

@ -17,7 +17,7 @@
namespace gb
{
class sane_config_schm;
class scanner_cfg;
}
class dlg_setting : public dlg_base
{
@ -29,8 +29,12 @@ class dlg_setting : public dlg_base
bool err_;
int id_help_;
int id_restore_;
gb::sane_config_schm* cfg_;
std::wstring cfg_file_;
gb::scanner_cfg *cfg_;
std::wstring cfg_file_;
HMENU cfg_menu_;
void(__stdcall* apply_scheme_)(gb::sane_config_schm*, void*);
void* apply_param_;
HWND tab_;
@ -55,7 +59,7 @@ public:
~dlg_setting();
public:
void set_config(gb::sane_config_schm* cfg, const wchar_t* file);
void set_config(gb::scanner_cfg* cfg, const wchar_t* file, void(__stdcall* apply)(gb::sane_config_schm*, void*), void* param);
HWND window(void);
HWND parent(void);
//void show(void);

85
sane/const_str.h Normal file
View File

@ -0,0 +1,85 @@
// For: const string list
//
// Date: 2023-02-07
//
// Format: all strings are defined in unicode
//
#pragma once
#define CONST_STRING_CUSTOM_AREA L"\u81EA\u5B9A\u4E49\u626B\u63CF\u533A\u57DF"
#define CONST_STRING_UNIT L"\u5355\u4F4D"
#define CONST_STRING_UNIT_MM L"\u6BEB\u7C73"
#define CONST_STRING_UNIT_INCH L"\u82F1\u5BF8"
#define CONST_STRING_UNIT_PIXEL L"\u50CF\u7D20"
#define CONST_STRING_AREA_SET L"\u533A\u57DF\u8BBE\u7F6E"
#define CONST_STRING_LEFT L"\u5DE6"
#define CONST_STRING_TOP L"\u4E0A"
#define CONST_STRING_WIDTH L"\u5BBD"
#define CONST_STRING_HEIGHT L"\u9AD8"
#define CONST_STRING_RESTORE_AREA L"\u6062\u590D\u533A\u57DF"
#define CONST_STRING_OK L"\u786E\u5B9A"
#define CONST_STRING_CANCEL L"\u53D6\u6D88"
#define CONST_STRING_MULTIPLE L"\u00d7"
#define CONST_STRING_OPT_PAPER L"\u7EB8\u5F20\u5C3A\u5BF8"
#define CONST_STRING_CFG_MANAGER L"\u914D\u7F6E\u7BA1\u7406"
#define CONST_STRING_CFG_SCHEME L"\u914D\u7F6E\u65B9\u6848"
#define CONST_STRING_DEL_SELECTED L"\u5220\u9664\u9009\u4E2D\u9879"
#define CONST_STRING_DEL_ALL L"\u5168\u90E8\u5220\u9664"
#define CONST_STRING_CFG_CONTENT L"\u914D\u7F6E\u5185\u5BB9"
#define CONST_STRING_CFG_NAME L"\u914D\u7F6E\u540D\u79F0"
#define CONST_STRING_CUSTOM_TONE L"\u81EA\u5B9A\u4E49\u8272\u8C03\u66F2\u7EBF"
#define CONST_STRING_TONE_SCHEME L"\u8272\u8C03\u65B9\u6848"
#define CONST_STRING_COLOR_CHANNEL L"\u989C\u8272\u901A\u9053"
#define CONST_STRING_INITIALIZE L"\u521D\u59CB\u5316"
#define CONST_STRING_INPUT L"\u8F93\u5165"
#define CONST_STRING_OUTPUT L"\u8F93\u51FA"
#define CONST_STRING_CUSTOM L"\u81EA\u5B9A\u4E49"
#define CONST_STRING_NEG_PHOTO L"\u8d1f\u7247"
#define CONST_STRING_COLOR_NEG_PHOTO L"\u5f69\u8272\u8d1f\u7247"
#define CONST_STRING_DARKER L"\u8f83\u6697"
#define CONST_STRING_BRIGHTER L"\u8f83\u4eae"
#define CONST_STRING_RED L"\u7ea2"
#define CONST_STRING_GREEN L"\u7eff"
#define CONST_STRING_BLUE L"\u84dd"
#define CONST_STRING_GRAY L"\u7070"
#define CONST_STRING_SCANNING L"\u6B63\u5728\u626B\u63CF\u2026\u2026"
#define CONST_STRING_PAPER L"\u7EB8\u5F20"
#define CONST_STRING_IMAGE L"\u56FE\u7247"
#define CONST_STRING_TOTAL_SCANNED L"\u603b\u8ba1\u626b\u63cf\u56fe\u7247"
#define CONST_STRING_CLOSE L"\u5173\u95ed"
#define CONST_STRING_SCAN_OVER L"\u626b\u63cf\u7ed3\u675f"
#define CONST_STRING_CHOOSE_DEVICE L"\u8BF7\u9009\u62E9\u8BBE\u5907"
#define CONST_STRING_DEVICE_NAME L"\u8BBE\u5907\u540D\u79F0"
#define CONST_STRING_SERIAL_NUM L"\u5E8F\u5217\u53F7"
#define CONST_STRING_INPUT_VAL L"\u8BF7\u8F93\u5165\u65B0\u503C"
#define CONST_STRING_RE_INPUT L"\u8BF7\u91CD\u65B0\u8F93\u5165"
#define CONST_STRING_NO_INPUT L"\u6CA1\u6709\u8F93\u5165\u5185\u5BB9"
#define CONST_STRING_ALREADY_EXISTS L"\u5DF2\u7ECF\u5B58\u5728"
#define CONST_STRING_NOT_SUPPORT_SET L"\u6B64\u8BBE\u5907\u4E0D\u652F\u6301\u5C06"
#define CONST_STRING_SET_TO_BE L"\u8BBE\u7F6E\u4E3A"
#define CONST_STRING_PARAMETER_ERROR L"\u53C2\u6570\u9519\u8BEF"
#define CONST_STRING_PARAMETER_ORIGIN L"\u539F\u53C2\u6570"
#define CONST_STRING_PARAMETER_INEXACT L"\u4E0D\u7CBE\u786E\u6216\u8BBE\u5907\u4E0D\u652F\u6301\uFF0C\u5DF2\u8C03\u6574\u4E3A"
#define CONST_STRING_PARAMETER_ADJUSTED L"\u53C2\u6570\u8C03\u6574"
#define CONST_STRING_SET_AREA L"\u8bbe\u7f6e\u533a\u57df"
#define CONST_STRING_SET_TONE L"\u8bbe\u7f6e\u8272\u8c03\u66f2\u7ebf"
#define CONST_STRING_SETTING L"\u8BBE\u7F6E"
#define CONST_STRING_SAVE_CUR_CFG_AS L"\u5F53\u524D\u914D\u7F6E\u53E6\u5B58\u4E3A"
#define CONST_STRING_SCAN L"\u626B\u63CF"
#define CONST_STRING_RESTORE L"\u6062\u590D\u9ED8\u8BA4\u503C"
#define CONST_STRING_HELP L"\u5E2E\u52A9"
#define CONST_STRING_OPEN_FAILED L"\u6253\u5F00\u5931\u8D25"
#define CONST_STRING_START_FAILED L"\u542F\u52A8\u5931\u8D25"
#define CONST_STRING_ERROR L"\u9519\u8BEF"

File diff suppressed because it is too large Load Diff

View File

@ -37,55 +37,103 @@ namespace gb
class json : public refer
{
cJSON *obj_;
cJSON *cur_child_;
cJSON walk_head_;
bool is_array_;
enum val_type
{
VAL_TYPE_NULL = 0,
VAL_TYPE_BOOL,
VAL_TYPE_INT,
VAL_TYPE_FLOAT,
VAL_TYPE_STRING,
VAL_TYPE_OBJECT,
VAL_TYPE_ARRAY,
};
val_type type_;
std::string key_;
union
{
bool bval;
int nval;
double dval;
}simple_val_;
std::string strval_;
std::vector<json*> arr_val_;
size_t cur_child_;
cJSON* find_sibling(cJSON* first, const char* name, cJSON*** addr);
cJSON* find_child(cJSON *parent, std::vector<std::string>& path, bool create, cJSON*** addr = NULL);
cJSON* find(const char* path, bool create = false, cJSON*** addr = NULL);
static std::string object_key(json* jsn);
static std::string array_key(json* jsn);
protected:
~json();
void from_cjson(cJSON* cj);
json* find_child(const char* key, bool remove = false);
public:
json(char* json_txt = 0);
static std::string to_string(cJSON* root, bool formatted);
static std::string get_value_as_string(cJSON* root, bool integer = false);
static void free_node_data(cJSON* node);
static cJSON* create_element(bool is_array = false);
static cJSON* create_element_with_name(const char* name);
protected:
json(const char* key, bool val);
json(const char* key, int val);
json(const char* key, double val);
json(const char* key, const char* val);
json(json& r);
~json();
public:
// parse/un-parse ...
void copy_from(json& r);
bool attach_text(char* json_txt);
bool attach_cjson(cJSON* cjson);
bool create_empty(bool array = false);
void clear(void);
std::string to_string(bool formatted);
void clear(bool as_array = false);
std::string to_string(void);
// can be path: child/value ...
// attributes ...
std::string& key(void);
bool is_array(void);
bool is_leaf_node(void); // whether this object is a leaf node contains final value
// value access ...
bool get_value(const char* key, bool& val);
bool get_value(const char* key, int& val);
bool get_value(const char* key, double& val);
bool get_value(const char* key, std::string& val);
bool get_value(const char* key, json*& val); // caller shoud call "delete" to free the returned object !!!
bool get_value_as_string(const char* key, std::string& val, bool integer);
bool get_as_array(const char* key, std::vector<std::string>& val);
bool get_value(const char* key, json*& val);
bool first_child(std::string& val, std::string* name = NULL);
bool next_child(std::string& val, std::string* name = NULL);
// enumeration ...
size_t children(void); // return children count if was object or array, or else -1 returned
json* child(size_t ind);
json* first_child(void);
json* next_child(void);
// change the item matching 'key', otherwise add a new item
bool set_value(const char* key, bool val);
bool set_value(const char* key, int val);
bool set_value(const char* key, double val);
bool set_value(const char* key, std::string val);
bool set_value(const char* key, const char* val);
bool set_value(const char* key, json* obj);
bool set_value(const char* key, json* val);
bool change_key(const char* old_key, const char* new_key);
// operator+= only for array
json& operator+=(bool val);
json& operator+=(int val);
json& operator+=(double val);
json& operator+=(const char* val);
json& operator+=(json* val);
// remove item
json& operator-=(int ind);
bool remove(const char* key);
bool remove(json* child);
bool remove(int ind);
// position management
int index(json* child);
int index_move_to(json* child, int ind);
// leaf node value ...
bool value(bool& val);
bool value(int& val);
bool value(double& val);
bool value(std::string& val);
json& operator=(bool val);
json& operator=(int val);
json& operator=(double val);
json& operator=(const char* val);
};
class base64
@ -115,9 +163,8 @@ namespace gb
std::string file_;
json* jsn_;
json* bkp_;
json* def_val_;
json* def_val_; // name_id: id, name_val: val
bool in_setting_;
std::map<int, std::string> id_name_; // (id, default-val)
void clear();
std::string default_value(const char* name);
@ -129,19 +176,30 @@ namespace gb
sane_config_schm(scanner_cfg* scanner = nullptr);
static std::string opt_data_appendix_;
static std::string opt_def_id_appendix_;
static std::string opt_def_val_appendix_;
static std::string opt_def_type_appendix_;
static std::string opt_def_title_appendix_;
static bool hex(unsigned char ch, unsigned char* val);
static bool hex_char(const char* data, unsigned char* val);
static std::string to_hex_letter(const char* data, size_t bytes);
static std::string from_hex_letter(const char* data, size_t bytes);
static bool is_option_data(std::string& name); // reset baase option name into 'name' if name was option data, and return true
static void set_default_value(json* jsn, int id, const char* name, const char* title, void* data, size_t bytes, int type);
static int option_name_2_id(json* jsn, const char* name);
static int option_type(json* jsn, const char* name);
static std::string option_title(json* jsn, const char* name);
static std::string option_default_value(json* jsn, const char* name);
static std::string sane_option_value_2_string(void* val, size_t bytes, int type);
public:
sane_config_schm* copy(void);
bool load_from_file(const char* file);
bool load_from_mem(const char* mem, bool in_b64 = true);
bool save_to(const char* file);
void set_default_value(int sn, const char* name, const char* val, size_t bytes);
void copy_default_value(sane_config_schm* from);
void set_default_value(int sn, const char* name, const char* title, const char* val, size_t bytes, int type);
bool first_config(std::string& name, std::string& val);
bool next_config(std::string& name, std::string& val);
bool get_config(const char* name, std::string& val);
@ -150,14 +208,15 @@ namespace gb
void config_changed(int sn, const char* val, size_t bytes, bool extra = false);
void remove_config(const char* name);
void set_value(const char* name, const char* val, size_t bytes, bool extra = false);
bool has_changed(void);
bool has_changed(int* items = nullptr);
void end_setting(bool cancel);
int id_from_name(const char* name);
std::string to_text_stream(bool b64 = true, bool with_ver = true);
std::string get_version(void);
std::string get_scheme_name(void);
void set_scheme_name(const char* name);
void update(bool(* is_float)(int, void*), void* param, const char*(* t2n)(const char*), std::string* discard = NULL);
std::string auto_gen_scheme_name(const char* (__stdcall* lang_trans)(const char*, bool/*true - default language to cur language*/, void*), void* param);
};
class scanner_cfg : public refer
@ -178,12 +237,23 @@ namespace gb
std::string path_;
std::string scanner_name_; // scanner type: HUAGOSCAN G100 - 0100
json *global_; // version, current scheme, ...
json *opt_default_value_;
const char* (__stdcall* lang_trans_)(const char*, bool/*true - default language to cur language*/, void*);
void* lang_param_;
typedef struct _cfg_schm
{
std::string name;
bool should_rename;
sane_config_schm* schm;
struct _cfg_schm()
{
name = "";
should_rename = false;
schm = nullptr;
}
bool operator==(const char* n)
{
return name == n;
@ -191,14 +261,12 @@ namespace gb
}CFGSCHM;
std::vector<CFGSCHM> schemes_;
static std::string global_name_;
static std::string cur_sel_;
static std::string default_setting_name_;
static const char* __stdcall language_trans(const char* in, bool from_def, void* param);
void clear(void);
void init_version(void);
void init_select(void);
void walk_sibling_schemes(cJSON* first);
const char* trans_language(const char* in, bool from_default);
protected:
~scanner_cfg();
@ -215,20 +283,31 @@ namespace gb
}UDF, *LPUDF;
static bool update(const char* file, LPUDF func);
static std::string global_name_;
static std::string cur_sel_;
static std::string default_setting_name_;
public:
int load_file(const char* file);
int load_mem(const char* mem);
int save(const char* file = nullptr);
void set_language_transform(const char* (__stdcall* lang_trans)(const char*, bool/*true - default language to cur language*/, void*), void* param);
json* get_option_default_value(void);
void get_all_schemes(std::vector<std::string>& schemes); // return all schemes name queue, the first is always be 'Default settings'
sane_config_schm* get_scheme(const char* scheme_name = nullptr/*return current scheme if was null*/); // call sane_config_schm::release() if not use anymore
sane_config_schm* create_empty_scheme(bool selected); // create an empty scheme and add to scheme queue
std::string get_current_scheme_name(void);
std::string to_text_stream(void);
void set_default_value(int id, const char* name, const char* title, void* data, size_t bytes, int type);
int option_value_type(const char* name);
std::string option_title(const char* name);
bool remove_scheme(const char* scheme_name);
void remove_all_schemes(void);
bool select_scheme(const char* scheme_name);
sane_config_schm* copy_scheme(const char* cp_from_name); // for UI setting, call release() if not use anymore
bool add_scheme(sane_config_schm* schm, const char* name = nullptr);
bool add_scheme(sane_config_schm* schm, const char* name = nullptr, bool should_rename = false);
bool rename_scheme(const char* from, const char* to);
};
};

View File

@ -9,6 +9,8 @@
#define IDD_AREA 106
#define IDD_GAMMA 107
#define IDD_CHOOSE_DEV 108
#define IDD_CFG_MGR 109
#define IDD_INPUT 110
#define IDC_EDIT_PAPER 1001
#define IDC_EDIT_IMAGE 1002
#define IDC_STATIC_PAPER 1003
@ -21,8 +23,11 @@
#define IDC_UNIT2 1009
#define IDC_SCHEME 1009
#define IDC_EDIT_DPI 1010
#define IDC_BUTTON_CONFIG_MGR 1010
#define IDC_BUTTON_RESET 1011
#define IDC_BUTTON_CONFIG_MENU 1011
#define IDC_EDIT_x 1012
#define IDC_BUTTON_DEL_SEL 1012
#define IDC_EDIT_y 1013
#define IDC_EDIT_W 1014
#define IDC_EDIT_H 1015
@ -42,6 +47,9 @@
#define IDC_STATIC_COLOR 1029
#define IDC_STATIC_INPUT 1030
#define IDC_STATIC_OUTPUT 1031
#define IDC_BUTTON_DEL_ALL 1032
#define IDC_EDIT1 1033
#define IDC_STATIC_SKETCH 1034
// Next default values for new objects
//
@ -49,7 +57,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 109
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1032
#define _APS_NEXT_CONTROL_VALUE 1035
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -68,10 +68,12 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,223,8,33,13
DEFPUSHBUTTON "确定",IDOK,223,7,33,14
PUSHBUTTON "ɨÃè",IDC_BUTTON_SCAN,7,7,39,14,NOT WS_VISIBLE
PUSHBUTTON "恢复默认值",IDC_BUTTON_RESTORE,113,7,48,14,NOT WS_VISIBLE
PUSHBUTTON "帮助",IDC_BUTTON_HELP,167,7,48,14,NOT WS_VISIBLE
PUSHBUTTON "恢复默认值",IDC_BUTTON_RESTORE,121,7,45,14,NOT WS_VISIBLE
PUSHBUTTON "帮助",IDC_BUTTON_HELP,167,7,45,14,NOT WS_VISIBLE
PUSHBUTTON "配置管理",IDC_BUTTON_CONFIG_MGR,57,7,38,14,NOT WS_VISIBLE
PUSHBUTTON ">",IDC_BUTTON_CONFIG_MENU,94,7,8,14,NOT WS_VISIBLE
END
IDD_PAGE DIALOGEX 0, 0, 258, 133
@ -135,6 +137,30 @@ BEGIN
CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,253,62
END
IDD_CFG_MGR DIALOGEX 0, 0, 229, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "配置管理"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "全部删除",IDC_BUTTON_DEL_ALL,172,7,50,14
DEFPUSHBUTTON "确定",IDOK,189,198,33,13
LTEXT "配置方案:",IDC_STATIC_PAPER,7,9,40,8
CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_EDITLABELS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,22,215,62
PUSHBUTTON "删除选中项",IDC_BUTTON_DEL_SEL,115,7,50,14
GROUPBOX "配置内容:",IDC_STATIC_SKETCH,7,95,215,101
EDITTEXT IDC_EDIT1,14,109,204,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL
END
IDD_INPUT DIALOGEX 0, 0, 193, 41
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "请输入新值:"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
EDITTEXT IDC_EDIT1,7,7,179,12,ES_AUTOHSCROLL
PUSHBUTTON "确定",IDOK,144,22,42,12
PUSHBUTTON "取消",IDCANCEL,7,22,42,12
END
/////////////////////////////////////////////////////////////////////////////
//
@ -191,6 +217,22 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 89
END
IDD_CFG_MGR, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 222
TOPMARGIN, 7
BOTTOMMARGIN, 211
END
IDD_INPUT, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 186
TOPMARGIN, 7
BOTTOMMARGIN, 34
END
END
#endif // APSTUDIO_INVOKED
@ -230,6 +272,16 @@ BEGIN
0
END
IDD_CFG_MGR AFX_DIALOG_LAYOUT
BEGIN
0
END
IDD_INPUT AFX_DIALOG_LAYOUT
BEGIN
0
END
/////////////////////////////////////////////////////////////////////////////
//
@ -271,8 +323,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 4,34,10000,22310
PRODUCTVERSION 4,34,10000,22310
FILEVERSION 4,37,20000,23034
PRODUCTVERSION 4,37,20000,23034
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -287,14 +339,14 @@ BEGIN
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "宁波华高信息科技有限公司"
VALUE "FileDescription", "华高扫描仪应用程序"
VALUE "FileVersion", "4.34.10000.22310"
VALUE "CompanyName", "上海中晶科技有限公司"
VALUE "FileDescription", "中晶扫描仪应用程序"
VALUE "FileVersion", "4.37.20000.23034"
VALUE "InternalName", "sane.dll"
VALUE "LegalCopyright", "Copyright (C) HUAGOScan 2022"
VALUE "LegalCopyright", "Copyright (C) MICROTEKScan 2023"
VALUE "OriginalFilename", "sane.dll"
VALUE "ProductName", "HUAGOScan"
VALUE "ProductVersion", "4.34.10000.22310"
VALUE "ProductName", "MICROTEKScan"
VALUE "ProductVersion", "4.37.20000.23034"
END
END
BLOCK "VarFileInfo"

View File

@ -200,8 +200,10 @@
<ClCompile Include="..\..\code_device\hgsane\sane_hg_mdw.cpp" />
<ClCompile Include="..\..\code_device\hgsane\sane_option.cpp" />
<ClCompile Include="DlgArea.cpp" />
<ClCompile Include="DlgCfgMgr.cpp" />
<ClCompile Include="DlgGamma.cpp" />
<ClCompile Include="DlgIndicator.cpp" />
<ClCompile Include="DlgInput.cpp" />
<ClCompile Include="DlgPage.cpp" />
<ClCompile Include="DlgSetting.cpp" />
<ClCompile Include="gb_json.cpp" />
@ -223,9 +225,12 @@
<ClInclude Include="..\..\sdk\include\sane\sanei_debug.h" />
<ClInclude Include="..\..\sdk\include\sane\sane_ex.h" />
<ClInclude Include="..\..\sdk\include\sane\sane_option_definitions.h" />
<ClInclude Include="const_str.h" />
<ClInclude Include="DlgArea.h" />
<ClInclude Include="DlgCfgMgr.h" />
<ClInclude Include="DlgGamma.h" />
<ClInclude Include="DlgIndicator.h" />
<ClInclude Include="DlgInput.h" />
<ClInclude Include="DlgPage.h" />
<ClInclude Include="DlgSetting.h" />
<ClInclude Include="gb_json.h" />

View File

@ -66,6 +66,12 @@
<ClCompile Include="gb_json.cpp">
<Filter>sane2twain\UI</Filter>
</ClCompile>
<ClCompile Include="DlgCfgMgr.cpp">
<Filter>sane2twain\UI</Filter>
</ClCompile>
<ClCompile Include="DlgInput.cpp">
<Filter>sane2twain\UI</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\code_device\hgsane\cJSON.h">
@ -140,6 +146,15 @@
<ClInclude Include="gb_json.h">
<Filter>sane2twain\UI</Filter>
</ClInclude>
<ClInclude Include="DlgCfgMgr.h">
<Filter>sane2twain\UI</Filter>
</ClInclude>
<ClInclude Include="DlgInput.h">
<Filter>sane2twain\UI</Filter>
</ClInclude>
<ClInclude Include="const_str.h">
<Filter>sane2twain\UI</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="sane.def">

View File

@ -5,7 +5,7 @@
#pragma comment(lib, "Shlwapi.lib")
#include "../../code_device/hgsane/sane_hg_mdw.h"
#include "../../sdk/include/lang/app_language.h"
@ -30,7 +30,7 @@ namespace local_trans
delete[] ansi;
}
return a;
return std::move(a);
}
std::wstring a2u(const char* asc, UINT cp)
{
@ -49,7 +49,23 @@ namespace local_trans
delete[] buf;
}
return u;
return std::move(u);
}
std::wstring lang_trans_between_hz936(const wchar_t* in, bool from_hz)
{
std::string a(u2a(in, CP_UTF8));
if (from_hz)
a = from_default_language(a.c_str(), nullptr);
else
a = to_default_language(a.c_str(), nullptr);
return std::move(a2u(a.c_str(), CP_UTF8));
}
const char* __stdcall lang_trans_between_hz936(const char* in, bool from_hz, void* param)
{
return from_hz ? from_default_language(in, nullptr) : to_default_language(in, nullptr);
}
}

View File

@ -195,4 +195,7 @@ namespace local_trans
{
std::string u2a(const wchar_t* unic, UINT cp = CP_ACP);
std::wstring a2u(const char* asc, UINT cp = CP_ACP);
std::wstring lang_trans_between_hz936(const wchar_t* in, bool from_hz = true);
const char* __stdcall lang_trans_between_hz936(const char* in, bool from_hz, void* param);
}

View File

@ -315,6 +315,14 @@ namespace callback
else
delete t;
}
static const char* __stdcall language_trans(const char* in, bool from_hz, void* param)
{
if (from_hz)
return from_default_language(in, nullptr);
else
return to_default_language(in, nullptr);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -325,7 +333,9 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS
, scanner_ev_handler_(NULL), evh_param_(NULL), app_wnd_(NULL), user_cancel_(false)
, max_img_mem_(1 * 1024)
{
cfg_ = new gb::sane_config_schm();
cfg_ = new gb::scanner_cfg();
cfg_->set_language_transform(&callback::language_trans, NULL);
tmp_path_ = local_trans::a2u(hg_sane_middleware::sane_path().c_str());
{
char* tmp = getenv("LOCALAPPDATA");
@ -516,6 +526,10 @@ bool scanner::is_option_float(int sn, void* param)
else
return false;
}
void __stdcall scanner::apply_scheme(gb::sane_config_schm* schm, void* param)
{
((scanner*)param)->apply_scheme(schm);
}
// IRef
COM_API_IMPLEMENT(scanner, long, add_ref(void))
@ -538,11 +552,11 @@ void scanner::transport_config_file(void)
pid += scanner_name_.substr(pos + 3);
if (scanner_name_.find(L"HUAGOSCAN ") != std::wstring::npos)
{
old = dlg_base::language_from_hz936(L"\u534E\u9AD8\u626B\u63CF\u4EEA\u2014");
old = local_trans::lang_trans_between_hz936(L"\u534E\u9AD8\u626B\u63CF\u4EEA\u2014");
}
else if (scanner_name_.find(L"LANXUMSCAN ") != std::wstring::npos)
{
old = dlg_base::language_from_hz936(L"\u7ACB\u601D\u8FB0\u626B\u63CF\u4EEA\u2014");
old = local_trans::lang_trans_between_hz936(L"\u7ACB\u601D\u8FB0\u626B\u63CF\u4EEA\u2014");
pid += L"S";
}
old += pid;
@ -554,89 +568,48 @@ void scanner::transport_config_file(void)
}
void scanner::update_config(void)
{
gb::sane_config_schm* schm = cfg_->get_scheme();
std::string notice("");
cfg_->update(&scanner::is_option_float, handle_, &callback::option_title_2_name, &notice);
if (notice.length())
{
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)
{
msg += local_trans::a2u(callback::option_name_2_title(notice.substr(0, pos).c_str()), CP_UTF8) + L"\r\n";
notice.erase(0, pos + 2);
pos = notice.find("\r\n");
}
if (!IsWindow(app_wnd_))
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);
if (schm)
{
//schm->update(&scanner::is_option_float, handle_, &callback::option_title_2_name, &notice);
//if (notice.length())
//{
// std::wstring msg(local_trans::lang_trans_between_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)
// {
// msg += local_trans::a2u(callback::option_name_2_title(notice.substr(0, pos).c_str()), CP_UTF8) + L"\r\n";
// notice.erase(0, pos + 2);
// pos = notice.find("\r\n");
// }
// if (!IsWindow(app_wnd_))
// callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(L"\u52A0\u8F7D\u914D\u7F6E").c_str());
// MessageBoxW(app_wnd_, msg.c_str(), local_trans::lang_trans_between_hz936(L"\u52A0\u8F7D\u914D\u7F6E").c_str(), MB_OK | MB_ICONINFORMATION);
//}
schm->release();
}
}
void scanner::load_config(const wchar_t* file)
{
cfg_->load_from_file(local_trans::u2a(file).c_str());
cfg_->load_file(local_trans::u2a(file).c_str());
update_config();
}
void scanner::save_config(const wchar_t* file)
{
cfg_->save_to(local_trans::u2a(file).c_str());
cfg_->save(local_trans::u2a(file).c_str());
}
void scanner::apply_config(void)
{
std::string n(""), v(""), ver(cfg_->get_version());
gb::sane_config_schm* schm = cfg_->get_scheme();
if (cfg_->first_config(n, v))
{
do
{
int id = cfg_->id_from_name(n.c_str());
if (id == -1)
{
if (gb::sane_config_schm::is_option_data(n))
{
id = cfg_->id_from_name(n.c_str());
if (id == is_custom_gamma_id_)
{
if (v.length() == sizeof(SANE_Gamma))
{
unsigned int l = v.length();
hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &v[0], &l);
}
else
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"ERROR: custom gamma data length is %u, but we expect %u.\r\n", v.length(), sizeof(SANE_Gamma));
log_info(info, 0);
}
}
}
}
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);
if (desc)
{
char* buf = NULL;
SANE_Int after = 0;
if (!schm)
return;
if (desc->type == SANE_TYPE_STRING)
{
buf = new char[desc->size + 4];
memset(buf, 0, desc->size + 4);
strcpy(buf, v.c_str());
data = buf;
}
hg_sane_middleware::instance()->set_option(handle_, (const void*)id, SANE_ACTION_SET_VALUE, data, &after);
if (buf)
delete[] buf;
}
}
} while (cfg_->next_config(n, v));
}
apply_scheme(schm);
schm->release();
}
void scanner::on_ui_event(int uev, void* sender)
{
@ -772,8 +745,8 @@ int scanner::open(void)
HWND parent = callback::find_main_wnd();
if (!IsWindow(parent))
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);
callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(CONST_STRING_OPEN_FAILED).c_str());
MessageBoxW(parent, msg.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_OPEN_FAILED).c_str(), MB_OK | MB_ICONERROR);
}
return ret;
@ -829,10 +802,10 @@ int scanner::init_options_id(void)
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());
cfg_->set_default_value(op_id, desc->name, desc->title, &deflan[0], deflan.length(), desc->type);
}
else
cfg_->set_default_value(op_id, desc->name, (char*)val, len);
cfg_->set_default_value(op_id, desc->name, desc->title, (char*)val, len, desc->type);
}
local_utility::free_memory(val);
}
@ -1103,14 +1076,14 @@ bool scanner::get_option_value_with_parent(int sn, set_opt_value setv, void* par
memset(buf, 0, parent->size);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)scan_mode_id_, buf);
handled = compare_sane_opt(OPTION_VALUE_SMZS_LXSM, buf);
handled = compare_sane_opt(local_trans::lang_trans_between_hz936(OPTION_VALUE_SMZS_LXSM, true, nullptr), buf);
delete[] buf;
if (handled)
{
int count = -1;
value_role role = VAL_ROLE_CURRENT;
buf = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)scan_mode_id_);
if (compare_sane_opt(OPTION_VALUE_SMZS_LXSM, buf))
if (compare_sane_opt(local_trans::lang_trans_between_hz936(OPTION_VALUE_SMZS_LXSM, true, nullptr), buf))
role = value_role(role | VAL_ROLE_DEFAULT);
local_utility::free_memory(buf);
@ -1134,17 +1107,17 @@ bool scanner::set_option_value_with_parent(int sn, void* data, int* err) // retu
memset(val, 0, parent->size + 4);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)scan_mode_id_, val);
if (compare_sane_opt(OPTION_VALUE_SMZS_LXSM, val))
if (compare_sane_opt(local_trans::lang_trans_between_hz936(OPTION_VALUE_SMZS_LXSM, true, nullptr), val))
{
if (*(int*)data != -1)
{
strcpy(val, OPTION_VALUE_SMZS_SMZDZS);
strcpy(val, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMZS_SMZDZS, true, nullptr));
*err = hg_sane_middleware::instance()->set_option(handle_, (void*)scan_mode_id_, SANE_ACTION_SET_VALUE, val, &after);
}
}
else if (*(int*)data == -1)
{
strcpy(val, OPTION_VALUE_SMZS_LXSM);
strcpy(val, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMZS_LXSM, true, nullptr));
*err = hg_sane_middleware::instance()->set_option(handle_, (void*)scan_mode_id_, SANE_ACTION_SET_VALUE, val, &after);
}
delete[] val;
@ -1231,6 +1204,69 @@ scanner::EXAPIPOS scanner::find_ex_api(int op_id)
{
return std::find(ex_opts_.begin(), ex_opts_.end(), op_id);
}
void scanner::apply_scheme(gb::sane_config_schm* schm)
{
// restore ...
hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_RESTORE_SETTINGS, nullptr, nullptr);
if (!schm)
return;
std::string n(""), v(""), ver(schm->get_version());
if (schm->first_config(n, v))
{
do
{
int id = schm->id_from_name(n.c_str());
if (id == -1)
{
if (gb::sane_config_schm::is_option_data(n))
{
id = schm->id_from_name(n.c_str());
if (id == is_custom_gamma_id_)
{
if (v.length() == sizeof(SANE_Gamma))
{
unsigned int l = v.length();
hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &v[0], &l);
}
else
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"ERROR: custom gamma data length is %u, but we expect %u.\r\n", v.length(), sizeof(SANE_Gamma));
log_info(info, 0);
}
}
}
}
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);
if (desc)
{
char* buf = NULL;
SANE_Int after = 0;
if (desc->type == SANE_TYPE_STRING)
{
buf = new char[desc->size + 4];
memset(buf, 0, desc->size + 4);
strcpy(buf, v.c_str());
data = buf;
}
hg_sane_middleware::instance()->set_option(handle_, (const void*)id, SANE_ACTION_SET_VALUE, data, &after);
if (buf)
delete[] buf;
}
}
} while (schm->next_config(n, v));
}
}
EX_OPTION_HANDLER_IMPL(multiout)
{
@ -1533,7 +1569,7 @@ EX_OPTION_HANDLER_IMPL(paper_lateral)
if (*(bool*)data)
{
// set to A4Lateral ...
strcpy(buf, OPTION_VALUE_ZZCC_A4HX);
strcpy(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_A4HX, true, nullptr));
ret = hg_sane_middleware::instance()->set_option(handle_, (void*)base_id, SANE_ACTION_SET_VALUE, buf, &after);
ret = local_utility::sane_statu_2_scanner_err(ret);
}
@ -1556,8 +1592,8 @@ EX_OPTION_HANDLER_IMPL(auto_paper_size)
if (setv)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
bool yes = strcmp(buf, OPTION_VALUE_ZZCC_PPYSCC) == 0,
def = strcmp(init, OPTION_VALUE_ZZCC_PPYSCC) == 0;
bool yes = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_PPYSCC, true, nullptr)) == 0,
def = strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_PPYSCC, true, nullptr)) == 0;
local_utility::free_memory(init);
set_cur_and_def_value<bool>(yes, def, setv, data);
@ -1565,7 +1601,7 @@ EX_OPTION_HANDLER_IMPL(auto_paper_size)
else
{
SANE_Int after = 0;
strcpy(buf, *(bool*)data ? OPTION_VALUE_ZZCC_PPYSCC : OPTION_VALUE_ZZCC_A4);
strcpy(buf, *(bool*)data ? local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_PPYSCC, true, nullptr) : local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_A4, true, nullptr));
ret = hg_sane_middleware::instance()->set_option(handle_, (void*)base_id, SANE_ACTION_SET_VALUE, buf, &after);
ret = local_utility::sane_statu_2_scanner_err(ret);
}
@ -1585,7 +1621,7 @@ EX_OPTION_HANDLER_IMPL(auto_paper_crop)
if (setv)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
bool yes = strcmp(buf, OPTION_VALUE_ZZCC_ZDSMCCZDCQ) == 0,
bool yes = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_ZDSMCCZDCQ, true, nullptr)) == 0,
def = strcmp(init, OPTION_VALUE_ZZCC_ZDSMCCZDCQ) == 0;
local_utility::free_memory(init);
@ -1594,7 +1630,7 @@ EX_OPTION_HANDLER_IMPL(auto_paper_crop)
else
{
SANE_Int after = 0;
strcpy(buf, *(bool*)data ? OPTION_VALUE_ZZCC_ZDSMCCZDCQ : OPTION_VALUE_ZZCC_ZDSMCC);
strcpy(buf, *(bool*)data ? local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_ZDSMCCZDCQ, true, nullptr) : local_trans::lang_trans_between_hz936(OPTION_VALUE_ZZCC_ZDSMCC, true, nullptr));
ret = hg_sane_middleware::instance()->set_option(handle_, (void*)base_id, SANE_ACTION_SET_VALUE, buf, &after);
ret = local_utility::sane_statu_2_scanner_err(ret);
}
@ -1664,12 +1700,12 @@ EX_OPTION_HANDLER_IMPL(duplex)
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)base_id, buf);
set_cur_and_def_value<bool>(strcmp(buf, OPTION_VALUE_SMYM_SM) == 0, strcmp(init, OPTION_VALUE_SMYM_SM) == 0, setv, data);
set_cur_and_def_value<bool>(strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_SM, true, nullptr)) == 0, strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_SM, true, nullptr)) == 0, setv, data);
local_utility::free_memory(init);
}
else
{
strcpy(buf, val ? OPTION_VALUE_SMYM_SM : OPTION_VALUE_SMYM_DM);
strcpy(buf, val ? local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_SM, true, nullptr) : local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_DM, true, nullptr));
SANE_Int after = 0;
ret = hg_sane_middleware::instance()->set_option(handle_, (void*)base_id, SANE_ACTION_SET_VALUE, buf, &after);
ret = local_utility::sane_statu_2_scanner_err(ret);
@ -1691,13 +1727,13 @@ EX_OPTION_HANDLER_IMPL(fill_background)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)base_id, buf);
val = strcmp(buf, OPTION_VALUE_SMYM_SM) == 0;
set_cur_and_def_value<bool>(strcmp(buf, OPTION_VALUE_BJTCFS_TDBX) == 0, strcmp(init, OPTION_VALUE_BJTCFS_TDBX) == 0, setv, data);
val = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_SM, true, nullptr)) == 0;
set_cur_and_def_value<bool>(strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_BJTCFS_TDBX, true, nullptr)) == 0, strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_BJTCFS_TDBX, true, nullptr)) == 0, setv, data);
local_utility::free_memory(init);
}
else
{
strcpy(buf, val ? OPTION_VALUE_BJTCFS_TDBX : OPTION_VALUE_BJTCFS_ADBX);
strcpy(buf, val ? local_trans::lang_trans_between_hz936(OPTION_VALUE_BJTCFS_TDBX, true, nullptr) : local_trans::lang_trans_between_hz936(OPTION_VALUE_BJTCFS_ADBX, true, nullptr));
SANE_Int after = 0;
ret = hg_sane_middleware::instance()->set_option(handle_, (void*)base_id, SANE_ACTION_SET_VALUE, buf, &after);
ret = local_utility::sane_statu_2_scanner_err(ret);
@ -1718,17 +1754,17 @@ EX_OPTION_HANDLER_IMPL(discard_blank_page)
if (setv)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
bool def = strcmp(init, OPTION_VALUE_SMYM_TGKBYTY) == 0;
bool def = strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYTY, true, nullptr)) == 0;
local_utility::free_memory(init);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)base_id, buf);
val = strcmp(buf, OPTION_VALUE_SMYM_TGKBYTY) == 0;
val = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYTY, true, nullptr)) == 0;
set_cur_and_def_value<bool>(val, def, setv, data);
}
else
{
if (val)
strcpy(buf, OPTION_VALUE_SMYM_TGKBYTY);
strcpy(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYTY, true, nullptr));
else
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
@ -1755,17 +1791,17 @@ EX_OPTION_HANDLER_IMPL(discard_blank_receipt)
if (setv)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
bool def = strcmp(init, OPTION_VALUE_SMYM_TGKBYFPZ) == 0;
bool def = strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYFPZ, true, nullptr)) == 0;
local_utility::free_memory(init);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)base_id, buf);
val = strcmp(buf, OPTION_VALUE_SMYM_TGKBYFPZ) == 0;
val = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYFPZ, true, nullptr)) == 0;
set_cur_and_def_value<bool>(val, def, setv, data);
}
else
{
if (val)
strcpy(buf, OPTION_VALUE_SMYM_TGKBYFPZ);
strcpy(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_TGKBYFPZ, true, nullptr));
else
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
@ -1792,17 +1828,17 @@ EX_OPTION_HANDLER_IMPL(page_fold)
if (setv)
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
bool def = strcmp(init, OPTION_VALUE_SMYM_DZ) == 0;
bool def = strcmp(init, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_DZ, true, nullptr)) == 0;
local_utility::free_memory(init);
hg_sane_middleware::instance()->get_cur_value(handle_, (void*)base_id, buf);
val = strcmp(buf, OPTION_VALUE_SMYM_DZ) == 0;
val = strcmp(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_DZ, true, nullptr)) == 0;
set_cur_and_def_value<bool>(val, def, setv, data);
}
else
{
if (val)
strcpy(buf, OPTION_VALUE_SMYM_DZ);
strcpy(buf, local_trans::lang_trans_between_hz936(OPTION_VALUE_SMYM_DZ, true, nullptr));
else
{
char* init = (char*)hg_sane_middleware::instance()->get_def_value(handle_, (void*)base_id);
@ -2255,8 +2291,8 @@ COM_API_IMPLEMENT(scanner, int, start(void))
if (indicator_.get())
indicator_->show(false);
if (!IsWindow(app_wnd_))
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);
callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(CONST_STRING_START_FAILED).c_str());
MessageBoxW(app_wnd_, msg.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_START_FAILED).c_str(), MB_OK | MB_ICONERROR);
}
prev_start_result_ = ret;
is_scanning_ = ret == SANE_STATUS_GOOD;
@ -2708,7 +2744,7 @@ COM_API_IMPLEMENT(scanner, int, twain_get_config(char* buf, size_t* len))
}
COM_API_IMPLEMENT(scanner, int, twain_set_config(char* buf, size_t len))
{
if(cfg_->load_from_mem(buf))
if(cfg_->load_mem(buf))
{
update_config();
apply_config();
@ -2756,8 +2792,7 @@ COM_API_IMPLEMENT(scanner, bool, ui_show_setting(HWND parent, bool with_scan, bo
pid = scanner_name_.length();
setting_.reset(new dlg_setting(parent, &api, handle_, with_scan, scanner_name_.substr(0, pid).c_str()));
setting_->set_ui_event_notify(&scanner::ui_callback, this);
setting_->set_config(cfg_, (cfg_path_ + scanner_name_.substr(0, pid)).c_str());
cfg_->begin_setting();
setting_->set_config(cfg_, (cfg_path_ + scanner_name_.substr(0, pid) + L".cfg").c_str(), &scanner::apply_scheme, this);
indicator_.reset();
if (indicator)
{
@ -2862,8 +2897,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(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);
callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str());
MessageBoxW(app_wnd_, msg.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str(), MB_OK);
}
on_ui_event(ev_code, (void*)ev_code);
}

View File

@ -26,7 +26,7 @@ class dlg_indicator;
class dlg_setting;
namespace gb
{
class sane_config_schm;
class scanner_cfg;
}
class scanner : public ISaneInvoker, virtual public refer
@ -53,7 +53,7 @@ class scanner : public ISaneInvoker, virtual public refer
SANE_FinalImgFormat img_fmt_;
std::unique_ptr<dlg_indicator> indicator_;
std::unique_ptr<dlg_setting> setting_;
gb::sane_config_schm* cfg_;
gb::scanner_cfg* cfg_;
int(__stdcall* scanner_ev_handler_)(int, void*);
void* evh_param_;
@ -99,6 +99,7 @@ class scanner : public ISaneInvoker, virtual public refer
std::vector<EXAPI> ex_opts_;
typedef std::vector<EXAPI>::iterator EXAPIPOS;
EXAPIPOS find_ex_api(int op_id);
void apply_scheme(gb::sane_config_schm* schm);
;
EX_OPTION_HANDLER_DECL(multiout);
EX_OPTION_HANDLER_DECL(auto_color_type);
@ -167,6 +168,7 @@ class scanner : public ISaneInvoker, virtual public refer
static float __stdcall to_float(SANE_Fixed v);
static void __stdcall ui_callback(int uev, void* sender, void* param);
static bool is_option_float(int sn, void* param);
static void __stdcall apply_scheme(gb::sane_config_schm* schm, void* param);
public:
scanner(SCANNERID id);