From ffa101ae6b49c5466e210aeb74051676ccd3b5ae Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Fri, 23 Sep 2022 14:17:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BF=9D=E5=AD=98=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=88=B0user/appdata/local/product/config=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/DlgPage.cpp | 99 ++++++++++++++++++++++++++++++++++++++++ sane/DlgPage.h | 6 +++ sane/DlgSetting.cpp | 3 ++ sane/gb_json.cpp | 7 +++ sane/gb_json.h | 1 + sane/resource.h | 2 +- sane/scanner.cpp | 18 +++++++- twain/twain/huagaods.cpp | 9 ++++ 8 files changed, 142 insertions(+), 3 deletions(-) diff --git a/sane/DlgPage.cpp b/sane/DlgPage.cpp index 74aff59..e55c47c 100644 --- a/sane/DlgPage.cpp +++ b/sane/DlgPage.cpp @@ -68,6 +68,20 @@ BOOL CALLBACK dlg_base::dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) return ret; } +void dlg_base::screen_2_client(HWND wnd, LPRECT r) +{ + POINT pt = { r->left, r->top }; + + ScreenToClient(wnd, &pt); + OffsetRect(r, pt.x - r->left, pt.y - r->top); +} +void dlg_base::client_2_screen(HWND wnd, LPRECT r) +{ + POINT pt = { r->left, r->top }; + + ClientToScreen(wnd, &pt); + OffsetRect(r, pt.x - r->left, pt.y - r->top); +} bool dlg_base::get_max_size(SIZE& dst, const SIZE& src) { bool changed = false; @@ -120,6 +134,39 @@ int dlg_base::select_combo_text(HWND combo, const wchar_t* text) return ret; } +HWND dlg_base::create_tooltip_for(HWND ctrl, const wchar_t* tips) +{ + HWND tipwnd = CreateWindowExW(NULL, TOOLTIPS_CLASSW, NULL, + WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + ctrl, NULL, + GetModuleHandle(NULL), NULL), + parent = GetParent(ctrl); + + if (tipwnd) + { + TTTOOLINFOW toolInfo = { 0 }; + + SetWindowPos(tipwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + toolInfo.cbSize = sizeof(toolInfo); + toolInfo.hwnd = parent; + toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; + toolInfo.uId = (UINT_PTR)ctrl; + toolInfo.lpszText = (wchar_t*)(DWORD_PTR)tips; // LPSTR_TEXTCALLBACK - WM_NOTIFY.TTN_GETDISPINFO + toolInfo.hinst = GetModuleHandle(NULL); + GetWindowRect(ctrl, &toolInfo.rect); + dlg_base::screen_2_client(parent, &toolInfo.rect); + if (!SendMessageW(tipwnd, TTM_ADDTOOL, 0, (LPARAM)&toolInfo)) + { + DWORD err = GetLastError(); + DestroyWindow(tipwnd); + tipwnd = NULL; + } + } + + return tipwnd; +} BOOL dlg_base::handle_message(UINT msg, WPARAM wp, LPARAM lp) { @@ -131,6 +178,7 @@ void dlg_base::on_font_changed(void) } void dlg_base::create(void) { + // InitCommonControls(); hwnd_ = CreateDialogParamW(g_my_inst, MAKEINTRESOURCE(idd_), parent_, (DLGPROC)&dlg_base::dlg_proc, (LPARAM)this); } void dlg_base::notify_ui_event(int ev) @@ -266,12 +314,25 @@ void dlg_base::show_scroll_bar(int bar, bool show) SetWindowLong(hwnd(), GWL_STYLE, style); } } +bool dlg_base::track_mouse_hover(void) +{ + return true; + TRACKMOUSEEVENT tme = { 0 }; + + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_HOVER; + tme.dwHoverTime = HOVER_DEFAULT; + tme.hwndTrack = hwnd_; + + return TrackMouseEvent(&tme); +} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // dlg_page 对话框 std::wstring dlg_page::property_type = L"option_type"; std::wstring dlg_page::property_host = L"option_host_wnd"; std::wstring dlg_page::property_size = L"option_size"; +std::wstring dlg_page::property_tooltip_wnd = L"option_tooltips_wnd"; UINT dlg_page::dyn_id_base = 3000; int dlg_page::gap_x = 20; int dlg_page::gap_y = 15; @@ -294,7 +355,12 @@ dlg_page::dlg_page(HWND parent, const wchar_t* name dlg_page::~dlg_page() { for (auto& v : ctrls_) + { + HWND tooltip = (HWND)GetPropW(v, dlg_page::property_tooltip_wnd.c_str()); + if (tooltip) + DestroyWindow(tooltip); DestroyWindow(v); + } } BOOL dlg_page::handle_message(UINT msg, WPARAM wp, LPARAM lp) @@ -320,6 +386,10 @@ BOOL dlg_page::handle_message(UINT msg, WPARAM wp, LPARAM lp) if(hsb_) on_hscroll(HIWORD(wp), LOWORD(wp)); break; + case WM_MOUSEHOVER: + track_mouse_hover(); + on_mouse_hover(LOWORD(lp), HIWORD(lp), wp); + break; default: ret = FALSE; } @@ -711,6 +781,7 @@ BOOL dlg_page::on_notify(int ctrl_id, LPNMHDR pnmh) { wchar_t cls[128] = { 0 }; + pnmh->code == NM_TOOLTIPSCREATED; GetClassNameW((HWND)pnmh->hwndFrom, cls, _countof(cls) - 1); if (IS_TRACKBAR(cls)) { @@ -1072,6 +1143,28 @@ void dlg_page::on_hscroll(int pos, int sb_ev) SetScrollPos(hwnd(), SB_HORZ, hsb_pos_, TRUE); } } +void dlg_page::on_mouse_hover(int x, int y, int flag) +{ + POINT pt = { x, y }; + HWND ctrl = NULL; + + ClientToScreen(hwnd_, &pt); + ctrl = WindowFromPoint(pt); + if (IsWindow(ctrl)) + { + int id = GetWindowLong(ctrl, GWL_ID); + if (id > dlg_page::dyn_id_base) + { + id -= dlg_page::dyn_id_base; + const SANE_Option_Descriptor* desc = sane_.sane_get_option_descriptor_api(dev_, id); + if (desc) + { + std::wstring tips(local_trans::a2u(desc->title, CP_UTF8)); + // MessageBoxW(NULL, tips.c_str(), L"Tips", MB_OK); + } + } + } +} bool dlg_page::add_control(int sn, const SANE_Option_Descriptor* desc, void* cur_val) { @@ -1113,6 +1206,12 @@ bool dlg_page::add_control(int sn, const SANE_Option_Descriptor* desc, void* cur ret = IsWindow(wnd); if (ret) { + // if (desc->desc && *desc->desc) + // { + // HWND tooltip = dlg_base::create_tooltip_for(wnd, local_trans::a2u(desc->desc, CP_UTF8).c_str()); + // if (tooltip) + // SetPropW(wnd, dlg_page::property_tooltip_wnd.c_str(), tooltip); + // } SetPropW(wnd, dlg_page::property_type.c_str(), (HANDLE)creat[i].sane_type); SetPropW(wnd, dlg_page::property_size.c_str(), (HANDLE)desc->size); if (desc->cap & SANE_CAP_INACTIVE) diff --git a/sane/DlgPage.h b/sane/DlgPage.h index 3bdfcef..c92460c 100644 --- a/sane/DlgPage.h +++ b/sane/DlgPage.h @@ -41,9 +41,12 @@ public: dlg_base(HWND parent, UINT idd); virtual ~dlg_base(); + static void screen_2_client(HWND wnd, LPRECT r); + static void client_2_screen(HWND wnd, LPRECT r); 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 HWND create_tooltip_for(HWND ctrl, const wchar_t* tips); public: void set_ui_event_notify(void(__stdcall* notify)(int, void*, void*), void* param); @@ -57,6 +60,7 @@ public: HFONT get_font(void); int get_string_width(const wchar_t* str); void show_scroll_bar(int bar = SB_VERT, bool show = true); + bool track_mouse_hover(void); }; class dlg_page : public dlg_base @@ -85,6 +89,7 @@ class dlg_page : public dlg_base static std::wstring property_type; static std::wstring property_host; static std::wstring property_size; + static std::wstring property_tooltip_wnd; static UINT dyn_id_base; static int gap_x; static int gap_y; @@ -123,6 +128,7 @@ class dlg_page : public dlg_base BOOL on_mouse_wheel(WORD vkey, short delta, short x, short y); void on_vscroll(int pos, int sb_ev); void on_hscroll(int pos, int sb_ev); + void on_mouse_hover(int x, int y, int flag); public: dlg_page(HWND parent, const wchar_t* name, LPSANEAPI api, SANE_Handle dev); diff --git a/sane/DlgSetting.cpp b/sane/DlgSetting.cpp index db11dab..87af1ef 100644 --- a/sane/DlgSetting.cpp +++ b/sane/DlgSetting.cpp @@ -74,6 +74,9 @@ void dlg_setting::handle_command(WORD code, WORD id, HANDLE ctrl) { if (id == IDOK) { + if (cfg_) + cfg_->save_to(NULL); + notify_over(); } else if (id == IDC_BUTTON_HELP) diff --git a/sane/gb_json.cpp b/sane/gb_json.cpp index 0dfbae1..fd282d3 100644 --- a/sane/gb_json.cpp +++ b/sane/gb_json.cpp @@ -833,6 +833,7 @@ namespace gb if (bkp_) delete bkp_; bkp_ = NULL; + file_ = L""; } std::string sane_config::to_hex_letter(const char* data, size_t bytes) { @@ -901,7 +902,10 @@ namespace gb { jsn_ = new gb::json(); if (jsn_->attach_text(&raw[0])) + { ret = true; + file_ = file; + } else { delete jsn_; @@ -934,6 +938,9 @@ namespace gb bool ret = false; std::string encode(to_text_stream()); + if (!file || *file == 0) + file = file_.c_str(); + if (encode.length()) { FILE* dst = _wfopen(file, L"wb"); diff --git a/sane/gb_json.h b/sane/gb_json.h index cbec517..b7064ca 100644 --- a/sane/gb_json.h +++ b/sane/gb_json.h @@ -81,6 +81,7 @@ namespace gb class sane_config { + std::wstring file_; json* jsn_; json* bkp_; json* def_val_; diff --git a/sane/resource.h b/sane/resource.h index 022ebaa..278e6aa 100644 --- a/sane/resource.h +++ b/sane/resource.h @@ -33,7 +33,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 108 +#define _APS_NEXT_RESOURCE_VALUE 109 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1020 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 3bf5b63..ad6bc1e 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -125,6 +125,16 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS { cfg_ = new gb::sane_config(); tmp_path_ = local_trans::a2u(hg_sane_middleware::sane_path().c_str()); + { + char* tmp = getenv("LOCALAPPDATA"); + + if (tmp) + { + tmp_path_ = local_trans::a2u(tmp) + L"\\"; + tmp_path_ += local_trans::a2u(PRODUCT_VENDOR) + L"Scan\\"; + CreateDirectoryW(tmp_path_.c_str(), NULL); + } + } cfg_path_ = tmp_path_ + L"config"; CreateDirectoryW(cfg_path_.c_str(), NULL); cfg_path_ += L"\\"; @@ -138,6 +148,7 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS } scanner::~scanner() { + close(); if (cfg_) delete cfg_; } @@ -290,8 +301,8 @@ int scanner::open(void) callback::reg_callback(handle_, this); scanner_name_ = local_trans::a2u(name.c_str(), CP_UTF8); ret = init_options_id(); - load_config((cfg_path_ + scanner_name_).c_str()); - // apply_config(); + load_config((cfg_path_ + scanner_name_ + L".cfg").c_str()); + apply_config(); } else { @@ -305,7 +316,10 @@ int scanner::close(void) { callback::unreg_callback(this); if (handle_) + { hg_sane_middleware::instance()->close_device(handle_); + // save_config((cfg_path_ + scanner_name_ + L".cfg").c_str()); + } handle_ = NULL; ex_id_ = EXTENSION_ID_BASE; diff --git a/twain/twain/huagaods.cpp b/twain/twain/huagaods.cpp index cb3d1dd..fc2ca27 100644 --- a/twain/twain/huagaods.cpp +++ b/twain/twain/huagaods.cpp @@ -1225,6 +1225,15 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin) conv.dst.data_len = target.length(); while (!MoveFileA(target.c_str(), file.c_str())) { + if (cv_e == 0) + { + std::wstring info(L"[convert image format] Move '"); + wchar_t buf[80] = { 0 }; + + swprintf_s(buf, _countof(buf) - 1, L"%d\r\n", GetLastError()); + info += load_sane_util::ansi2unic(target.c_str()) + L"' to '" + load_sane_util::ansi2unic(file.c_str()) + L"' failed: "; + load_sane_util::log_info((info + buf).c_str(), 0); + } if (++cv_e >= 9) break; Sleep(30);