From 89bcc7791c48d8bcf8e124e56849e44563f8097c Mon Sep 17 00:00:00 2001
From: LAPTOP-T815PCOQ\25526 <mr.liuyang@126.com>
Date: 星期一, 23 十二月 2024 18:34:18 +0800
Subject: [PATCH] 1.对话框基类加载资源库、卸载资源库 2. 报警模块的界面添加分页功能

---
 SourceCode/Bond/BondEq/CPageAlarm.h   |   15 +++
 SourceCode/Bond/BondEq/CBaseDlg.cpp   |   86 ++++++++++++++-------
 SourceCode/Bond/BondEq/CBaseDlg.h     |   18 +++-
 SourceCode/Bond/BondEq/CPageAlarm.cpp |  109 +++++++++++++++++++++++---
 4 files changed, 178 insertions(+), 50 deletions(-)

diff --git a/SourceCode/Bond/BondEq/CBaseDlg.cpp b/SourceCode/Bond/BondEq/CBaseDlg.cpp
index 2ddd896..86b7926 100644
--- a/SourceCode/Bond/BondEq/CBaseDlg.cpp
+++ b/SourceCode/Bond/BondEq/CBaseDlg.cpp
@@ -9,10 +9,15 @@
 CFont g_defaultFont;
 Theme* g_currentTheme = &g_lightTheme;
 
+// 全局资源句柄
+HINSTANCE g_hCurrentResource = NULL;
+
 IMPLEMENT_DYNAMIC(CBaseDlg, CDialogEx)
 
-CBaseDlg::CBaseDlg(UINT id, CWnd* pPage) : CDialogEx(id, pPage), m_bResizing(false)
+CBaseDlg::CBaseDlg(UINT nID, CWnd* pPage) : CDialogEx(nID, pPage), m_bResizing(false)
 {
+	m_nID = nID;
+	m_pParent = pPage;
 	m_nInitialWidth = 0;
 	m_nInitialHeight = 0;
 }
@@ -23,6 +28,57 @@
 	m_mapFonts.clear();
 	m_mapCtrlLayouts.clear();
 	m_mapControls.clear();
+}
+
+void CBaseDlg::SwitchTheme(ThemeType enThemeType)
+{
+	// 使用 map 来根据 themeType 查找主题
+	static const std::unordered_map<ThemeType, Theme*> themeMap = {
+		{ ThemeType::Light, &g_lightTheme },
+		{ ThemeType::Dark, &g_darkTheme }
+	};
+
+	// 设置当前主题
+	auto it = themeMap.find(enThemeType);
+	if (it != themeMap.end()) {
+		g_currentTheme = it->second;
+	}
+	else {
+		g_currentTheme = &g_lightTheme;
+	}
+
+	// 更新控件的外观
+	CWnd* pWnd = GetWindow(GW_CHILD);
+	while (pWnd) {
+		pWnd->Invalidate();
+		pWnd = pWnd->GetNextWindow();
+	}
+
+	// 更新对话框背景颜色
+	SetBackgroundColor(g_currentTheme->backgroundColor);
+}
+
+void CBaseDlg::LoadResourceLibrary(const CString& strLanguage)
+{
+	// 卸载之前加载的资源库
+	UnloadResourceLibrary();
+
+	// 加载新的资源库
+	g_hCurrentResource = AfxLoadLibrary(strLanguage);
+
+	// 设置新的资源句柄
+	if (g_hCurrentResource != NULL) {
+		AfxSetResourceHandle(g_hCurrentResource);
+	}
+}
+
+void CBaseDlg::UnloadResourceLibrary()
+{
+	// 卸载之前加载的资源库
+	if (g_hCurrentResource != NULL) {
+		FreeLibrary(g_hCurrentResource);	// 释放当前资源库
+		g_hCurrentResource = NULL;			// 清空资源句柄
+	}
 }
 
 CFont* CBaseDlg::GetOrCreateFont(int nFontSize)
@@ -104,34 +160,6 @@
 		return it->second.get();
 	}
 	return nullptr;
-}
-
-void CBaseDlg::SwitchTheme(ThemeType themeType)
-{
-	// 使用 map 来根据 themeType 查找主题
-	static const std::unordered_map<ThemeType, Theme*> themeMap = {
-		{ ThemeType::Light, &g_lightTheme },
-		{ ThemeType::Dark, &g_darkTheme }
-	};
-
-	// 设置当前主题
-	auto it = themeMap.find(themeType);
-	if (it != themeMap.end()) {
-		g_currentTheme = it->second;
-	}
-	else {
-		g_currentTheme = &g_lightTheme;
-	}
-
-	// 更新控件的外观
-	CWnd* pWnd = GetWindow(GW_CHILD);
-	while (pWnd) {
-		pWnd->Invalidate(); // 重绘控件
-		pWnd = pWnd->GetNextWindow();
-	}
-
-	// 更新对话框背景颜色
-	SetBackgroundColor(g_currentTheme->backgroundColor);
 }
 
 void CBaseDlg::AdjustControls(float dScaleX, float dScaleY)
diff --git a/SourceCode/Bond/BondEq/CBaseDlg.h b/SourceCode/Bond/BondEq/CBaseDlg.h
index f817e60..22bd266 100644
--- a/SourceCode/Bond/BondEq/CBaseDlg.h
+++ b/SourceCode/Bond/BondEq/CBaseDlg.h
@@ -19,12 +19,19 @@
 	DECLARE_DYNAMIC(CBaseDlg)
 
 public:
-	CBaseDlg(UINT id, CWnd* pPage);				// 标准构造函数
+	CBaseDlg(UINT nID, CWnd* pPage);			// 标准构造函数
 	virtual ~CBaseDlg();						// 析构函数
 
+	// 主题管理
+	void SwitchTheme(ThemeType enThemeType);			// 切换主题
+
+	// 资源管理
+	void LoadResourceLibrary(const CString& strLanguage);			// 加载资源库
+	void UnloadResourceLibrary();									// 卸载资源库
+
 	// 字体管理
-	CFont* GetOrCreateFont(int nFontSize);		// 获取或创建字体
-	void SetDefaultFont();						// 设置默认字体
+	CFont* GetOrCreateFont(int nFontSize);			// 获取或创建字体
+	void SetDefaultFont();							// 设置默认字体
 
 	// 动态控件管理
 	BOOL AddControl(UINT nCtrlID, CWnd* pControl);					// 添加控件
@@ -32,14 +39,13 @@
 	BOOL UpdateControlText(UINT nCtrlID, const CString& strText);   // 更新控件文本
 	CWnd* GetControl(UINT nCtrlID);									// 获取控件
 
-	// 主题设置
-	void SwitchTheme(ThemeType themeType);							// 切换主题
-
 private:
 	void AdjustControls(float dScaleX, float dScaleY);				// 调整控件大小
 	void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);	// 调整控件字体
 
 private:
+	UINT m_nID;													// 对话框ID
+	CWnd* m_pParent;											// 父窗口
 	bool m_bResizing;											// 控件是否正在调整大小
 	int m_nInitialWidth;										// 对话框初始宽度
 	int m_nInitialHeight;										// 对话框初始高度	
diff --git a/SourceCode/Bond/BondEq/CPageAlarm.cpp b/SourceCode/Bond/BondEq/CPageAlarm.cpp
index f03c56b..f414c24 100644
--- a/SourceCode/Bond/BondEq/CPageAlarm.cpp
+++ b/SourceCode/Bond/BondEq/CPageAlarm.cpp
@@ -8,6 +8,7 @@
 #include "Common.h"
 #include "ToolUnits.h"
 
+#define PAGE_SIZE		20
 
 // CPageAlarm 对话框
 
@@ -19,6 +20,9 @@
 	m_crBkgnd = PAGE_BACKGROUND_COLOR;
 	m_hbrBkgnd = nullptr;
 	m_pObserver = nullptr;
+	m_nCurPage = 0;
+	m_nTotalPages = 0;
+	m_nDateTimeFlag = 0;
 }
 
 CPageAlarm::~CPageAlarm()
@@ -27,6 +31,8 @@
 
 void CPageAlarm::DoDataExchange(CDataExchange* pDX)
 {
+	DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dateTimeStart);
+	DDX_Control(pDX, IDC_DATETIMEPICKER_END, m_dateTimeEnd);
 	CDialogEx::DoDataExchange(pDX);
 }
 
@@ -35,6 +41,8 @@
 	ON_WM_CTLCOLOR()
 	ON_WM_DESTROY()
 	ON_WM_SIZE()
+	ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CPageAlarm::OnBnClickedButtonPrevPage)
+	ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CPageAlarm::OnBnClickedButtonNextPage)
 END_MESSAGE_MAP()
 
 
@@ -150,13 +158,12 @@
 	GetClientRect(&rcClient);
 
 	pItem = GetDlgItem(IDC_LIST_ALARM);
-	pItem->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
+	pItem->MoveWindow(12, 52, rcClient.Width() - 24, rcClient.Height() - 64);
 }
 
 void CPageAlarm::LoadAlarms()
 {
 	CAlarmMonitor* pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent(ALARM_MONITOR);
-
 
 	// 当前正在发生的报警
 	pMonitor->Lock();
@@ -166,19 +173,9 @@
 	}
 	pMonitor->Unlock();
 
-
-	// 获取历史报警数据
-	auto vecData = AlarmManager::getInstance().getAllAlarms();
-
-	// 填充数据
-	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
-	for (auto item : vecData) {
-		pListCtrl->InsertItem(0, _T(""));
-		pListCtrl->SetItemText(0, 1, item[0].c_str());
-		pListCtrl->SetItemText(0, 2, item[1].c_str());
-		pListCtrl->SetItemText(0, 3, item[2].c_str());
-		pListCtrl->SetItemText(0, 4, item[3].c_str());
-	}
+	// 刷新历史报警数据
+	m_nCurPage = 1;
+	UpdatePageData();
 }
 
 void CPageAlarm::AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm)
@@ -213,6 +210,74 @@
 	}
 }
 
+void CPageAlarm::UpdatePageData()
+{
+	// 计算总页数
+	int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", "");
+	m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
+
+	std::vector<std::vector<std::string>> vecData;
+
+	// 根据时间过滤条件加载数据
+	if (m_nDateTimeFlag == 0) {
+		vecData = AlarmManager::getInstance().getAlarms((m_nCurPage - 1) * PAGE_SIZE, PAGE_SIZE);
+	}
+	else {
+		COleDateTime startTime, endTime;
+		m_dateTimeStart.GetTime(startTime);
+		m_dateTimeEnd.GetTime(endTime);
+		CString strStartTime = startTime.Format(_T("%Y-%m-%d %H:%M:%S"));
+		CString strEndTime = endTime.Format(_T("%Y-%m-%d %H:%M:%S"));
+
+		std::string start = CT2A(strStartTime);
+		std::string end = CT2A(strEndTime);
+
+		vecData = AlarmManager::getInstance().getFilteredAlarms("", start, end, m_nCurPage, PAGE_SIZE);
+	}
+
+	if (vecData.empty()) return;
+
+	// 填充数据到控件
+	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+	FillDataToListCtrl(pListCtrl, vecData);
+
+	// 更新分页控件(页数和按钮)
+	UpdatePageControls();
+}
+
+void CPageAlarm::UpdatePageControls()
+{
+	// 更新分页信息
+	CString strPage;
+	strPage.Format(_T("第 %d 页"), m_nCurPage);
+	SetDlgItemText(IDC_LABEL_PAGE_NUMBER, strPage);
+
+	// 启用/禁用翻页按钮
+	GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurPage > 1);
+	GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurPage < m_nTotalPages);
+}
+
+void CPageAlarm::FillDataToListCtrl(CListCtrl* pListCtrl, const std::vector<std::vector<std::string>>& vecData)
+{
+	// 清空当前CListCtrl中的所有项
+	for (int i = 0; i < pListCtrl->GetItemCount(); i++) {
+		CAlarm* pAlarm = (CAlarm*)pListCtrl->GetItemData(i);
+		if (pAlarm != nullptr) {
+			pAlarm->release();
+		}
+	}
+	pListCtrl->DeleteAllItems();
+
+	// 遍历数据并插入到CListCtrl中
+	for (const auto& item : vecData) {
+		int nItem = pListCtrl->InsertItem(pListCtrl->GetItemCount(), _T(""));	// 插入新行
+		pListCtrl->SetItemText(nItem, 1, item[0].c_str());						// 设置第一列的文本
+		pListCtrl->SetItemText(nItem, 2, item[1].c_str());						// 设置第二列的文本
+		pListCtrl->SetItemText(nItem, 3, item[2].c_str());						// 设置第三列的文本
+		pListCtrl->SetItemText(nItem, 4, item[3].c_str());						// 设置第四列的文本
+	}
+}
+
 BOOL CPageAlarm::DestroyWindow()
 {
 	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
@@ -225,3 +290,17 @@
 
 	return CDialogEx::DestroyWindow();
 }
+
+void CPageAlarm::OnBnClickedButtonPrevPage()
+{
+	// 点击上一页
+	m_nCurPage--;
+	UpdatePageData();  // 调用分页更新函数
+}
+
+void CPageAlarm::OnBnClickedButtonNextPage()
+{
+	// 点击下一页
+	m_nCurPage++;
+	UpdatePageData();  // 调用分页更新函数
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/BondEq/CPageAlarm.h b/SourceCode/Bond/BondEq/CPageAlarm.h
index 583a6b2..b38471b 100644
--- a/SourceCode/Bond/BondEq/CPageAlarm.h
+++ b/SourceCode/Bond/BondEq/CPageAlarm.h
@@ -18,11 +18,24 @@
 	void LoadAlarms();
 	void AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
 	void UpdateAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
+	void UpdatePageData();
+	void UpdatePageControls();
+	void FillDataToListCtrl(CListCtrl* pListCtrl, const std::vector<std::vector<std::string>>& vecData);
 
 private:
 	COLORREF m_crBkgnd;
 	HBRUSH m_hbrBkgnd;
 	IObserver* m_pObserver;
+
+	// 页码
+	int m_nCurPage;
+	int m_nTotalPages;
+	// 日期时间标志
+	int m_nDateTimeFlag;
+
+	// 控件
+	CDateTimeCtrl m_dateTimeStart;
+	CDateTimeCtrl m_dateTimeEnd;
 
 
 // 对话框数据
@@ -40,4 +53,6 @@
 	afx_msg void OnDestroy();
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	virtual BOOL DestroyWindow();
+	afx_msg void OnBnClickedButtonPrevPage();
+	afx_msg void OnBnClickedButtonNextPage();
 };

--
Gitblit v1.9.3