support clipboard

This commit is contained in:
gb 2022-12-09 16:56:15 +08:00
parent fbe5cc77eb
commit 6d2cee6139
10 changed files with 152 additions and 25 deletions

View File

@ -279,6 +279,23 @@ bool CDlgItemMgr::get_name(const wchar_t* title, page_config::ITEM* item)
return false;
}
bool CDlgItemMgr::get_title(const wchar_t* name, page_config::ITEM* item)
{
wchar_t text[128] = { 0 };
for (size_t i = 0; i < list_.GetItemCount(); ++i)
{
list_.GetItemText(i, 1, text, _countof(text) - 1);
if (wcscmp(text, name) == 0)
{
get_item(i, item);
return true;
}
text[0] = 0;
}
return false;
}
void CDlgItemMgr::get_all_items(std::vector<page_config::ITEM>& items)
{
wchar_t text[128] = { 0 };
@ -305,3 +322,4 @@ void CDlgItemMgr::OnDropFiles(HDROP hDropInfo)
CDialogEx::OnDropFiles(hDropInfo);
}

View File

@ -35,6 +35,7 @@ public:
afx_msg void OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBnClickedButtonAdd();
bool get_name(const wchar_t* title, page_config::ITEM* item);
bool get_title(const wchar_t* name, page_config::ITEM* item);
void get_all_items(std::vector<page_config::ITEM>& items);
afx_msg void OnDropFiles(HDROP hDropInfo);
};

View File

@ -73,8 +73,8 @@ static LRESULT vid_pid_edit_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
else if(wp >= ' ')
return 0;
break;
case WM_COPY:
return 0;
//case WM_COPY:
// return 0;
case WM_PASTE:
{
size_t l = 0;
@ -175,6 +175,9 @@ BEGIN_MESSAGE_MAP(CDlgMgr, CDialogEx)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CDlgMgr::OnNMDblclkList1)
ON_BN_CLICKED(IDC_BUTTON_ADD_ALL, &CDlgMgr::OnBnClickedButtonAddAll)
ON_WM_DROPFILES()
// ON_WM_GETDLGCODE()
ON_COMMAND(ID_LIST_PASTE_CLIPBOARD, &CDlgMgr::OnListPasteClipboard)
ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CDlgMgr::OnNMRClickList1)
END_MESSAGE_MAP()
static DWORD WINAPI disable_ip_ctrl(LPVOID lp)
@ -431,28 +434,28 @@ std::wstring CDlgMgr::export_config(bool *ok, bool used_in_code, int code_ver)
GotoDlgCtrl(GetDlgItem(IDC_EDIT_VID_SRC));
jsn->release();
return L"请重新输入 源VID!";
return L"\u8BF7\u91CD\u65B0\u8F93\u5165 \u6E90\uFF36\uFF29\uFF24\uFF01";
}
if (!pid_f)
{
GotoDlgCtrl(GetDlgItem(IDC_EDIT_PID_SRC));
jsn->release();
return L"请重新输入 源PID!";
return L"\u8BF7\u91CD\u65B0\u8F93\u5165 \u6E90\uFF30\uFF29\uFF24\uFF01";
}
if (!vid_t)
{
GotoDlgCtrl(GetDlgItem(IDC_EDIT_VID_TO));
jsn->release();
return L"请重新输入 目标VID!";
return L"\u8BF7\u91CD\u65B0\u8F93\u5165 \u76EE\u6807\uFF36\uFF29\uFF24\uFF01";
}
if (!pid_t)
{
GotoDlgCtrl(GetDlgItem(IDC_EDIT_PID_TO));
jsn->release();
return L"请重新输入 目标PID!";
return L"\u8BF7\u91CD\u65B0\u8F93\u5165 \u76EE\u6807\uFF30\uFF29\uFF24\uFF01";
}
if (report)
@ -484,7 +487,7 @@ std::wstring CDlgMgr::export_config(bool *ok, bool used_in_code, int code_ver)
if (list_.GetItemCount() == 0)
{
jsn->release();
return L"没有输入有效的测试项目!";
return L"\u6CA1\u6709\u8F93\u5165\u6709\u6548\u7684\u6D4B\u8BD5\u9879\u76EE\uFF01";
}
for (size_t i = 0; i < list_.GetItemCount(); ++i)
@ -544,7 +547,7 @@ std::wstring CDlgMgr::export_config(bool *ok, bool used_in_code, int code_ver)
while (ret[pos - 1] == L'\\')
pos++;
lines++;
swprintf_s(var, _countof(var) - 1, L"\");\r\nstatic std::string jsontext%d(\"", lines);
swprintf_s(var, _countof(var) - 1, L"\");\r\nstatic std::wstring jsontext%d(L\"", lines);
ret.insert(pos, var);
}
ret.insert(0, L"static std::string jsontext1(\"");
@ -558,17 +561,34 @@ std::wstring CDlgMgr::export_config(bool *ok, bool used_in_code, int code_ver)
void CDlgMgr::OnDropFiles(HDROP hDropInfo)
static void trans_code_json(std::wstring& json)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
wchar_t path[MAX_PATH] = { 0 };
std::wstring cont(L"");
std::string bom("");
size_t pos = json.find(L"(L\"");
DragQueryFileW(hDropInfo, 0, path, _countof(path) - 1);
file_util::load_file(path, got_str, &bom);
coding_util::bom::to_unicode(bom.c_str(), bom.length(), got_wstr, &cont);
if (pos == std::wstring::npos)
return;
json.erase(0, pos + 3);
pos = json.rfind(L'\"');
if (pos != std::wstring::npos)
json.erase(pos);
pos = 0;
while ((pos = json.find(L"\\\""), pos) != std::wstring::npos)
{
json.erase(pos++, 1);
}
pos = 0;
while ((pos = json.find(L"\\"), pos) != std::wstring::npos)
{
json.erase(pos++, 1);
}
}
void CDlgMgr::reload(std::wstring& cont)
{
if (cont.find(L"static std::wstring") == 0)
trans_code_json(cont);
known_file_util::IJsonW* jsn = known_file_util::create_jsonW();
if (jsn->attach(cont.c_str()))
@ -614,13 +634,14 @@ void CDlgMgr::OnDropFiles(HDROP hDropInfo)
list_.DeleteAllItems();
for (int i = 1; 1; ++i)
{
swprintf_s(path, _countof(path) - 1, L"%d", i);
if (!jsn->get_value(path, &child))
wchar_t sn[20] = { 0 };
swprintf_s(sn, _countof(sn) - 1, L"%d", i);
if (!jsn->get_value(sn, &child))
break;
if (child->get_value(L"title", &val))
{
int ind = list_.InsertItem(list_.GetItemCount(), path);
int ind = list_.InsertItem(list_.GetItemCount(), sn);
list_.SetItemText(ind, 1, val);
if (child->get_value(L"err-level", &val))
@ -630,10 +651,78 @@ void CDlgMgr::OnDropFiles(HDROP hDropInfo)
child->get_value(L"man", man);
list_.SetItemText(ind, 2, !man ? L"true" : L"false");
}
else if (child->get_value(L"name", &val))
{
page_config::ITEM item;
::SendMessageW(GetParent()->m_hWnd, WM_GET_TEST_ITEM_TITLE, (WPARAM)val, (LPARAM)&item);
int ind = list_.InsertItem(list_.GetItemCount(), sn);
list_.SetItemText(ind, 1, item.title.c_str());
list_.SetItemText(ind, 2, !item.man ? L"true" : L"false");
list_.SetItemText(ind, 3, item.fatal ? L"true" : L"false");
child->get_value(L"ver", ind);
SetDlgItemInt(IDC_EDIT_VER, ind);
}
child->release();
}
}
jsn->release();
}
void CDlgMgr::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
wchar_t path[MAX_PATH] = { 0 };
std::wstring cont(L"");
std::string bom("");
DragQueryFileW(hDropInfo, 0, path, _countof(path) - 1);
file_util::load_file(path, got_str, &bom);
coding_util::bom::to_unicode(bom.c_str(), bom.length(), got_wstr, &cont);
reload(cont);
__super::OnDropFiles(hDropInfo);
}
//UINT CDlgMgr::OnGetDlgCode()
//{
// // TODO: 在此添加消息处理程序代码和/或调用默认值
//
// return __super::OnGetDlgCode();
//}
void CDlgMgr::OnListPasteClipboard()
{
// TODO: 在此添加命令处理程序代码
wchar_t* buf = NULL;
size_t len = 0;
if (file_util::get_clipboard(buf, &len, CF_UNICODETEXT) == ERROR_INSUFFICIENT_BUFFER)
{
buf = new wchar_t[len + 8];
memset(buf, 0, (len + 8) * 2);
len++;
if (file_util::get_clipboard(buf, &len, CF_UNICODETEXT) == ERROR_SUCCESS)
{
std::wstring cont(buf);
reload(cont);
}
delete[] buf;
}
}
void CDlgMgr::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
POINT pt = { 0 };
CMenu menu;
menu.LoadMenuW(MAKEINTRESOURCE(IDR_MENU1));
GetCursorPos(&pt);
menu.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, this);
}

View File

@ -19,6 +19,7 @@ public:
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
void reload(std::wstring& cont);
DECLARE_MESSAGE_MAP()
public:
@ -38,4 +39,7 @@ public:
virtual std::wstring export_config(bool* ok, bool used_in_code = false, int code_ver = 1) override;
CIPAddressCtrl ip_;
afx_msg void OnDropFiles(HDROP hDropInfo);
// afx_msg UINT OnGetDlgCode();
afx_msg void OnListPasteClipboard();
afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);
};

View File

@ -5,8 +5,9 @@
#pragma comment(lib, "base_util.lib")
#define WM_GET_TEST_ITEM_NAME WM_USER + 100 // WPARAM: (wchar_t*)title, LPARAM: (ITEM*)item
#define WM_TO_ITEM_MGR_TAB WM_USER + 101
#define WM_TEST_ITEM_CHANGED WM_USER + 102
#define WM_GET_TEST_ITEM_TITLE WM_USER + 101 // WPARAM: (wchar_t*)name, LPARAM: (ITEM*)item
#define WM_TO_ITEM_MGR_TAB WM_USER + 102
#define WM_TEST_ITEM_CHANGED WM_USER + 103
#include <string>
#include <algorithm>

View File

@ -8,6 +8,7 @@
#define IDR_MAINFRAME 128
#define IDD_MANAGER 130
#define IDD_TEST_ITEM 131
#define IDR_MENU1 133
#define IDC_TAB1 1000
#define IDC_STATIC_RECT 1001
#define IDC_EDIT_VID_SRC 1002
@ -32,13 +33,15 @@
#define IDC_EDIT_VER 1018
#define IDC_EDIT_NAME 1019
#define IDC_EDIT_TITLE 1020
#define ID_LIST_32771 32771
#define ID_LIST_PASTE_CLIPBOARD 32772
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 133
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_RESOURCE_VALUE 134
#define _APS_NEXT_COMMAND_VALUE 32773
#define _APS_NEXT_CONTROL_VALUE 1020
#define _APS_NEXT_SYMED_VALUE 101
#endif

View File

@ -47,6 +47,7 @@ BEGIN_MESSAGE_MAP(CscannercheckDlg, CDialogEx)
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()
@ -184,7 +185,7 @@ void CscannercheckDlg::OnBnClickedButtonExport()
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"请选择文件保存路径"))
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("");
@ -256,6 +257,15 @@ LRESULT CscannercheckDlg::on_name_from_title(WPARAM wp, LPARAM lp)
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<page_config::ITEM> items;

View File

@ -47,6 +47,7 @@ public:
afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg LRESULT on_to_item_manager_tab(WPARAM, LPARAM);
afx_msg LRESULT on_name_from_title(WPARAM wp, LPARAM lp);
afx_msg LRESULT on_name_to_title(WPARAM wp, LPARAM lp);
afx_msg LRESULT on_test_item_changed(WPARAM wp, LPARAM lp);
afx_msg void OnTcnSelchangingTab1(NMHDR* pNMHDR, LRESULT* pResult);
};