添加配置管理功能;修复配置属性引入语言包后未转换语言的BUG
This commit is contained in:
parent
00c8df8edf
commit
b8f1e55ed4
|
@ -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_);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
// 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_)
|
||||
{
|
||||
cfg_->rename_scheme(local_trans::u2a(label_.c_str(), CP_UTF8).c_str(), local_trans::u2a(pdisp->item.pszText, CP_UTF8).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();
|
||||
}
|
|
@ -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:
|
||||
};
|
|
@ -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_;
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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_;
|
||||
}
|
|
@ -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);
|
||||
};
|
197
sane/DlgPage.cpp
197
sane/DlgPage.cpp
|
@ -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,80 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL dlg_base::handle_message(UINT msg, WPARAM wp, LPARAM lp)
|
||||
{
|
||||
|
@ -183,11 +243,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 +324,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 +402,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 +457,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 +990,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 +1010,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 +1022,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 +1032,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 +1284,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 +1317,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 +1333,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 +1526,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 +1555,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);
|
||||
|
|
|
@ -6,8 +6,17 @@
|
|||
#include <vector>
|
||||
#include <sane/sane_ex.h>
|
||||
#include <sane/sane_option_definitions.h>
|
||||
#include "const_str.h"
|
||||
|
||||
// CDlgIndicator 对话框
|
||||
#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)
|
||||
|
||||
|
@ -16,7 +25,7 @@
|
|||
#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,37 @@ 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);
|
||||
|
||||
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);
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
namespace gb
|
||||
{
|
||||
class sane_config_schm;
|
||||
class scanner_cfg;
|
||||
}
|
||||
class dlg_setting : public dlg_base
|
||||
{
|
||||
|
@ -29,9 +29,13 @@ class dlg_setting : public dlg_base
|
|||
bool err_;
|
||||
int id_help_;
|
||||
int id_restore_;
|
||||
gb::sane_config_schm* cfg_;
|
||||
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_;
|
||||
|
||||
#ifdef USE_SOLE_WIN_THREAD
|
||||
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
1774
sane/gb_json.cpp
1774
sane/gb_json.cpp
File diff suppressed because it is too large
Load Diff
155
sane/gb_json.h
155
sane/gb_json.h
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
74
sane/sane.rc
74
sane/sane.rc
|
@ -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"
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
247
sane/scanner.cpp
247
sane/scanner.cpp
|
@ -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, ¬ice);
|
||||
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)
|
||||
if (schm)
|
||||
{
|
||||
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);
|
||||
//schm->update(&scanner::is_option_float, handle_, &callback::option_title_2_name, ¬ice);
|
||||
//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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue