diff --git a/PluginDemo/PluginDemo.h b/PluginDemo/PluginDemo.h index ae9bad337..c2e7cdcfd 100644 --- a/PluginDemo/PluginDemo.h +++ b/PluginDemo/PluginDemo.h @@ -8,6 +8,7 @@ extern "C" { __declspec(dllexport) IPluginItem* TMPluginCreateInstance(int index); __declspec(dllexport) void TMPluginInfoRequired(); __declspec(dllexport) void TMPluginOptions(HWND hParent); + __declspec(dllexport) const wchar_t* TMPluginGetInfo(int index); #ifdef __cplusplus } diff --git a/PluginDemo/PluginDemo.rc b/PluginDemo/PluginDemo.rc index e99e1783f..a29ede6cc 100644 --- a/PluginDemo/PluginDemo.rc +++ b/PluginDemo/PluginDemo.rc @@ -91,6 +91,18 @@ BEGIN 0 END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PLUGIN_NAME "日期时间插件" + IDS_PLUGIN_DESCRIPTION "提供显示时间和日期的示例插件。" +END + #endif // 中文(简体,中国) resources ///////////////////////////////////////////////////////////////////////////// @@ -148,6 +160,18 @@ BEGIN 0 END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PLUGIN_NAME "Date time plugin" + IDS_PLUGIN_DESCRIPTION "Examples of plug-in to provide display time and date." +END + #endif // 英语(美国) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/PluginDemo/dllmain.cpp b/PluginDemo/dllmain.cpp index 6a1412fb1..05e9557cc 100644 --- a/PluginDemo/dllmain.cpp +++ b/PluginDemo/dllmain.cpp @@ -65,3 +65,25 @@ void TMPluginOptions(HWND hParent) CDataManager::Instance().m_setting_data = dlg.m_data; } } + +const wchar_t* TMPluginGetInfo(int index) +{ + AFX_MANAGE_STATE(AfxGetStaticModuleState()); + static CString str; + switch (index) + { + case TMI_NAME: + str.LoadString(IDS_PLUGIN_NAME); + return str.GetString(); + case TMI_DESCRIPTION: + str.LoadString(IDS_PLUGIN_DESCRIPTION); + return str.GetString(); + case TMI_AUTHOR: + return L"zhongyang219"; + case TMI_COPYRIGHT: + return L"Copyright (C) by Zhong Yang 2021"; + default: + break; + } + return L""; +} diff --git a/PluginDemo/resource.h b/PluginDemo/resource.h index 86ff09b71..4d05a40cc 100644 --- a/PluginDemo/resource.h +++ b/PluginDemo/resource.h @@ -4,13 +4,15 @@ // #define IDD_DIALOG1 101 #define IDD_OPTIONS_DIALOG 101 +#define IDS_PLUGIN_NAME 103 +#define IDS_PLUGIN_DESCRIPTION 104 #define IDC_SHOW_SECOND_CHECK 1001 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1002 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/TrafficMonitor/PluginInfoDlg.cpp b/TrafficMonitor/PluginInfoDlg.cpp new file mode 100644 index 000000000..3bd072ec2 --- /dev/null +++ b/TrafficMonitor/PluginInfoDlg.cpp @@ -0,0 +1,216 @@ +锘// PluginInfoDlg.cpp: 瀹炵幇鏂囦欢 +// + +#include "stdafx.h" +#include "TrafficMonitor.h" +#include "PluginInfoDlg.h" +#include "FilePathHelper.h" + + +// CPluginInfoDlg 瀵硅瘽妗 + +IMPLEMENT_DYNAMIC(CPluginInfoDlg, CBaseDialog) + +CPluginInfoDlg::CPluginInfoDlg(int plugin_index, CWnd* pParent /*=nullptr*/) + : CBaseDialog(IDD_NETWORK_INFO_DIALOG, pParent), m_cur_index(plugin_index) +{ + if (m_cur_index < 0 || m_cur_index >= static_cast(theApp.m_plugins.GetPlugins().size())) + m_cur_index = 0; +} + +CPluginInfoDlg::~CPluginInfoDlg() +{ +} + +void CPluginInfoDlg::DoDataExchange(CDataExchange* pDX) +{ + CBaseDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_INFO_LIST1, m_info_list); +} + +void CPluginInfoDlg::ShowInfo() +{ + if (m_cur_index >= 0 && m_cur_index < static_cast(theApp.m_plugins.GetPlugins().size())) + { + auto& plugin = theApp.m_plugins.GetPlugins()[m_cur_index]; + m_info_list.SetItemText(RI_NAME, 1, plugin.name.c_str()); + m_info_list.SetItemText(RI_DESCRIPTION, 1, plugin.description.c_str()); + m_info_list.SetItemText(RI_FILE_NAME, 1, CFilePathHelper(plugin.file_path).GetFileName().c_str()); + m_info_list.SetItemText(RI_FILE_PATH, 1, plugin.file_path.c_str()); + m_info_list.SetItemText(RI_ITEM_NUM, 1, std::to_wstring(plugin.plugin_items.size()).c_str()); + wstring item_names; + for (const auto& item : plugin.plugin_items) + { + item_names += item->GetPluginName(); + item_names += L";"; + } + if (!plugin.plugin_items.empty()) + item_names.pop_back(); + m_info_list.SetItemText(RI_ITEM_NAMES, 1, item_names.c_str()); + m_info_list.SetItemText(RI_AUTHOR, 1, plugin.author.c_str()); + m_info_list.SetItemText(RI_COPYRIGHT, 1, plugin.copyright.c_str()); + } + + //鏄剧ず褰撳墠閫夋嫨鎸囩ず + CString str; + str.Format(_T("%d/%d"), m_cur_index + 1, theApp.m_plugins.GetPlugins().size()); + SetDlgItemText(IDC_INDEX_STATIC, str); +} + + +BEGIN_MESSAGE_MAP(CPluginInfoDlg, CBaseDialog) + ON_COMMAND(ID_COPY_TEXT, &CPluginInfoDlg::OnCopyText) + ON_NOTIFY(NM_RCLICK, IDC_INFO_LIST1, &CPluginInfoDlg::OnNMRClickInfoList1) + ON_BN_CLICKED(IDC_PREVIOUS_BUTTON, &CPluginInfoDlg::OnBnClickedPreviousButton) + ON_BN_CLICKED(IDC_NEXT_BUTTON, &CPluginInfoDlg::OnBnClickedNextButton) + ON_WM_MOUSEWHEEL() +END_MESSAGE_MAP() + + +// CPluginInfoDlg 娑堟伅澶勭悊绋嬪簭 + + +BOOL CPluginInfoDlg::OnInitDialog() +{ + CBaseDialog::OnInitDialog(); + + // TODO: 鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲 + SetWindowText(CCommon::LoadText(IDS_PLUGIN_INFO)); + SetIcon(theApp.GetMenuIcon(IDI_PLUGINS), FALSE); // 璁剧疆灏忓浘鏍 + + //鍒濆鍖栧垪琛ㄦ帶浠 + CRect rect; + m_info_list.GetClientRect(rect); + m_info_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP); + int width0, width1; + width0 = rect.Width() / 4; + width1 = rect.Width() - width0 - theApp.DPI(20) - 1; + m_info_list.InsertColumn(0, CCommon::LoadText(IDS_ITEM), LVCFMT_LEFT, width0); + m_info_list.InsertColumn(1, CCommon::LoadText(IDS_VALUE), LVCFMT_LEFT, width1); + + //鍚戝垪琛ㄤ腑鎻掑叆琛 + for (int i = 0; i < RI_MAX; i++) + { + m_info_list.InsertItem(i, GetRowName(i)); + } + + //鏄剧ず鍒楄〃涓殑淇℃伅 + ShowInfo(); + + m_info_list.GetToolTips()->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + + m_menu.LoadMenu(IDR_INFO_MENU); //瑁呰浇鍙抽敭鑿滃崟 + + return TRUE; // return TRUE unless you set the focus to a control + // 寮傚父: OCX 灞炴ч〉搴旇繑鍥 FALSE +} + +CString CPluginInfoDlg::GetDialogName() const +{ + return _T("PluginInfoDlg"); +} + +void CPluginInfoDlg::OnCopyText() +{ + if (!CCommon::CopyStringToClipboard(wstring(m_selected_string))) + MessageBox(CCommon::LoadText(IDS_COPY_TO_CLIPBOARD_FAILED), NULL, MB_ICONWARNING); +} + +void CPluginInfoDlg::OnNMRClickInfoList1(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜 + + //鑾峰彇榧犳爣鐐瑰嚮澶勭殑鏂囨湰 + int item, sub_item; + item = pNMItemActivate->iItem; + sub_item = pNMItemActivate->iSubItem; + m_selected_string = m_info_list.GetItemText(item, sub_item); + + //寮瑰嚭鍙抽敭鑿滃崟 + CMenu* pContextMenu = m_menu.GetSubMenu(0); //鑾峰彇绗竴涓脊鍑鸿彍鍗 + CPoint point1; //瀹氫箟涓涓敤浜庣‘瀹氬厜鏍囦綅缃殑浣嶇疆 + GetCursorPos(&point1); //鑾峰彇褰撳墠鍏夋爣鐨勪綅缃紝浠ヤ究浣垮緱鑿滃崟鍙互璺熼殢鍏夋爣 + pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //鍦ㄦ寚瀹氫綅缃樉绀哄脊鍑鸿彍鍗 + + *pResult = 0; +} + +void CPluginInfoDlg::OnBnClickedPreviousButton() +{ + if (m_cur_index > 0) + { + m_cur_index--; + ShowInfo(); + } +} + +void CPluginInfoDlg::OnBnClickedNextButton() +{ + if (m_cur_index < static_cast(theApp.m_plugins.GetPlugins().size() - 1)) + { + m_cur_index++; + ShowInfo(); + } +} + +BOOL CPluginInfoDlg::PreTranslateMessage(MSG* pMsg) +{ + if (pMsg->message == WM_KEYDOWN) + { + if (pMsg->wParam == VK_LEFT) + { + OnBnClickedPreviousButton(); + return TRUE; + } + if (pMsg->wParam == VK_RIGHT) + { + OnBnClickedNextButton(); + return TRUE; + } + } + + return CBaseDialog::PreTranslateMessage(pMsg); +} + + +BOOL CPluginInfoDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) +{ + //閫氳繃榧犳爣婊氳疆缈婚〉 + if (zDelta > 0) + { + OnBnClickedPreviousButton(); + } + if (zDelta < 0) + { + OnBnClickedNextButton(); + } + + return CBaseDialog::OnMouseWheel(nFlags, zDelta, pt); +} + +CString CPluginInfoDlg::GetRowName(int row_index) +{ + switch (row_index) + { + case CPluginInfoDlg::RI_NAME: + return CCommon::LoadText(IDS_NAME); + case CPluginInfoDlg::RI_DESCRIPTION: + return CCommon::LoadText(IDS_DESCRIPTION); + case CPluginInfoDlg::RI_FILE_NAME: + return CCommon::LoadText(IDS_FILE_NAME); + case CPluginInfoDlg::RI_FILE_PATH: + return CCommon::LoadText(IDS_FILE_PATH); + case CPluginInfoDlg::RI_ITEM_NUM: + return CCommon::LoadText(IDS_ITEM_NUM); + case CPluginInfoDlg::RI_ITEM_NAMES: + return CCommon::LoadText(IDS_ITEM_NAMES); + case CPluginInfoDlg::RI_AUTHOR: + return CCommon::LoadText(IDS_AUTHOR); + case CPluginInfoDlg::RI_COPYRIGHT: + return CCommon::LoadText(IDS_COPYRIGHT); + default: + break; + } + return CString(); +} diff --git a/TrafficMonitor/PluginInfoDlg.h b/TrafficMonitor/PluginInfoDlg.h new file mode 100644 index 000000000..b020e58d0 --- /dev/null +++ b/TrafficMonitor/PluginInfoDlg.h @@ -0,0 +1,58 @@ +锘#pragma once +#include "BaseDialog.h" + +// CPluginInfoDlg 瀵硅瘽妗 + +class CPluginInfoDlg : public CBaseDialog +{ + DECLARE_DYNAMIC(CPluginInfoDlg) + +public: + CPluginInfoDlg(int plugin_index, CWnd* pParent = nullptr); // 鏍囧噯鏋勯犲嚱鏁 + virtual ~CPluginInfoDlg(); + +// 瀵硅瘽妗嗘暟鎹 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_NETWORK_INFO_DIALOG }; +#endif + +private: + int m_cur_index; //鍒濆鏄剧ず鐨勬彃浠剁储寮 + CListCtrl m_info_list; + CMenu m_menu; + CString m_selected_string; + + //鍒楄〃涓殑鍒 + enum RowIndex + { + RI_FILE_NAME, + RI_FILE_PATH, + RI_NAME, + RI_DESCRIPTION, + RI_ITEM_NUM, + RI_ITEM_NAMES, + RI_AUTHOR, + RI_COPYRIGHT, + RI_MAX + }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 鏀寔 + void ShowInfo(); + static CString GetRowName(int row_index); //鑾峰彇琛岀殑鍚嶇О + + // 閫氳繃 CBaseDialog 缁ф壙 + virtual CString GetDialogName() const override; + + DECLARE_MESSAGE_MAP() +public: + virtual BOOL OnInitDialog(); + + afx_msg void OnCopyText(); + afx_msg void OnNMRClickInfoList1(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBnClickedPreviousButton(); + afx_msg void OnBnClickedNextButton(); + virtual BOOL PreTranslateMessage(MSG* pMsg); + afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); + +}; diff --git a/TrafficMonitor/PluginManager.cpp b/TrafficMonitor/PluginManager.cpp index 6956fae9b..8823c20c6 100644 --- a/TrafficMonitor/PluginManager.cpp +++ b/TrafficMonitor/PluginManager.cpp @@ -6,6 +6,14 @@ CPluginManager::CPluginManager() { } +static wstring WcharArrayToWString(const wchar_t* str) +{ + if (str == nullptr) + return wstring(); + else + return wstring(str); +} + void CPluginManager::LoadPlugins() { //浠巔lugins鐩綍涓嬪姞杞芥彃浠 @@ -38,6 +46,17 @@ void CPluginManager::LoadPlugins() continue; } plugin_info.TMPluginOptions = (pfTMPluginOptions)::GetProcAddress(plugin_info.plugin_module, "TMPluginOptions"); + //鑾峰彇鎻掍欢淇℃伅 + pfTMPluginGetInfo TMPluginGetInfo = (pfTMPluginGetInfo)::GetProcAddress(plugin_info.plugin_module, "TMPluginGetInfo"); + if (TMPluginGetInfo != nullptr) + { + plugin_info.name = WcharArrayToWString(TMPluginGetInfo(TMI_NAME)); + plugin_info.description = WcharArrayToWString(TMPluginGetInfo(TMI_DESCRIPTION)); + plugin_info.author = WcharArrayToWString(TMPluginGetInfo(TMI_AUTHOR)); + plugin_info.copyright = WcharArrayToWString(TMPluginGetInfo(TMI_COPYRIGHT)); + } + + //鑾峰彇鎻掍欢鏄剧ず椤圭洰 int index = 0; while (true) { diff --git a/TrafficMonitor/PluginManager.h b/TrafficMonitor/PluginManager.h index 24a4d6ed2..595c68ef6 100644 --- a/TrafficMonitor/PluginManager.h +++ b/TrafficMonitor/PluginManager.h @@ -5,6 +5,7 @@ typedef IPluginItem* (*pfTMPluginCreateInstance)(int); typedef void (*pfTMPluginInfoRequired)(); typedef void (*pfTMPluginOptions)(HWND); +typedef const wchar_t* (*pfTMPluginGetInfo)(int); //鐢ㄤ簬鍔犺浇鍜岀鐞嗘彃浠 class CPluginManager @@ -28,6 +29,10 @@ class CPluginManager DWORD error_code{}; //閿欒浠g爜锛圙etLastError鐨勮繑鍥炲硷級 pfTMPluginInfoRequired MPluginInfoRequired{}; //妯″潡涓璏PluginInfoRequired鍑芥暟鐨勬寚閽 pfTMPluginOptions TMPluginOptions{}; //妯″潡涓璗MPluginOptions鍑芥暟鐨勬寚閽 + wstring name; + wstring description; + wstring author; + wstring copyright; }; CPluginManager(); diff --git a/TrafficMonitor/PluginManagerDlg.cpp b/TrafficMonitor/PluginManagerDlg.cpp index 69839f234..330821f77 100644 --- a/TrafficMonitor/PluginManagerDlg.cpp +++ b/TrafficMonitor/PluginManagerDlg.cpp @@ -5,6 +5,7 @@ #include "TrafficMonitor.h" #include "PluginManagerDlg.h" #include "FilePathHelper.h" +#include "PluginInfoDlg.h" // CPluginManagerDlg 瀵硅瘽妗 @@ -31,6 +32,7 @@ void CPluginManagerDlg::EnableControl() { bool select_enable{ m_item_selected >= 0 && m_item_selected < m_list_ctrl.GetItemCount() }; EnableDlgCtrl(IDC_OPTINS_BUTTON, select_enable); + EnableDlgCtrl(IDC_PLUGIN_INFO_BUTTON, select_enable); } CString CPluginManagerDlg::GetDialogName() const @@ -43,6 +45,8 @@ BEGIN_MESSAGE_MAP(CPluginManagerDlg, CBaseDialog) ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CPluginManagerDlg::OnNMRClickList1) ON_NOTIFY(NM_CLICK, IDC_LIST1, &CPluginManagerDlg::OnNMClickList1) ON_BN_CLICKED(IDC_OPTINS_BUTTON, &CPluginManagerDlg::OnBnClickedOptinsButton) + ON_BN_CLICKED(IDC_PLUGIN_INFO_BUTTON, &CPluginManagerDlg::OnBnClickedPluginInfoButton) + ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CPluginManagerDlg::OnNMDblclkList1) END_MESSAGE_MAP() @@ -60,11 +64,12 @@ BOOL CPluginManagerDlg::OnInitDialog() CRect rect; m_list_ctrl.GetClientRect(rect); m_list_ctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP); - int width0, width1; - width0 = rect.Width() / 3; - width1 = rect.Width() - width0 - theApp.DPI(20) - 1; + int width0, width1, width2; + width0 = width1 = rect.Width() / 3; + width2 = rect.Width() - width0 - width1 - theApp.DPI(20) - 1; m_list_ctrl.InsertColumn(0, CCommon::LoadText(IDS_FILE_NAME), LVCFMT_LEFT, width0); - m_list_ctrl.InsertColumn(1, CCommon::LoadText(IDS_STATUS), LVCFMT_LEFT, width1); + m_list_ctrl.InsertColumn(1, CCommon::LoadText(IDS_PLUGIN_NAME), LVCFMT_LEFT, width1); + m_list_ctrl.InsertColumn(2, CCommon::LoadText(IDS_STATUS), LVCFMT_LEFT, width2); //鍚戝垪琛ㄤ腑鎻掑叆琛 for (const auto& plugin : theApp.m_plugins.GetPlugins()) @@ -85,7 +90,8 @@ BOOL CPluginManagerDlg::OnInitDialog() } int index = m_list_ctrl.GetItemCount(); m_list_ctrl.InsertItem(index, file_name.c_str()); - m_list_ctrl.SetItemText(index, 1, status); + m_list_ctrl.SetItemText(index, 1, plugin.name.c_str()); + m_list_ctrl.SetItemText(index, 2, status); } EnableControl(); @@ -123,5 +129,25 @@ void CPluginManagerDlg::OnBnClickedOptinsButton() auto plugin = theApp.m_plugins.GetPlugins()[m_item_selected]; if (plugin.TMPluginOptions != nullptr) plugin.TMPluginOptions(m_hWnd); + else + MessageBox(CCommon::LoadText(IDS_PLUGIN_NO_OPTIONS_INFO), nullptr, MB_ICONINFORMATION | MB_OK); } } + + +void CPluginManagerDlg::OnBnClickedPluginInfoButton() +{ + // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜 + CPluginInfoDlg dlg(m_item_selected); + dlg.DoModal(); +} + + +void CPluginManagerDlg::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜 + m_item_selected = pNMItemActivate->iItem; + OnBnClickedPluginInfoButton(); + *pResult = 0; +} diff --git a/TrafficMonitor/PluginManagerDlg.h b/TrafficMonitor/PluginManagerDlg.h index 30e383ae4..229aeb0e2 100644 --- a/TrafficMonitor/PluginManagerDlg.h +++ b/TrafficMonitor/PluginManagerDlg.h @@ -33,4 +33,6 @@ class CPluginManagerDlg : public CBaseDialog afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnBnClickedOptinsButton(); + afx_msg void OnBnClickedPluginInfoButton(); + afx_msg void OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult); }; diff --git a/TrafficMonitor/TrafficMonitor.rc b/TrafficMonitor/TrafficMonitor.rc index 8a7acf985..ddfce2d9e 100644 Binary files a/TrafficMonitor/TrafficMonitor.rc and b/TrafficMonitor/TrafficMonitor.rc differ diff --git a/TrafficMonitor/TrafficMonitor.vcxproj b/TrafficMonitor/TrafficMonitor.vcxproj index 7b87e1fda..f80a53d6f 100644 --- a/TrafficMonitor/TrafficMonitor.vcxproj +++ b/TrafficMonitor/TrafficMonitor.vcxproj @@ -466,6 +466,7 @@ + @@ -530,6 +531,7 @@ + diff --git a/TrafficMonitor/TrafficMonitor.vcxproj.filters b/TrafficMonitor/TrafficMonitor.vcxproj.filters index 6a36f0e43..37f0f64e0 100644 --- a/TrafficMonitor/TrafficMonitor.vcxproj.filters +++ b/TrafficMonitor/TrafficMonitor.vcxproj.filters @@ -386,6 +386,9 @@ 婧愭枃浠跺拰澶存枃浠禱瀵硅瘽妗嗙被\PluginManagerDlg + + 婧愭枃浠跺拰澶存枃浠禱瀵硅瘽妗嗙被\PluginManagerDlg + @@ -568,6 +571,9 @@ 婧愭枃浠跺拰澶存枃浠禱瀵硅瘽妗嗙被\PluginManagerDlg + + 婧愭枃浠跺拰澶存枃浠禱瀵硅瘽妗嗙被\PluginManagerDlg + diff --git a/TrafficMonitor/resource.h b/TrafficMonitor/resource.h index a42d2e2bd..2ce90c65f 100644 --- a/TrafficMonitor/resource.h +++ b/TrafficMonitor/resource.h @@ -254,6 +254,16 @@ #define IDS_PLUGIN_LOAD_SUCCEED 350 #define IDS_PLUGIN_MODULE_LOAD_FAILED 351 #define IDS_PLUGIN_FUNCTION_GET_FAILED 352 +#define IDS_PLUGIN_INFO 353 +#define IDS_NAME 354 +#define IDS_DESCRIPTION 355 +#define IDS_FILE_PATH 356 +#define IDS_ITEM_NUM 357 +#define IDS_ITEM_NAMES 358 +#define IDS_AUTHOR 359 +#define IDS_COPYRIGHT 360 +#define IDS_PLUGIN_NO_OPTIONS_INFO 361 +#define IDS_PLUGIN_NAME 362 #define IDC_STATIC_INFO 1001 #define IDC_STATIC1 1002 #define IDC_STATIC_DOWN 1002 @@ -443,6 +453,7 @@ #define IDC_SET_ORDER_BUTTON 1137 #define IDC_OPTINS_BUTTON 1139 #define IDC_PLUGIN_MANAGE_BUTTON 1140 +#define IDC_PLUGIN_INFO_BUTTON 1141 #define ID_32771 32771 #define ID_NETWORK_INFO 32772 #define ID_32773 32773 @@ -563,7 +574,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 335 #define _APS_NEXT_COMMAND_VALUE 32884 -#define _APS_NEXT_CONTROL_VALUE 1141 +#define _APS_NEXT_CONTROL_VALUE 1142 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/include/PluginInterface.h b/include/PluginInterface.h index d4d69c920..fc21cceb1 100644 --- a/include/PluginInterface.h +++ b/include/PluginInterface.h @@ -19,6 +19,15 @@ class IPluginItem virtual const wchar_t* GetItemValueSampleText() const = 0; }; +//鎻掍欢淇℃伅鐨勭储寮 +enum TMPluginInfoIndex +{ + TMI_NAME, //鍚嶇О + TMI_DESCRIPTION, //鎻忚堪 + TMI_AUTHOR, //浣滆 + TMI_COPYRIGHT //鐗堟潈 +}; + /* * 娉ㄦ剰锛氭彃浠禿ll闇瑕佸鍑哄涓嬪嚱鏁 *