diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 8fdaa14..35064df 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -861,6 +861,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_NOTIFY(NM_CUSTOMDRAW, IDC_MESSAGE, &CMy2015RemoteDlg::OnNMCustomdrawMessage) ON_NOTIFY(NM_RCLICK, IDC_MESSAGE, &CMy2015RemoteDlg::OnRClickMessage) ON_COMMAND(ID_MSGLOG_DELETE, &CMy2015RemoteDlg::OnMsglogDelete) + ON_COMMAND(ID_MSGLOG_COPY, &CMy2015RemoteDlg::OnMsglogCopy) ON_COMMAND(ID_MSGLOG_CLEAR, &CMy2015RemoteDlg::OnMsglogClear) ON_COMMAND(ID_ONLINE_ADD_WATCH, &CMy2015RemoteDlg::OnOnlineAddWatch) ON_COMMAND(ID_ONLINE_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnOnlineLoginNotify) @@ -8993,11 +8994,13 @@ void CMy2015RemoteDlg::OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult) CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, ID_MSGLOG_DELETE, _TR("删除选中")); + menu.AppendMenu(MF_STRING, ID_MSGLOG_COPY, _TR("复制选中")); menu.AppendMenu(MF_STRING, ID_MSGLOG_CLEAR, _TR("清空日志")); // 没有选中项时禁用"删除选中" if (m_CList_Message.GetSelectedCount() == 0) { menu.EnableMenuItem(ID_MSGLOG_DELETE, MF_GRAYED); + menu.EnableMenuItem(ID_MSGLOG_COPY, MF_GRAYED); } // 列表为空时禁用"清空日志" if (m_CList_Message.GetItemCount() == 0) { @@ -9023,6 +9026,38 @@ void CMy2015RemoteDlg::OnMsglogDelete() } } +void CMy2015RemoteDlg::OnMsglogCopy() { + POSITION pos = m_CList_Message.GetFirstSelectedItemPosition(); + if (!pos) return; + + CString csv; + int colCount = m_CList_Message.GetHeaderCtrl()->GetItemCount(); + while (pos) { + int row = m_CList_Message.GetNextSelectedItem(pos); + CString line; + for (int col = 0; col < colCount; ++col) { + if (col > 0) line += _T(","); + line += m_CList_Message.GetItemText(row, col); + } + csv += line + _T("\r\n"); + } + + if (!OpenClipboard()) return; + EmptyClipboard(); + int len = (csv.GetLength() + 1) * sizeof(TCHAR); + HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len); + if (hMem) { + memcpy(GlobalLock(hMem), (LPCTSTR)csv, len); + GlobalUnlock(hMem); +#ifdef UNICODE + SetClipboardData(CF_UNICODETEXT, hMem); +#else + SetClipboardData(CF_TEXT, hMem); +#endif + } + CloseClipboard(); +} + void CMy2015RemoteDlg::OnMsglogClear() { m_CList_Message.DeleteAllItems(); diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 898f9d5..6d9caa6 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -538,6 +538,7 @@ public: afx_msg void OnNMCustomdrawMessage(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnMsglogDelete(); + afx_msg void OnMsglogCopy(); afx_msg void OnMsglogClear(); afx_msg void OnOnlineAddWatch(); afx_msg void OnNMCustomdrawOnline(NMHDR* pNMHDR, LRESULT* pResult); diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 7134c2c..67f3db1 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -1746,6 +1746,7 @@ Ghostִ =Proxy ѡ: ¼ ɫ: ϼѽ=Checked: Hide from subordinates Gray: Disabled by upper level ɾѡ=Delete Selected +ѡ=Copy Selected ־=Clear Log FRPS ڱ=FRPS runs on localhost ַ:=LAN Address: diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index 353cf47..e432bd3 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -1739,6 +1739,7 @@ Ghostִ = ѡ: ¼ ɫ: ϼѽ=x: ¼[ ɫ: ϼѽ ɾѡ=hx +ѡ=x ־=I FRPS ڱ=FRPS ڱ ַ:=ھWַ: diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 29e3c22..e3908dd 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -977,7 +977,7 @@ #define ID_33040 33040 #define ID_MSGLOG_CLEAR 33041 #define ID_CANCEL_SHARE 33042 -#define ID_33043 33043 +#define ID_MSGLOG_COPY 33043 #define ID_WEB_REMOTE_CONTROL 33044 #define ID_TOOL_PLUGIN_SETTINGS 33045 #define ID_33046 33046