code_twain/sane/DlgIndicator.cpp

316 lines
8.2 KiB
C++
Raw Normal View History

2022-06-18 08:48:41 +00:00
// DlgIndicator.cpp: 实现文件
//
#include "DlgIndicator.h"
#include "resource.h"
#include "scanned_img.h" // for local_trans
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// dlg_choose_dev
2022-06-18 08:48:41 +00:00
// CDlgIndicator 对话框
dlg_indicator::dlg_indicator(HWND parent) : dlg_base(parent, IDD_INDICATOR)
, papers_(0), images_(0), err_(false), finish_(false)
2022-06-18 08:48:41 +00:00
{
create();
SetWindowLongW(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE, GetWindowLong(GetDlgItem(hwnd_, IDC_STATIC_ERR), GWL_STYLE) | SS_OWNERDRAW);
2023-01-29 07:03:32 +00:00
if (!dlg_base::is_language_pack_default_code_page())
{
std::wstring text(local_trans::lang_trans_between_hz936(CONST_STRING_SCANNING));
2023-01-29 07:03:32 +00:00
SetWindowTextW(hwnd(), text.c_str());
text = local_trans::lang_trans_between_hz936(CONST_STRING_PAPER);
2023-01-29 07:03:32 +00:00
set_item_text(IDC_STATIC_PAPER, text.c_str());
text = local_trans::lang_trans_between_hz936(CONST_STRING_IMAGE);
2023-01-29 07:03:32 +00:00
set_item_text(IDC_STATIC_IMAGE, text.c_str());
text = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
2023-01-29 07:03:32 +00:00
set_item_text(IDCANCEL, text.c_str());
int paper = get_width_diff_as_text_length(IDC_STATIC_PAPER),
img = get_width_diff_as_text_length(IDC_STATIC_IMAGE),
btn = get_width_diff_as_text_length(IDCANCEL),
diff = paper >= img + btn ? paper : img + btn;
if (diff > 0)
{
RECT r = { 0 };
GetWindowRect(hwnd(), &r);
r.right += diff;
MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE);
expand_item(IDC_STATIC_PAPER, paper, 0);
offset_item(IDC_EDIT_PAPER, paper, 0);
expand_item(IDC_STATIC_IMAGE, img, 0);
offset_item(IDC_EDIT_IMAGE, img, 0);
offset_item(IDCANCEL, diff - btn, 0);
expand_item(IDCANCEL, btn, 0);
}
}
2022-06-18 08:48:41 +00:00
}
dlg_indicator::~dlg_indicator()
{
}
BOOL dlg_indicator::handle_message(UINT msg, WPARAM wp, LPARAM lp)
2022-06-18 08:48:41 +00:00
{
wchar_t text[40] = { 0 };
BOOL ret = TRUE;
switch (msg)
{
case WM_INITDIALOG:
swprintf_s(text, _countof(text) - 1, L"%u", papers_);
SetDlgItemTextW(hwnd_, IDC_EDIT_IMAGE, text);
SetDlgItemTextW(hwnd_, IDC_EDIT_PAPER, text);
UpdateWindow(hwnd_);
2022-06-18 08:48:41 +00:00
break;
case WM_USB_PACKET_RECEIVED:
papers_++;
swprintf_s(text, _countof(text) - 1, L"%u", papers_);
SetDlgItemTextW(hwnd_, IDC_EDIT_PAPER, text);
UpdateWindow(hwnd_);
break;
case WM_IMAGE_RECEIVED:
images_++;
swprintf_s(text, _countof(text) - 1, L"%u", images_);
SetDlgItemTextW(hwnd_, IDC_EDIT_IMAGE, text);
UpdateWindow(hwnd_);
break;
case WM_COMMAND:
handle_command(HIWORD(wp), LOWORD(wp), (HWND)lp);
break;
case WM_DRAWITEM:
if (wp == IDC_STATIC_ERR)
{
DRAWITEMSTRUCT* ds = (DRAWITEMSTRUCT*)lp;
wchar_t text[128] = { 0 };
HBRUSH brsh = CreateSolidBrush(GetBkColor(ds->hDC));
FillRect(ds->hDC, &ds->rcItem, brsh);
DeleteObject(brsh);
2022-06-18 08:48:41 +00:00
GetWindowTextW(ds->hwndItem, text, _countof(text) - 1);
SetBkMode(ds->hDC, TRANSPARENT);
SetTextColor(ds->hDC, err_ ? RGB(255, 0, 0) : RGB(0, 0, 0));
2022-06-18 08:48:41 +00:00
TextOutW(ds->hDC, 0, 0, text, lstrlenW(text));
}
ret = FALSE;
break;
2022-07-01 07:24:58 +00:00
case WM_SCAN_WORKING:
notify_ui_event(SANE_EVENT_WORKING);
2022-07-01 07:24:58 +00:00
break;
2022-06-18 08:48:41 +00:00
case WM_SCAN_FINISHED:
finish_ = true;
2022-06-18 08:48:41 +00:00
if (lp)
{
std::string* str = (std::string*)wp;
std::wstring err(local_trans::a2u(str->c_str(), CP_UTF8));
SetDlgItemTextW(hwnd_, IDC_STATIC_ERR, err.c_str());
delete str;
}
else
{
std::string* str = (std::string*)wp;
std::wstring txt(local_trans::lang_trans_between_hz936(CONST_STRING_TOTAL_SCANNED));
2022-06-18 08:48:41 +00:00
2023-01-29 07:03:32 +00:00
txt += L": " + std::to_wstring(images_);
SetDlgItemTextW(hwnd_, IDC_STATIC_ERR, txt.c_str());
2022-06-18 08:48:41 +00:00
delete str;
SetTimer(hwnd_, 1, 3000, NULL);
}
SetDlgItemTextW(hwnd_, IDCANCEL, local_trans::lang_trans_between_hz936(CONST_STRING_CLOSE).c_str());
2022-06-18 08:48:41 +00:00
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_, local_trans::lang_trans_between_hz936(CONST_STRING_SCAN_OVER).c_str());
2022-06-18 08:48:41 +00:00
UpdateWindow(hwnd_);
break;
case WM_TIMER:
if (wp == 1)
{
KillTimer(hwnd_, wp);
notify_over(false);
2022-06-18 08:48:41 +00:00
break;
}
default:
ret = FALSE;
break;
}
return ret;
}
void dlg_indicator::handle_command(WORD code, WORD id, HANDLE ctrl)
{
if (id == IDCANCEL)
{
notify_over(!finish_);
2022-06-18 08:48:41 +00:00
}
}
void dlg_indicator::notify_over(bool cancel)
2022-06-18 08:48:41 +00:00
{
2022-09-20 04:41:32 +00:00
notify_ui_event(cancel ? SANE_EVENT_UI_CLOSE_CANCEL : SANE_EVENT_UI_CLOSE_NORMAL);
2022-06-18 08:48:41 +00:00
}
HWND dlg_indicator::window(void)
{
return hwnd_;
}
HWND dlg_indicator::parent(void)
{
return parent_;
}
void dlg_indicator::notify_data_arrived(bool image)
{
SendMessage(hwnd_, image ? WM_IMAGE_RECEIVED : WM_USB_PACKET_RECEIVED, 0, 0); // PostMessage 存在消息合并/遗漏的现象改用Send
2022-06-18 08:48:41 +00:00
}
void dlg_indicator::notify_scan_over(const char* msg, bool err)
{
std::string* mstr(new std::string(msg ? msg : ""));
err_ = err;
if (!PostMessage(hwnd_, WM_SCAN_FINISHED, (WPARAM)mstr, (LPARAM)err))
{
delete mstr;
notify_over(false);
2022-06-18 08:48:41 +00:00
}
}
2022-07-01 07:24:58 +00:00
void dlg_indicator::notify_working(void)
{
PostMessage(hwnd_, WM_SCAN_WORKING, 0, 0);
}
2022-06-18 08:48:41 +00:00
// CDlgIndicator 消息处理程序
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// dlg_choose_dev
///
dlg_choose_dev::dlg_choose_dev(HWND parent, const std::vector<DEVQUE>& devs) : dlg_base(parent, IDD_CHOOSE_DEV), item_(-1)
{
create();
HWND lst = GetDlgItem(hwnd_, IDC_LIST1);
LV_COLUMNW col = { 0 };
int ind = 0;
std::wstring text(local_trans::lang_trans_between_hz936(CONST_STRING_CHOOSE_DEVICE));
2023-01-29 07:03:32 +00:00
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 = local_trans::lang_trans_between_hz936(CONST_STRING_DEVICE_NAME);
2023-01-29 07:03:32 +00:00
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
text = local_trans::lang_trans_between_hz936(CONST_STRING_SERIAL_NUM);
2023-01-29 07:03:32 +00:00
col.pszText = &text[0];
SendMessageW(lst, LVM_INSERTCOLUMN, ind++, (LPARAM)&col);
ind = 0;
for (const auto& v: devs)
{
std::wstring n(local_trans::a2u(v.name.c_str(), CP_UTF8)),
s(local_trans::a2u(v.sn.c_str(), CP_UTF8));
LV_ITEM item = { 0 };
int ind = 0;
item.mask = LVIF_TEXT;
item.pszText = &n[0];
item.iItem = ListView_GetItemCount(lst);
ind = SendMessageW(lst, LVM_INSERTITEMW, 0, (LPARAM)&item);
item.pszText = &s[0];
item.iSubItem = 1;
item.iItem = ind;
SendMessageW(lst, LVM_SETITEMTEXTW, ind, (LPARAM)&item);
if (ind++ == 0)
{
item_ = 0;
ListView_SetItemState(lst, ind, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
2022-10-09 06:34:35 +00:00
SetFocus(lst);
}
}
2023-01-29 07:03:32 +00:00
text = local_trans::lang_trans_between_hz936(CONST_STRING_CANCEL);
2023-01-29 07:03:32 +00:00
set_item_text(IDCANCEL, text.c_str());
text = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
2023-01-29 07:03:32 +00:00
set_item_text(IDOK, text.c_str());
}
dlg_choose_dev::~dlg_choose_dev()
{}
BOOL dlg_choose_dev::handle_message(UINT msg, WPARAM wp, LPARAM lp)
{
wchar_t text[40] = { 0 };
BOOL ret = TRUE;
switch (msg)
{
case WM_COMMAND:
handle_command(HIWORD(wp), LOWORD(wp), (HWND)lp);
break;
case WM_NOTIFY:
handle_notify(wp, (LPNMHDR)lp);
break;
default:
ret = FALSE;
break;
}
return ret;
}
void dlg_choose_dev::handle_command(WORD code, WORD id, HANDLE ctrl)
{
if (id == IDOK)
{
HWND lst = GetDlgItem(hwnd_, IDC_LIST1);
if (item_ >= 0 && item_ < ListView_GetItemCount(lst))
{
wchar_t buf[128] = { 0 };
ListView_GetItemText(lst, item_, 0, buf, _countof(buf) - 1);
sel_ = local_trans::u2a(buf, CP_UTF8);
}
id = IDCANCEL;
}
if (id == IDCANCEL)
{
abandon_hold_ = true;
PostMessage(hwnd_, 0, 0, 0);
}
}
void dlg_choose_dev::handle_notify(UINT id, LPNMHDR pnhdr)
{
if (pnhdr->hwndFrom == GetDlgItem(hwnd_, IDC_LIST1))
{
if (pnhdr->code == LVN_ITEMCHANGED)
{
LPNMHEADER h = (LPNMHEADER)pnhdr;
item_ = h->iItem;
}
else if (pnhdr->code == NM_DBLCLK)
{
handle_command(0, IDOK, NULL);
}
}
}
std::string dlg_choose_dev::get_selected_device(void)
{
return sel_;
}