From 0e66d29b9018fe9d2dd9434dd2abd99d2e8b456f Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Mon, 27 Jun 2022 09:38:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=AE=BE=E7=BD=AE=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=89=AB=E6=8F=8F=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/DlgGamma.cpp | 106 ++++++++++++++++++++++++++++++++++++++---- sane/DlgGamma.h | 2 + sane/DlgIndicator.cpp | 10 +--- sane/DlgIndicator.h | 3 -- sane/DlgPage.cpp | 16 ++++++- sane/DlgPage.h | 6 ++- sane/DlgSetting.cpp | 15 ++---- sane/DlgSetting.h | 3 -- sane/scanner.cpp | 52 ++++++++++++++++----- sane/scanner.h | 4 +- 10 files changed, 169 insertions(+), 48 deletions(-) diff --git a/sane/DlgGamma.cpp b/sane/DlgGamma.cpp index 30eeff2..729e6da 100644 --- a/sane/DlgGamma.cpp +++ b/sane/DlgGamma.cpp @@ -95,6 +95,7 @@ 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) + , show_all_(false) { create(); } @@ -312,10 +313,12 @@ BYTE dlg_gamma::calc_value(BYTE x) y = 255.0f; if (y < .0f) y = .0f; - if (y < cur_->points[0].y) - y = cur_->points[0].y; - if (y > cur_->points[1].y) - y = cur_->points[1].y; + + bool upper = cur_->points[1].y > cur_->points[0].y; + if (y < cur_->points[!upper].y) + y = cur_->points[!upper].y; + if (y > cur_->points[upper].y) + y = cur_->points[upper].y; return y + .5f; } @@ -381,6 +384,15 @@ void dlg_gamma::draw_ellipse(HDC hdc, POINT center, int xl, int yl) DeleteObject(brsh); DeleteObject(rgn); } +void dlg_gamma::draw_current_curve(HDC hdc) +{ + MoveToEx(hdc, paint_area_.left + cur_->points[0].x, paint_area_.bottom - cur_->points[0].y, NULL); + for (int i = 0; i < 256; ++i) + { + int y = calc_value(i); + LineTo(hdc, paint_area_.left + i, paint_area_.bottom - y); + } +} void dlg_gamma::on_init_dlg(void) { @@ -433,13 +445,38 @@ void dlg_gamma::on_paint(HDC hdc) SelectObject(cdc, ob); DeleteDC(cdc); - MoveToEx(hdc, paint_area_.left, paint_area_.bottom, NULL); - for (int i = 0; i < 256; ++i) + if (show_all_) { - int y = calc_value(i); - LineTo(hdc, paint_area_.left + i, paint_area_.bottom - y); + GAMMACURVE* prev = cur_; + HPEN now = NULL; + + cur_ = &red_; + now = CreatePen(PS_SOLID, 1, cur_->clr); + SelectObject(hdc, now); + draw_current_curve(hdc); + + cur_ = &green_; + SelectObject(hdc, old); + DeleteObject(now); + now = CreatePen(PS_SOLID, 1, cur_->clr); + SelectObject(hdc, now); + draw_current_curve(hdc); + + cur_ = &blue_; + SelectObject(hdc, old); + DeleteObject(now); + now = CreatePen(PS_SOLID, 1, cur_->clr); + SelectObject(hdc, now); + draw_current_curve(hdc); + + SelectObject(hdc, pen); + DeleteObject(now); + cur_ = prev; } + else + draw_current_curve(hdc); SelectObject(hdc, drag); + for (int i = 0; i < cur_->points.size(); ++i) { draw_ellipse(hdc, cur_->points[i], 3, 3); @@ -497,9 +534,62 @@ void dlg_gamma::on_lbutton_up(int x, int y) } void dlg_gamma::on_combo_sel_changed(int id, int sel) { + show_all_ = false; if (id == IDC_SCHEME) { + if (sel == 1) + { + cur_ = &rgb_gray_; + init_curve(cur_); + cur_->points.clear(); + cur_->points.push_back({ 0, 255 }); + cur_->points.push_back({ 255, 0 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + } + else if (sel == 2) + { + show_all_ = true; + cur_ = &red_; + init_curve(cur_, cur_->clr); + cur_->points.clear(); + cur_->points.push_back({ 33, 255 }); + cur_->points.push_back({ 185, 0 }); + cur_->points.push_back({ 119, 127 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + cur_ = &green_; + init_curve(cur_, cur_->clr); + cur_->points.clear(); + cur_->points.push_back({ 28, 255 }); + cur_->points.push_back({ 132, 0 }); + cur_->points.push_back({ 77, 127 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + + cur_ = &blue_; + init_curve(cur_, cur_->clr); + cur_->points.clear(); + cur_->points.push_back({ 25, 255 }); + cur_->points.push_back({ 108, 0 }); + cur_->points.push_back({ 60, 127 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + + cur_ = &red_; + } + else if (sel == 3) + { + cur_ = &rgb_gray_; + init_curve(cur_); + cur_->points.push_back({ 130, 101 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + } + else if (sel == 4) + { + cur_ = &rgb_gray_; + init_curve(cur_); + cur_->points.push_back({ 103, 125 }); + cur_->coefs = calc::coefs_from_points(cur_->points); + } + InvalidateRect(hwnd(), NULL, FALSE); } else if (id == IDC_CHANNEL) { diff --git a/sane/DlgGamma.h b/sane/DlgGamma.h index 9f5052f..c0665ae 100644 --- a/sane/DlgGamma.h +++ b/sane/DlgGamma.h @@ -11,6 +11,7 @@ class dlg_gamma: public dlg_base { int exit_code_; bool is_color_; + bool show_all_; RECT paint_area_; HBITMAP bkgnd_; @@ -38,6 +39,7 @@ class dlg_gamma: public dlg_base bool is_adjacent(POINT p1, POINT p2); bool hit_test(int* x, int* y); void draw_ellipse(HDC hdc, POINT center, int xl, int yl); + void draw_current_curve(HDC hdc); void on_init_dlg(void); void on_paint(HDC hdc); diff --git a/sane/DlgIndicator.cpp b/sane/DlgIndicator.cpp index 19926e8..8544599 100644 --- a/sane/DlgIndicator.cpp +++ b/sane/DlgIndicator.cpp @@ -12,7 +12,7 @@ dlg_indicator::dlg_indicator(HWND parent) : dlg_base(parent, IDD_INDICATOR) - , papers_(0), images_(0), notify_(NULL), notify_param_(NULL), err_(false) + , papers_(0), images_(0), err_(false) { create(); SetWindowLongW(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE, GetWindowLong(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE) | SS_OWNERDRAW); @@ -113,15 +113,9 @@ void dlg_indicator::handle_command(WORD code, WORD id, HANDLE ctrl) } void dlg_indicator::notify_over(bool cancel) { - if (notify_) - notify_(cancel ? UI_EVENT_CLOSE_CANCEL : UI_EVENT_CLOSE_NORMAL, notify_param_); + notify_ui_event(cancel ? UI_EVENT_CLOSE_CANCEL : UI_EVENT_CLOSE_NORMAL); } -void dlg_indicator::set_quit_notify(void(__stdcall* notify)(ui_event, void*), void* param) -{ - notify_ = notify; - notify_param_ = param; -} HWND dlg_indicator::window(void) { return hwnd_; diff --git a/sane/DlgIndicator.h b/sane/DlgIndicator.h index 2dfaea1..d4a1353 100644 --- a/sane/DlgIndicator.h +++ b/sane/DlgIndicator.h @@ -12,8 +12,6 @@ class dlg_indicator : public dlg_base unsigned int papers_; unsigned int images_; bool err_; - void(__stdcall* notify_)(ui_event, void*); - void* notify_param_; BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override; void handle_command(WORD code, WORD id, HANDLE ctrl); @@ -24,7 +22,6 @@ public: ~dlg_indicator(); public: - void set_quit_notify(void(__stdcall* notify)(ui_event uev, void*), void* param); HWND window(void); HWND parent(void); void show(void); diff --git a/sane/DlgPage.cpp b/sane/DlgPage.cpp index a3639b9..8d2a208 100644 --- a/sane/DlgPage.cpp +++ b/sane/DlgPage.cpp @@ -25,7 +25,7 @@ extern HMODULE g_my_inst; std::wstring dlg_base::prop_name = L"dlg_base_object_prop_name"; -dlg_base::dlg_base(HWND parent, UINT idd) : parent_(parent), hwnd_(NULL), idd_(idd) +dlg_base::dlg_base(HWND parent, UINT idd) : parent_(parent), hwnd_(NULL), idd_(idd), ui_event_notify_(NULL), ui_notify_param_(NULL) { } dlg_base::~dlg_base() @@ -100,11 +100,25 @@ void dlg_base::create(void) { hwnd_ = CreateDialogParamW(g_my_inst, MAKEINTRESOURCE(idd_), parent_, &dlg_base::dlg_proc, (LPARAM)this); } +void dlg_base::notify_ui_event(ui_event ev) +{ + if (ui_event_notify_) + ui_event_notify_(ev, this, ui_notify_param_); +} +void dlg_base::set_ui_event_notify(void(__stdcall* notify)(ui_event, void*, void*), void* param) +{ + ui_event_notify_ = notify; + ui_notify_param_ = param; +} HWND dlg_base::hwnd(void) { return hwnd_; } +void dlg_base::enable(bool enable) +{ + EnableWindow(hwnd_, enable); +} void dlg_base::screen_2_client(LPRECT r) { POINT pt = { r->left, r->top }; diff --git a/sane/DlgPage.h b/sane/DlgPage.h index 179f6cd..64f1186 100644 --- a/sane/DlgPage.h +++ b/sane/DlgPage.h @@ -25,13 +25,15 @@ protected: HWND hwnd_; HWND parent_; UINT idd_; - + void(__stdcall* ui_event_notify_)(ui_event uev, void* sender, void* param); + void* ui_notify_param_; static std::wstring prop_name; static BOOL CALLBACK dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); virtual BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp); virtual void on_font_changed(void); void create(void); + void notify_ui_event(ui_event ev); public: dlg_base(HWND parent, UINT idd); @@ -41,7 +43,9 @@ public: static bool get_max_size(SIZE& dst, int cx, int cy); // return whether changed dst public: + void set_ui_event_notify(void(__stdcall* notify)(ui_event, void*, void*), void* param); HWND hwnd(void); + void enable(bool enable); void screen_2_client(LPRECT r); void client_2_screen(LPRECT r); HWND get_item(UINT id); diff --git a/sane/DlgSetting.cpp b/sane/DlgSetting.cpp index 9e94820..e2049e2 100644 --- a/sane/DlgSetting.cpp +++ b/sane/DlgSetting.cpp @@ -17,7 +17,7 @@ static IMPLEMENT_OPTION_STRING_COMPARE(cmp_sane_opt); dlg_setting::dlg_setting(HWND parent, LPSANEAPI api, SANE_Handle dev, bool with_scan, const wchar_t* name) : dlg_base(parent, IDD_SETTING) , sane_api_(*api), sane_dev_(dev), with_scan_(with_scan) - , papers_(0), images_(0), notify_(NULL), notify_param_(NULL), err_(false), tab_(NULL) + , papers_(0), images_(0), err_(false), tab_(NULL) { create(); SetWindowTextW(hwnd(), (std::wstring(name) + L" \u8bbe\u7f6e").c_str()); @@ -84,15 +84,13 @@ void dlg_setting::handle_command(WORD code, WORD id, HANDLE ctrl) } else if (id == IDC_BUTTON_SCAN) { - if (sane_api_.sane_start_api(sane_dev_) == SANE_STATUS_GOOD && - notify_) - notify_(UI_EVENT_BEGIN_SCANNING, notify_param_); + enable(false); + notify_ui_event(UI_EVENT_BEGIN_SCANNING); } } void dlg_setting::notify_over(void) { - if (notify_) - notify_(UI_EVENT_CLOSE_NORMAL, notify_param_); + notify_ui_event(UI_EVENT_CLOSE_NORMAL); } void dlg_setting::on_init_dialog(void) { @@ -330,11 +328,6 @@ void dlg_setting::refresh_controls(int src_sn) } } -void dlg_setting::set_quit_notify(void(__stdcall* notify)(ui_event, void*), void* param) -{ - notify_ = notify; - notify_param_ = param; -} HWND dlg_setting::window(void) { return hwnd_; diff --git a/sane/DlgSetting.h b/sane/DlgSetting.h index bb9c3ff..f419e5d 100644 --- a/sane/DlgSetting.h +++ b/sane/DlgSetting.h @@ -31,8 +31,6 @@ class dlg_setting : public dlg_base #ifdef USE_SOLE_WIN_THREAD std::unique_ptr thread_; #endif - void(__stdcall* notify_)(ui_event, void*); - void* notify_param_; BOOL handle_message(UINT msg, WPARAM wp, LPARAM lp) override; void handle_command(WORD code, WORD id, HANDLE ctrl); @@ -51,7 +49,6 @@ public: ~dlg_setting(); public: - void set_quit_notify(void(__stdcall* notify)(ui_event uev, void*), void* param); HWND window(void); HWND parent(void); void show(void); diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 246e185..92e716d 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -182,9 +182,9 @@ float __stdcall scanner::to_float(SANE_Fixed v) { return SANE_UNFIX(v); } -void __stdcall scanner::ui_callback(ui_event uev, void* param) +void __stdcall scanner::ui_callback(ui_event uev, void* sender, void* param) { - ((scanner*)param)->on_ui_quit(uev); + ((scanner*)param)->on_ui_quit(uev, sender); } // IRef @@ -197,16 +197,39 @@ COM_API_IMPLEMENT(scanner, long, release(void)) return refer::release(); } -void scanner::on_ui_quit(ui_event uev) +void scanner::on_ui_quit(ui_event uev, void* sender) { - if (uev == UI_EVENT_CLOSE_CANCEL) - stop(); - - ui_quit_ = uev != UI_EVENT_BEGIN_SCANNING; - if (cb_invoker_) + switch (uev) { - cb_invoker_(ui_quit_ ? SANE_EVENT_SCAN_FINISHED : SANE_EVENT_WORKING, NULL, NULL, cb_param_); + case UI_EVENT_CLOSE_CANCEL: // post from indicator + stop(); + case UI_EVENT_CLOSE_NORMAL: // post from indicator & dlg_setting + if (sender == indicator_.get() && setting_.get()) + { + setting_->hide(); + setting_.reset(); + } + else if (sender == setting_.get() && indicator_.get()) + { + indicator_->hide(); + indicator_.reset(); + } + ui_quit_ = true; + break; + case UI_EVENT_BEGIN_SCANNING: // post from dlg_setting, so we show indicator ... + if (start() == SANE_STATUS_GOOD) + { + if (indicator_.get()) + indicator_->show(); + } + else + setting_->enable(true); + break; + default: + break; } + if (cb_invoker_) + cb_invoker_(ui_quit_ ? SANE_EVENT_SCAN_FINISHED : SANE_EVENT_WORKING, NULL, NULL, cb_param_); } int scanner::open(void) { @@ -1860,7 +1883,14 @@ COM_API_IMPLEMENT(scanner, bool, ui_show_setting(HWND parent, bool with_scan)) api.sane_strstatus_api = inner_sane_strstatus; setting_.reset(new dlg_setting(parent, &api, handle_, with_scan, scanner_name_.c_str())); - setting_->set_quit_notify(&scanner::ui_callback, this); + setting_->set_ui_event_notify(&scanner::ui_callback, this); + if (with_scan) + { + indicator_.reset(new dlg_indicator(parent)); + indicator_->set_ui_event_notify(&scanner::ui_callback, this); + } + else + indicator_.reset(); setting_->show(); ui_quit_ = false; @@ -1869,7 +1899,7 @@ COM_API_IMPLEMENT(scanner, bool, ui_show_setting(HWND parent, bool with_scan)) COM_API_IMPLEMENT(scanner, bool, ui_show_progress(HWND parent)) { indicator_.reset(new dlg_indicator(parent)); - indicator_->set_quit_notify(&scanner::ui_callback, this); + indicator_->set_ui_event_notify(&scanner::ui_callback, this); indicator_->show(); ui_quit_ = false; diff --git a/sane/scanner.h b/sane/scanner.h index e2be44d..5c746c3 100644 --- a/sane/scanner.h +++ b/sane/scanner.h @@ -48,7 +48,7 @@ class scanner : public ISaneInvoker, virtual public refer std::unique_ptr indicator_; std::unique_ptr setting_; - void on_ui_quit(ui_event uev); + void on_ui_quit(ui_event uev, void* sender); int open(void); int close(void); int init_options_id(void); @@ -166,7 +166,7 @@ class scanner : public ISaneInvoker, virtual public refer static int __stdcall to_int(SANE_Int v); static float __stdcall to_float(SANE_Fixed v); - static void __stdcall ui_callback(ui_event uev, void* param); + static void __stdcall ui_callback(ui_event uev, void* sender, void* param); public: scanner(SCANNERID id);