// scanner-checkDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "scanner-check.h" #include "scanner-checkDlg.h" #include "afxdialogex.h" #include #pragma comment(lib, "imm32.lib") #ifdef _DEBUG #define new DEBUG_NEW #endif #include "CDlgMgr.h" #include "CDlgItemMgr.h" #include #include // CscannercheckDlg 对话框 CscannercheckDlg::CscannercheckDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_SCANNERCHECK_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CscannercheckDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, tab_); DDX_Control(pDX, IDC_COMBO1, combo_); } BEGIN_MESSAGE_MAP(CscannercheckDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_EXPORT, &CscannercheckDlg::OnBnClickedButtonExport) ON_CBN_SELCHANGE(IDC_COMBO1, &CscannercheckDlg::OnCbnSelchangeCombo1) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CscannercheckDlg::OnTcnSelchangeTab1) ON_NOTIFY(TCN_SELCHANGING, IDC_TAB1, &CscannercheckDlg::OnTcnSelchangingTab1) ON_MESSAGE(WM_TO_ITEM_MGR_TAB, &CscannercheckDlg::on_to_item_manager_tab) ON_MESSAGE(WM_GET_TEST_ITEM_NAME, &CscannercheckDlg::on_name_from_title) ON_MESSAGE(WM_GET_TEST_ITEM_TITLE, &CscannercheckDlg::on_name_to_title) ON_MESSAGE(WM_TEST_ITEM_CHANGED, &CscannercheckDlg::on_test_item_changed) END_MESSAGE_MAP() void CscannercheckDlg::add_page(const wchar_t* title, CDialogEx* child) { RECT r = { 0 }; int ind = 0; TCITEM item = { 0 }; GetDlgItem(IDC_STATIC_RECT)->GetWindowRect(&r); ScreenToClient(&r); child->MoveWindow(&r); ind = tab_.InsertItem(tab_.GetItemCount(), title); item.lParam = (LPARAM)child; item.mask = TCIF_PARAM; tab_.SetItem(ind, &item); } // CscannercheckDlg 消息处理程序 BOOL CscannercheckDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // 工作台配置; DLL配置; int ind = combo_.AddString(TEXT("DLL \u914D\u7F6E")); combo_.SetItemData(ind, (DWORD_PTR)1); ind = combo_.AddString(TEXT("\u5DE5\u4F5C\u53F0\u914D\u7F6E")); combo_.SetItemData(ind, NULL); combo_.SetCurSel(ind); OnCbnSelchangeCombo1(); SetDlgItemInt(IDC_EDIT_VER, 1); // TODO: 在此添加额外的初始化代码 mgr_ = new CDlgMgr(this); mgr_->Create(IDD_MANAGER, this); add_page(L"\u6D4B\u8BD5\u9879\u76EE\u914D\u7F6E", mgr_); mgr_->ShowWindow(SW_SHOW); items_ = new CDlgItemMgr(this); items_->Create(IDD_TEST_ITEM, this); add_page(L"\u6D4B\u8BD5\u9879\u76EE\u5E93\u7BA1\u7406", items_); items_->ShowWindow(SW_HIDE); on_test_item_changed(0, 0); // ImmDisableIME(0); return FALSE; // 除非将焦点设置到控件,否则返回 TRUE } void CscannercheckDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CscannercheckDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CscannercheckDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } INTER_MODULE_CALLBACK(got_str) { *((std::string*)param) += std::string(data, len); return inter_module_data::SET_RESULT_CONTINUE; } void CscannercheckDlg::OnBnClickedButtonExport() { // TODO: 在此添加控件通知处理程序代码 int ind = tab_.GetCurSel(), ver = GetDlgItemInt(IDC_EDIT_VER); TCITEM item = { 0 }; item.mask = TCIF_PARAM; tab_.GetItem(ind, &item); if (!item.lParam) { MessageBox(TEXT("\u4E22\u5931\u8BBE\u7F6E\u9875\u9762\u5BF9\u8C61\u6307\u9488"), TEXT("\u9519\u8BEF"), MB_OK); return; } bool ok = true, code = (bool)combo_.GetItemData(combo_.GetCurSel()); std::wstring text((dynamic_cast((CWnd*)item.lParam))->export_config(&ok, code, ver)); if (!ok) { ::MessageBoxW(m_hWnd, text.c_str(), L"\u9519\u8BEF", MB_OK); return; } if (file_util::set_clipboard(text.c_str(), text.length() * 2, CF_UNICODETEXT)) { file_util::PATHFILE path = { 0 }; if (file_util::browser_file(m_hWnd, &path, L"All Files(*.*)\0\0\0", false, L"\u8BF7\u9009\u62E9\u6587\u4EF6\u4FDD\u5B58\u8DEF\u5F84")) { std::string bom(""); coding_util::bom::from_unicode(text.c_str(), text.length() * 2, got_str, &bom); file_util::save_2_file(bom.c_str(), bom.length(), path.path); file_util::display_file_in_explorer(path.path); } } else { ::MessageBoxW(m_hWnd, L"\u5BFC\u51FA\u5185\u5BB9\u5DF2\u62F7\u8D1D\u5230\u526A\u8D34\u677F", L"\u5BFC\u51FA\u5B8C\u6210", MB_OK | MB_ICONINFORMATION); } } void CscannercheckDlg::OnCbnSelchangeCombo1() { // TODO: 在此添加控件通知处理程序代码 bool dll = (bool)combo_.GetItemData(combo_.GetCurSel()); GetDlgItem(IDC_STATIC_VER)->EnableWindow(dll); GetDlgItem(IDC_EDIT_VER)->EnableWindow(dll); if (dll) GotoDlgCtrl(GetDlgItem(IDC_EDIT_VER)); } void CscannercheckDlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: 在此添加控件通知处理程序代码 *pResult = 0; TCITEM item = { 0 }; page_config* page = NULL; item.mask = TCIF_PARAM; tab_.GetItem(tab_.GetCurSel(), &item); page = dynamic_cast((CWnd*)item.lParam); GetDlgItem(IDC_BUTTON_EXPORT)->EnableWindow(page != NULL); ((CWnd*)item.lParam)->ShowWindow(SW_SHOW); } void CscannercheckDlg::OnTcnSelchangingTab1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: 在此添加控件通知处理程序代码 *pResult = 0; *pResult = 0; TCITEM item = { 0 }; item.mask = TCIF_PARAM; tab_.GetItem(tab_.GetCurSel(), &item); ((CWnd*)item.lParam)->ShowWindow(SW_HIDE); } LRESULT CscannercheckDlg::on_to_item_manager_tab(WPARAM, LPARAM) { LRESULT result = 0; OnTcnSelchangingTab1(NULL, &result); tab_.SetCurSel(1); OnTcnSelchangeTab1(NULL, &result); return 0; } LRESULT CscannercheckDlg::on_name_from_title(WPARAM wp, LPARAM lp) { std::wstring title((wchar_t*)wp); page_config::ITEM* item = (page_config::ITEM*)lp; items_->get_name(title.c_str(), item); return 0; } LRESULT CscannercheckDlg::on_name_to_title(WPARAM wp, LPARAM lp) { std::wstring name((wchar_t*)wp); page_config::ITEM* item = (page_config::ITEM*)lp; items_->get_title(name.c_str(), item); return 0; } LRESULT CscannercheckDlg::on_test_item_changed(WPARAM wp, LPARAM lp) { std::vector items; items_->get_all_items(items); mgr_->init_test_items(items); return 0; }