From 9567d059b262c92df74d0a01040de805d65059b1 Mon Sep 17 00:00:00 2001 From: zhongyang219 <380526481@qq.com> Date: Fri, 27 Aug 2021 11:54:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=B7=BB=E5=8A=A0=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E8=AE=BE=E7=BD=AE=E6=8E=A5=E5=8F=A3=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PluginDemo/OptionsDlg.cpp | 34 +++++ PluginDemo/OptionsDlg.h | 23 ++++ PluginDemo/PluginDemo.h | 1 + PluginDemo/PluginDemo.rc | 106 +++++++++++++++ PluginDemo/PluginDemo.vcxproj | 10 ++ PluginDemo/PluginDemo.vcxproj.filters | 14 ++ PluginDemo/dllmain.cpp | 42 +++--- PluginDemo/framework.h | 20 ++- PluginDemo/pch.h | 2 + PluginDemo/resource.h | 17 +++ TrafficMonitor/BaseDialog.cpp | 7 + TrafficMonitor/BaseDialog.h | 1 + TrafficMonitor/GeneralSettingsDlg.cpp | 14 +- TrafficMonitor/GeneralSettingsDlg.h | 2 + TrafficMonitor/PluginManager.cpp | 1 + TrafficMonitor/PluginManager.h | 2 + TrafficMonitor/PluginManagerDlg.cpp | 127 ++++++++++++++++++ TrafficMonitor/PluginManagerDlg.h | 36 +++++ TrafficMonitor/Test.cpp | 14 ++ TrafficMonitor/Test.h | 2 + TrafficMonitor/TrafficMonitor.cpp | 4 + TrafficMonitor/TrafficMonitor.rc | Bin 275604 -> 278654 bytes TrafficMonitor/TrafficMonitor.vcxproj | 3 + TrafficMonitor/TrafficMonitor.vcxproj.filters | 12 ++ TrafficMonitor/TrafficMonitorDlg.cpp | 17 +++ TrafficMonitor/TrafficMonitorDlg.h | 1 + TrafficMonitor/res/menu_icon/plugins.ico | Bin 0 -> 9622 bytes TrafficMonitor/resource.h | 18 ++- 28 files changed, 506 insertions(+), 24 deletions(-) create mode 100644 PluginDemo/OptionsDlg.cpp create mode 100644 PluginDemo/OptionsDlg.h create mode 100644 PluginDemo/PluginDemo.rc create mode 100644 PluginDemo/resource.h create mode 100644 TrafficMonitor/PluginManagerDlg.cpp create mode 100644 TrafficMonitor/PluginManagerDlg.h create mode 100644 TrafficMonitor/res/menu_icon/plugins.ico diff --git a/PluginDemo/OptionsDlg.cpp b/PluginDemo/OptionsDlg.cpp new file mode 100644 index 000000000..2de61fff7 --- /dev/null +++ b/PluginDemo/OptionsDlg.cpp @@ -0,0 +1,34 @@ +// OptionsDlg.cpp: 实现文件 +// + +#include "pch.h" +#include "PluginDemo.h" +#include "OptionsDlg.h" +#include "afxdialogex.h" + + +// COptionsDlg 对话框 + +IMPLEMENT_DYNAMIC(COptionsDlg, CDialog) + +COptionsDlg::COptionsDlg(CWnd* pParent /*=nullptr*/) + : CDialog(IDD_OPTIONS_DIALOG, pParent) +{ + +} + +COptionsDlg::~COptionsDlg() +{ +} + +void COptionsDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(COptionsDlg, CDialog) +END_MESSAGE_MAP() + + +// COptionsDlg 消息处理程序 diff --git a/PluginDemo/OptionsDlg.h b/PluginDemo/OptionsDlg.h new file mode 100644 index 000000000..78284e8dd --- /dev/null +++ b/PluginDemo/OptionsDlg.h @@ -0,0 +1,23 @@ +#pragma once + + +// COptionsDlg 对话框 + +class COptionsDlg : public CDialog +{ + DECLARE_DYNAMIC(COptionsDlg) + +public: + COptionsDlg(CWnd* pParent = nullptr); // 标准构造函数 + virtual ~COptionsDlg(); + +// 对话框数据 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_OPTIONS_DIALOG }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + + DECLARE_MESSAGE_MAP() +}; diff --git a/PluginDemo/PluginDemo.h b/PluginDemo/PluginDemo.h index 06c0c173b..89b27d8d9 100644 --- a/PluginDemo/PluginDemo.h +++ b/PluginDemo/PluginDemo.h @@ -7,6 +7,7 @@ extern "C" { __declspec(dllexport) IPluginItem* TMPluginCreateInstance(int index); __declspec(dllexport) void TMPluginInfoRequired(); + __declspec(dllexport) void TMPluginOptions(); #ifdef __cplusplus } diff --git a/PluginDemo/PluginDemo.rc b/PluginDemo/PluginDemo.rc new file mode 100644 index 000000000..441f402c4 --- /dev/null +++ b/PluginDemo/PluginDemo.rc @@ -0,0 +1,106 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// (壬й) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +#pragma code_page(936) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPTIONS_DIALOG DIALOGEX 0, 0, 310, 178 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ʱں" +FONT 9, "΢ź", 400, 0, 0x0 +BEGIN + DEFPUSHBUTTON "ȷ",IDOK,199,157,50,14 + PUSHBUTTON "ȡ",IDCANCEL,253,157,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_OPTIONS_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 303 + TOPMARGIN, 7 + BOTTOMMARGIN, 171 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +IDD_OPTIONS_DIALOG AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +#endif // (壬й) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/PluginDemo/PluginDemo.vcxproj b/PluginDemo/PluginDemo.vcxproj index 4f70113c7..c0a9fec79 100644 --- a/PluginDemo/PluginDemo.vcxproj +++ b/PluginDemo/PluginDemo.vcxproj @@ -31,6 +31,7 @@ true v142 Unicode + Dynamic DynamicLibrary @@ -38,12 +39,14 @@ v142 true Unicode + Dynamic DynamicLibrary true v142 Unicode + Dynamic DynamicLibrary @@ -51,6 +54,7 @@ v142 true Unicode + Dynamic @@ -162,14 +166,17 @@ + + + Create Create @@ -179,6 +186,9 @@ + + + diff --git a/PluginDemo/PluginDemo.vcxproj.filters b/PluginDemo/PluginDemo.vcxproj.filters index ff4dcdb8a..e7d435353 100644 --- a/PluginDemo/PluginDemo.vcxproj.filters +++ b/PluginDemo/PluginDemo.vcxproj.filters @@ -36,6 +36,12 @@ 头文件 + + 头文件 + + + 头文件 + @@ -53,5 +59,13 @@ 源文件 + + 源文件 + + + + + 资源文件 + \ No newline at end of file diff --git a/PluginDemo/dllmain.cpp b/PluginDemo/dllmain.cpp index ae0709bc5..dfd0cf45c 100644 --- a/PluginDemo/dllmain.cpp +++ b/PluginDemo/dllmain.cpp @@ -4,26 +4,28 @@ #include "PluginSystemTime.h" #include "PluginDemo.h" #include "DataManager.h" +#include "OptionsDlg.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} +//BOOL APIENTRY DllMain( HMODULE hModule, +// DWORD ul_reason_for_call, +// LPVOID lpReserved +// ) +//{ +// switch (ul_reason_for_call) +// { +// case DLL_PROCESS_ATTACH: +// case DLL_THREAD_ATTACH: +// case DLL_THREAD_DETACH: +// case DLL_PROCESS_DETACH: +// break; +// } +// return TRUE; +//} IPluginItem* TMPluginCreateInstance(int index) { + AFX_MANAGE_STATE(AfxGetStaticModuleState()); + switch (index) { case 0: @@ -38,6 +40,7 @@ IPluginItem* TMPluginCreateInstance(int index) void TMPluginInfoRequired() { + AFX_MANAGE_STATE(AfxGetStaticModuleState()); //获取时间和日期 SYSTEMTIME system_time; GetSystemTime(&system_time); @@ -47,3 +50,10 @@ void TMPluginInfoRequired() swprintf_s(buff, L"%.2d:%.2d:%.2d", system_time.wHour, system_time.wMinute, system_time.wSecond); CDataManager::Instance().m_cur_time = buff; } + +void TMPluginOptions() +{ + AFX_MANAGE_STATE(AfxGetStaticModuleState()); + COptionsDlg dlg; + dlg.DoModal(); +} diff --git a/PluginDemo/framework.h b/PluginDemo/framework.h index 80cbbc9b0..b09f35a4b 100644 --- a/PluginDemo/framework.h +++ b/PluginDemo/framework.h @@ -1,5 +1,21 @@ #pragma once #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 -// Windows 头文件 -#include +//// Windows 头文件 +//#include + +#include + +#include // MFC 核心组件和标准组件 +#include // MFC 扩展 +#include // MFC 自动化类 + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif diff --git a/PluginDemo/pch.h b/PluginDemo/pch.h index 966092717..370adca7f 100644 --- a/PluginDemo/pch.h +++ b/PluginDemo/pch.h @@ -10,4 +10,6 @@ // 添加要在此处预编译的标头 #include "framework.h" +#include "resource.h" + #endif //PCH_H diff --git a/PluginDemo/resource.h b/PluginDemo/resource.h new file mode 100644 index 000000000..4af258260 --- /dev/null +++ b/PluginDemo/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ 生成的包含文件。 +// 供 PluginDemo.rc 使用 +// +#define IDD_DIALOG1 101 +#define IDD_OPTIONS_DIALOG 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/TrafficMonitor/BaseDialog.cpp b/TrafficMonitor/BaseDialog.cpp index 98dd236cb..0e923f017 100644 --- a/TrafficMonitor/BaseDialog.cpp +++ b/TrafficMonitor/BaseDialog.cpp @@ -44,6 +44,13 @@ void CBaseDialog::SaveConfig() const ini.Save(); } +void CBaseDialog::EnableDlgCtrl(UINT id, bool enable) +{ + CWnd* pWnd = GetDlgItem(id); + if (pWnd != nullptr) + pWnd->EnableWindow(enable); +} + void CBaseDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); diff --git a/TrafficMonitor/BaseDialog.h b/TrafficMonitor/BaseDialog.h index 4136f48d5..6231e7dce 100644 --- a/TrafficMonitor/BaseDialog.h +++ b/TrafficMonitor/BaseDialog.h @@ -30,6 +30,7 @@ class CBaseDialog : public CDialog protected: virtual CString GetDialogName() const = 0; + void EnableDlgCtrl(UINT id, bool enable); virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 diff --git a/TrafficMonitor/GeneralSettingsDlg.cpp b/TrafficMonitor/GeneralSettingsDlg.cpp index 8840f2932..f9806edf8 100644 --- a/TrafficMonitor/GeneralSettingsDlg.cpp +++ b/TrafficMonitor/GeneralSettingsDlg.cpp @@ -4,7 +4,7 @@ #include "stdafx.h" #include "TrafficMonitor.h" #include "GeneralSettingsDlg.h" -#include "afxdialogex.h" +#include "PluginManagerDlg.h" // CGeneralSettingsDlg dialog @@ -89,6 +89,7 @@ void CGeneralSettingsDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_MBD_TEMP_TIP_EDIT, m_mbd_temp_tip_edit); DDX_Control(pDX, IDC_SELECT_HARD_DISK_COMBO, m_hard_disk_combo); DDX_Control(pDX, IDC_SELECT_CPU_COMBO, m_select_cpu_combo); + DDX_Control(pDX, IDC_PLUGIN_MANAGE_BUTTON, m_plugin_manager_btn); } void CGeneralSettingsDlg::SetControlEnable() @@ -133,6 +134,7 @@ BEGIN_MESSAGE_MAP(CGeneralSettingsDlg, CTabDlg) ON_BN_CLICKED(IDC_HDD_CHECK, &CGeneralSettingsDlg::OnBnClickedHddCheck) ON_BN_CLICKED(IDC_MBD_CHECK, &CGeneralSettingsDlg::OnBnClickedMbdCheck) ON_CBN_SELCHANGE(IDC_SELECT_CPU_COMBO, &CGeneralSettingsDlg::OnCbnSelchangeSelectCpuCombo) + ON_BN_CLICKED(IDC_PLUGIN_MANAGE_BUTTON, &CGeneralSettingsDlg::OnBnClickedPluginManageButton) END_MESSAGE_MAP() @@ -269,6 +271,8 @@ BOOL CGeneralSettingsDlg::OnInitDialog() EnableDlgCtrl(IDC_SELECT_CPU_COMBO, false); #endif + m_plugin_manager_btn.SetIcon(theApp.GetMenuIcon(IDI_PLUGINS)); + return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } @@ -610,3 +614,11 @@ void CGeneralSettingsDlg::OnCbnSelchangeSelectCpuCombo() m_select_cpu_combo.GetWindowText(cpu_core_name); m_data.cpu_core_name = cpu_core_name.GetString(); } + + +void CGeneralSettingsDlg::OnBnClickedPluginManageButton() +{ + // TODO: 在此添加控件通知处理程序代码 + CPluginManagerDlg dlg; + dlg.DoModal(); +} diff --git a/TrafficMonitor/GeneralSettingsDlg.h b/TrafficMonitor/GeneralSettingsDlg.h index d0363e044..e16afd2c0 100644 --- a/TrafficMonitor/GeneralSettingsDlg.h +++ b/TrafficMonitor/GeneralSettingsDlg.h @@ -93,4 +93,6 @@ class CGeneralSettingsDlg : public CTabDlg afx_msg void OnBnClickedHddCheck(); afx_msg void OnBnClickedMbdCheck(); afx_msg void OnCbnSelchangeSelectCpuCombo(); + afx_msg void OnBnClickedPluginManageButton(); + CButton m_plugin_manager_btn; }; diff --git a/TrafficMonitor/PluginManager.cpp b/TrafficMonitor/PluginManager.cpp index 90ab1110c..6956fae9b 100644 --- a/TrafficMonitor/PluginManager.cpp +++ b/TrafficMonitor/PluginManager.cpp @@ -37,6 +37,7 @@ void CPluginManager::LoadPlugins() plugin_info.error_code = GetLastError(); continue; } + plugin_info.TMPluginOptions = (pfTMPluginOptions)::GetProcAddress(plugin_info.plugin_module, "TMPluginOptions"); int index = 0; while (true) { diff --git a/TrafficMonitor/PluginManager.h b/TrafficMonitor/PluginManager.h index df116e96f..ecdc149f2 100644 --- a/TrafficMonitor/PluginManager.h +++ b/TrafficMonitor/PluginManager.h @@ -4,6 +4,7 @@ typedef IPluginItem* (*pfTMPluginCreateInstance)(int); typedef void (*pfTMPluginInfoRequired)(); +typedef void (*pfTMPluginOptions)(); //用于加载和管理插件 class CPluginManager @@ -26,6 +27,7 @@ class CPluginManager PluginState state{}; //插件的状态 DWORD error_code{}; //错误代码(GetLastError的返回值) pfTMPluginInfoRequired MPluginInfoRequired{}; //模块中MPluginInfoRequired函数的指针 + pfTMPluginOptions TMPluginOptions{}; //模块中TMPluginOptions函数的指针 }; CPluginManager(); diff --git a/TrafficMonitor/PluginManagerDlg.cpp b/TrafficMonitor/PluginManagerDlg.cpp new file mode 100644 index 000000000..57bd14a92 --- /dev/null +++ b/TrafficMonitor/PluginManagerDlg.cpp @@ -0,0 +1,127 @@ +// PluginManagerDlg.cpp: 实现文件 +// + +#include "stdafx.h" +#include "TrafficMonitor.h" +#include "PluginManagerDlg.h" +#include "FilePathHelper.h" + + +// CPluginManagerDlg 对话框 + +IMPLEMENT_DYNAMIC(CPluginManagerDlg, CBaseDialog) + +CPluginManagerDlg::CPluginManagerDlg(CWnd* pParent /*=nullptr*/) + : CBaseDialog(IDD_PLUGIN_MANAGER_DIALOG, pParent) +{ + +} + +CPluginManagerDlg::~CPluginManagerDlg() +{ +} + +void CPluginManagerDlg::DoDataExchange(CDataExchange* pDX) +{ + CBaseDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_LIST1, m_list_ctrl); +} + +void CPluginManagerDlg::EnableControl() +{ + bool select_enable{ m_item_selected >= 0 && m_item_selected < m_list_ctrl.GetItemCount() }; + EnableDlgCtrl(IDC_OPTINS_BUTTON, select_enable); +} + +CString CPluginManagerDlg::GetDialogName() const +{ + return _T("PluginManagerDlg"); +} + + +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) +END_MESSAGE_MAP() + + +// CPluginManagerDlg 消息处理程序 + + +BOOL CPluginManagerDlg::OnInitDialog() +{ + CBaseDialog::OnInitDialog(); + + // TODO: 在此添加额外的初始化 + SetIcon(theApp.GetMenuIcon(IDI_PLUGINS), FALSE); + + //初始化列表控件 + 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; + 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); + + //向列表中插入行 + for (const auto& plugin : theApp.m_plugins.GetPlugins()) + { + std::wstring file_name = CFilePathHelper(plugin.file_path).GetFileName(); + CString status; + switch (plugin.state) + { + case CPluginManager::PluginState::PS_SUCCEED: + status = _T("加载成功"); + break; + case CPluginManager::PluginState::PS_MUDULE_LOAD_FAILED: + status.Format(_T("插件模块加载失败,故障代码:%d"), plugin.error_code); + break; + case CPluginManager::PluginState::PS_FUNCTION_GET_FAILED: + status.Format(_T("函数获取失败,故障代码:%d"), plugin.error_code); + break; + } + int index = m_list_ctrl.GetItemCount(); + m_list_ctrl.InsertItem(index, file_name.c_str()); + m_list_ctrl.SetItemText(index, 1, status); + } + + EnableControl(); + + return TRUE; // return TRUE unless you set the focus to a control + // 异常: OCX 属性页应返回 FALSE +} + + +void CPluginManagerDlg::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + // TODO: 在此添加控件通知处理程序代码 + m_item_selected = pNMItemActivate->iItem; + EnableControl(); + *pResult = 0; +} + + +void CPluginManagerDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + // TODO: 在此添加控件通知处理程序代码 + m_item_selected = pNMItemActivate->iItem; + EnableControl(); + *pResult = 0; +} + + +void CPluginManagerDlg::OnBnClickedOptinsButton() +{ + // TODO: 在此添加控件通知处理程序代码 + if (m_item_selected >= 0 && m_item_selected < static_cast(theApp.m_plugins.GetPlugins().size())) + { + auto plugin = theApp.m_plugins.GetPlugins()[m_item_selected]; + if (plugin.TMPluginOptions != nullptr) + plugin.TMPluginOptions(); + } +} diff --git a/TrafficMonitor/PluginManagerDlg.h b/TrafficMonitor/PluginManagerDlg.h new file mode 100644 index 000000000..30e383ae4 --- /dev/null +++ b/TrafficMonitor/PluginManagerDlg.h @@ -0,0 +1,36 @@ +#pragma once +#include "BaseDialog.h" + +// CPluginManagerDlg 对话框 + +class CPluginManagerDlg : public CBaseDialog +{ + DECLARE_DYNAMIC(CPluginManagerDlg) + +public: + CPluginManagerDlg(CWnd* pParent = nullptr); // 标准构造函数 + virtual ~CPluginManagerDlg(); + +// 对话框数据 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_PLUGIN_MANAGER_DIALOG }; +#endif + +private: + CListCtrl m_list_ctrl; + int m_item_selected{ -1 }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + void EnableControl(); + + DECLARE_MESSAGE_MAP() + + // 通过 CBaseDialog 继承 + virtual CString GetDialogName() const override; +public: + virtual BOOL OnInitDialog(); + afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBnClickedOptinsButton(); +}; diff --git a/TrafficMonitor/Test.cpp b/TrafficMonitor/Test.cpp index c55607033..ebf64f8ad 100644 --- a/TrafficMonitor/Test.cpp +++ b/TrafficMonitor/Test.cpp @@ -2,6 +2,7 @@ #include "Test.h" #include "Common.h" #include "SkinFile.h" +#include "TrafficMonitor.h" CTest::CTest() { @@ -19,6 +20,11 @@ void CTest::Test() //TestCrash(); } +void CTest::TestCommand() +{ + TestPlugin(); +} + void CTest::TestHttpQequest() { wstring result; @@ -56,3 +62,11 @@ void CTest::TestCrash() printf("%d", a); } + +void CTest::TestPlugin() +{ + if (!theApp.m_plugins.GetPlugins().empty()) + { + theApp.m_plugins.GetPlugins()[0].TMPluginOptions(); + } +} diff --git a/TrafficMonitor/Test.h b/TrafficMonitor/Test.h index 0b2406464..2252cb266 100644 --- a/TrafficMonitor/Test.h +++ b/TrafficMonitor/Test.h @@ -6,10 +6,12 @@ class CTest ~CTest(); static void Test(); + static void TestCommand(); private: static void TestHttpQequest(); static void TestGetLicense(); static void TestSkin(); static void TestCrash(); + static void TestPlugin(); }; diff --git a/TrafficMonitor/TrafficMonitor.cpp b/TrafficMonitor/TrafficMonitor.cpp index f14cc11a4..1e1c35ac7 100644 --- a/TrafficMonitor/TrafficMonitor.cpp +++ b/TrafficMonitor/TrafficMonitor.cpp @@ -730,6 +730,7 @@ void CTrafficMonitorApp::InitMenuResourse() CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_CHANGE_SKIN, FALSE, GetMenuIcon(IDI_SKIN)); CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_CHANGE_NOTIFY_ICON, FALSE, GetMenuIcon(IDI_NOTIFY)); CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_TRAFFIC_HISTORY, FALSE, GetMenuIcon(IDI_STATISTICS)); + CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_PLUGIN_MANAGE, FALSE, GetMenuIcon(IDI_PLUGINS)); CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_OPTIONS, FALSE, GetMenuIcon(IDI_SETTINGS)); CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_HELP, FALSE, GetMenuIcon(IDI_HELP)); CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_APP_ABOUT, FALSE, GetMenuIcon(IDR_MAINFRAME)); @@ -748,6 +749,9 @@ void CTrafficMonitorApp::InitMenuResourse() CMenuIcon::AddIconToMenuItem(m_taskbar_menu.GetSafeHmenu(), ID_APP_ABOUT, FALSE, GetMenuIcon(IDR_MAINFRAME)); CMenuIcon::AddIconToMenuItem(m_taskbar_menu.GetSafeHmenu(), ID_APP_EXIT, FALSE, GetMenuIcon(IDI_EXIT)); +#ifdef _DEBUG + m_main_menu.GetSubMenu(0)->AppendMenu(MF_BYCOMMAND, ID_CMD_TEST, _T("Test Command")); +#endif } HICON CTrafficMonitorApp::GetMenuIcon(UINT id) diff --git a/TrafficMonitor/TrafficMonitor.rc b/TrafficMonitor/TrafficMonitor.rc index d54796cb04a43eeb134de34da3975a164acdd5e9..30f798c8d274214be4d01d5d95ead2e824b3b0ba 100644 GIT binary patch delta 1357 zcmbW1e{54#6vywm_qCR_-Cnmn#8KwzmPtt0U$0wNAhJee3Z*_BnyCZV=xB`4Y%&dQ z(=fAOBu!+y;t9kE3ym=fq2>vfKXlAt+#kd^79eWMkNAgi3qj-$BL1P?R+$=QiTrVM za+7;<&iUN$_q;Wu{<_1Jv$?riX0sb4P97tz*n^?_Lae-{D|=5We#35J#xk}^2svi^fT8Jqy5(2rKFx1*fR#&oqy|!JWbY< z7)i*}%6n2;nNGYUM4Cxh#wHTML4|s-W)^-njlHXDd5dnlRXTb)m~IKl>>wYmUcs*% z8p2CJ%WXG1;6`nR1!VIdor4P8WTk5@L0Ka_cQ3^QZZ_a*E8vpQ;^YC+CQqE7-oMcq zA^{SSO$B9)^3!oY=4`MKUmXLR{b6E|4aKZB{OT#D;m7AdEmW{#Mxmwr(#f3oVF7)R znwb-`E(l|+o;Kj7G<)BSPwyzD}o_cHfCzlsmuXsq~; zpF*(0V$4~=R{&sOKFgjI9Sh)HhN?m1M=wDBS#;OQ`MX;{fjIu;hr4imBRG`TyRIit z4ZtG&{1sZo)rG3%*bC5k4W^?tc(+5A7UkBAXZzqhgt)VB z6<+IyLo7t1LQ1gpj-vdA@Au=?QL2dQA(+-~TXaz=9k2Xj9e* zxI*~8rxQDwv>x}IT_^6_%4#A-u6G-Mt);n&>u**hUEKA{5}vzZonMzClVuxr;p`Xe n-&8GY7bg@EeMvAS7A+#&$Ca9b+t67A} zI{6phqOzG4!y6YT{MTI7zVur8{Lh|X4BJ@D{;Jiq7nIonXtnlm}b zRS!8jAh1qLZkq1^4zZXB(5HCOTh* z+h}t)%aYoFXN6uKx>iB3lYekl4qEKu*hz@lz*_5K4g1^D>2F`3+Vph8?9fVs6LK$^0%Fn3p5M0^Y; z6X2o63vByvl8y7ruR2A0HAZ~pm?GAOb;tkbP#$658oj$lTKt7?h58&LO#kK=pI+i_ zFv^l5xg?od^RS*r4%LbiQ& + @@ -530,6 +531,7 @@ + @@ -598,6 +600,7 @@ + diff --git a/TrafficMonitor/TrafficMonitor.vcxproj.filters b/TrafficMonitor/TrafficMonitor.vcxproj.filters index fc4da20bd..6a36f0e43 100644 --- a/TrafficMonitor/TrafficMonitor.vcxproj.filters +++ b/TrafficMonitor/TrafficMonitor.vcxproj.filters @@ -178,6 +178,9 @@ {f7dd3288-085a-4de2-9f83-d8ba2f3eff47} + + {dbacfb68-1e03-4bcb-a08b-e87ba558985f} + @@ -380,6 +383,9 @@ 源文件和头文件\公共的类\PluginManager + + 源文件和头文件\对话框类\PluginManagerDlg + @@ -559,6 +565,9 @@ 源文件和头文件\公共的类\PluginManager + + 源文件和头文件\对话框类\PluginManagerDlg + @@ -666,5 +675,8 @@ 资源文件 + + 资源文件 + \ No newline at end of file diff --git a/TrafficMonitor/TrafficMonitorDlg.cpp b/TrafficMonitor/TrafficMonitorDlg.cpp index 44206460d..1391c6e21 100644 --- a/TrafficMonitor/TrafficMonitorDlg.cpp +++ b/TrafficMonitor/TrafficMonitorDlg.cpp @@ -6,6 +6,8 @@ #include "TrafficMonitor.h" #include "TrafficMonitorDlg.h" #include "afxdialogex.h" +#include "Test.h" +#include "PluginManagerDlg.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -108,6 +110,7 @@ BEGIN_MESSAGE_MAP(CTrafficMonitorDlg, CDialog) ON_MESSAGE(WM_MONITOR_INFO_UPDATED, &CTrafficMonitorDlg::OnMonitorInfoUpdated) ON_MESSAGE(WM_DISPLAYCHANGE, &CTrafficMonitorDlg::OnDisplaychange) ON_WM_EXITSIZEMOVE() + ON_COMMAND(ID_PLUGIN_MANAGE, &CTrafficMonitorDlg::OnPluginManage) END_MESSAGE_MAP() @@ -1826,6 +1829,12 @@ BOOL CTrafficMonitorDlg::OnCommand(WPARAM wParam, LPARAM lParam) theApp.SaveConfig(); m_connection_change_flag = true; } +#ifdef DEBUG + if (uMsg == ID_CMD_TEST) + { + CTest::TestCommand(); + } +#endif // DEBUG return CDialog::OnCommand(wParam, lParam); } @@ -2581,3 +2590,11 @@ void CTrafficMonitorDlg::OnExitSizeMove() CDialog::OnExitSizeMove(); } + + +void CTrafficMonitorDlg::OnPluginManage() +{ + // TODO: 在此添加命令处理程序代码 + CPluginManagerDlg dlg; + dlg.DoModal(); +} diff --git a/TrafficMonitor/TrafficMonitorDlg.h b/TrafficMonitor/TrafficMonitorDlg.h index 0bd582fbe..878264c14 100644 --- a/TrafficMonitor/TrafficMonitorDlg.h +++ b/TrafficMonitor/TrafficMonitorDlg.h @@ -254,4 +254,5 @@ class CTrafficMonitorDlg : public CDialog afx_msg LRESULT OnDisplaychange(WPARAM wParam, LPARAM lParam); public: afx_msg void OnExitSizeMove(); + afx_msg void OnPluginManage(); }; diff --git a/TrafficMonitor/res/menu_icon/plugins.ico b/TrafficMonitor/res/menu_icon/plugins.ico new file mode 100644 index 0000000000000000000000000000000000000000..2be3cc1e4c20fc95a3040740b3ef32ae043ee37f GIT binary patch literal 9622 zcmeHLJx^3Y6deLcP!cF0*$Qb)P#Y4Zx3a|sXsry5oBaWrYyyRqTPl^Ul>sXwg;?3a zAAp1e35LRuP#Bf4p2N<;yR-8iy9-Yid@niNJLi7P%$<2Nk9Drg^|+xShiA;q^*Hws z+VF6#{o$H(@4yubwf2jC=bqev=UA=%7IELoZ-<#c^S@`)9PC)m1cnrV9#I&`U24FL7klSVa#lp9~}AD zz_h_r=s$p49@NQMpI2yaM)I-GY0INM0#t#!z#XrT1U}5YXF2NRfKJZ$72_)coTG3L z`XO)|829>pNZBb_&z;D8=fShyte3!C%fNsKb#k&(G6ru&{R57Bg6qh-3mnscJgEcZ zWT#|IuY4rQc^lVKNXjQWWm3MR`MyVt=1V;`-vy0J5`J6{*4EZKwjSiHPttnq!LO6| z-+7O31M_X>Jm8+6HegKbJeUE`oE)dXHR8H+FA>zq$xg|b8Lexl%W8EW_tCyvbrZ)} z>zi{2aNksC=(_+p>qDKf%rPflNpRfLO91xzUAYY%d z)=Cn5*7Zp{pZQ*%^?c6seqo(3#svY_+FTcaafCs?;@*Re$=Fb@_fOl^cSOIGFK@qTy8+i$ zoXtVq=Z^Ioa-VE$yKy#$?_cxgPy7uJ`WXZ`mXkA=PH49k7k1!tN57Tj8}o^A@|Vog zC(GO#zhtbh7$<+pEPb-ft?^67`igP#mu%8U`?%qMLFPe@)AoN$aT=Q>^7HHo-}P8K ztM{Mh*hfHh2>T{a`>4iD$+qWPinBR#{o*U&*D=5UN~Qe%OW2OsBgbcgHODw>r=F!x zmbsgm#}(>d=XXo@80OzrT%@-7{TCJ`Z)aKo{9aJ^Y;~6hiS6x5W%uCCdI<9Jv4P@R Gjr#+0{y>xf literal 0 HcmV?d00001 diff --git a/TrafficMonitor/resource.h b/TrafficMonitor/resource.h index 0c2c49177..347120cd6 100644 --- a/TrafficMonitor/resource.h +++ b/TrafficMonitor/resource.h @@ -232,8 +232,10 @@ #define IDD_SELECT_ORDER_DIALOG 330 #define IDS_COLOR 331 #define IDS_COLOR_LABEL 332 +#define IDD_PLUGIN_MANAGER_DIALOG 332 #define IDS_COLOR_VALUE 333 #define IDS_GPU_USAGE 334 +#define IDI_PLUGINS 334 #define IDS_IF_OPER_STATUS_UP 335 #define IDS_IF_OPER_STATUS_DOWN 336 #define IDS_IF_OPER_STATUS_DORMANT 337 @@ -247,6 +249,8 @@ #define IDS_HARDWARE_MONITOR_WARNING 345 #define IDS_HARDWARE_MONITOR_WARNING2 346 #define IDS_HDD_USAGE 347 +#define IDS_FILE_NAME 348 +#define IDS_STATUS 349 #define IDC_STATIC_INFO 1001 #define IDC_STATIC1 1002 #define IDC_STATIC_DOWN 1002 @@ -434,6 +438,8 @@ #define IDC_MOVE_UP_BUTTON 1136 #define IDC_MOVE_DOWN_BUTTON 1137 #define IDC_SET_ORDER_BUTTON 1137 +#define IDC_OPTINS_BUTTON 1139 +#define IDC_PLUGIN_MANAGE_BUTTON 1140 #define ID_32771 32771 #define ID_NETWORK_INFO 32772 #define ID_32773 32773 @@ -530,7 +536,7 @@ #define ID_FIRST_DAY_OF_WEEK_MONDAY 32866 #define ID_CALENDAR_JUMP_TO_TODAY 32867 #define ID_FREQUENTY_ASKED_QUESTIONS 32868 -#define ID_32869 32869 +#define ID_CMD_TEST 32869 #define ID_SHOW_UP_SPEED 32870 #define ID_SHOW_DOWN_SPEED 32871 #define ID_SHOW_CPU_USAGE 32872 @@ -543,16 +549,18 @@ #define ID_SHOW_HDD 32879 #define ID_UPDATE_LOG 32880 #define ID_HELP_32881 32881 +#define ID_32882 32882 +#define ID_PLUGIN_MANAGE 32883 #define ID_SELETE_CONNECTION 33000 #define ID_SELECT_ALL_CONNECTION 33001 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 332 -#define _APS_NEXT_COMMAND_VALUE 32882 -#define _APS_NEXT_CONTROL_VALUE 1139 +#define _APS_NEXT_RESOURCE_VALUE 335 +#define _APS_NEXT_COMMAND_VALUE 32884 +#define _APS_NEXT_CONTROL_VALUE 1141 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif