From 829fe6c6bc33d53fda9c31fd45a37e1df87befff Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 30 一月 2026 11:16:24 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/AlarmPopupDlg.cpp |  117 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 80 insertions(+), 37 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmPopupDlg.cpp b/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
index cc2a48d..8f7b50a 100644
--- a/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
+++ b/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
@@ -5,6 +5,7 @@
 #include "Log.h"
 #include "Common.h"
 #include "HorizontalLine.h"
+#include "ServoDlg.h"
 
 
 IMPLEMENT_DYNAMIC(CAlarmPopupDlg, CDialogEx)
@@ -30,6 +31,8 @@
 BEGIN_MESSAGE_MAP(CAlarmPopupDlg, CDialogEx)
 	ON_BN_CLICKED(IDC_POPUP_BTN_CLOSE, &CAlarmPopupDlg::OnBnClickedClose)
 	ON_BN_CLICKED(IDC_BUTTON_ALARM_OFF, &CAlarmPopupDlg::OnBnClickedAlarmOff)
+	ON_BN_CLICKED(IDC_BUTTON_PREV, &CAlarmPopupDlg::OnBnClickedPrev)
+	ON_BN_CLICKED(IDC_BUTTON_NEXT, &CAlarmPopupDlg::OnBnClickedNext)
 	ON_WM_CTLCOLOR()
 	ON_WM_DESTROY()
 END_MESSAGE_MAP()
@@ -140,7 +143,7 @@
 
 void CAlarmPopupDlg::ShowNoAlarmControls(bool bShow)
 {
-	const int ids[] = { IDC_LABEL_NO_ALARM, IDC_POPUP_BTN_CLOSE };
+	const int ids[] = { IDC_LABEL_NO_ALARM };
 	for (int id : ids) {
 		if (auto* p = GetDlgItem(id)) {
 			p->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
@@ -166,45 +169,14 @@
 
 void CAlarmPopupDlg::RefreshContent()
 {
-	auto actives = AlarmManager::getInstance().getActiveAlarms();
-	if (!actives.empty()) {
-		m_activeAlarm = actives.front();
+	m_activeAlarms = AlarmManager::getInstance().getActiveAlarms();
+	m_activeIndex = 0;
+
+	if (!m_activeAlarms.empty()) {
 		m_hasActive = true;
-
-		AlarmManager& alarmManager = AlarmManager::getInstance();
-		const AlarmInfo* info = alarmManager.getAlarmInfoByID(m_activeAlarm.nId);
-
-		CString title, level, name, desc;
-		level.Format(_T("绛夌骇: %d"), m_activeAlarm.nSeverityLevel);
-
-		if (info != nullptr && !info->strAlarmText.empty()) {
-			name = CString(info->strAlarmText.c_str());
-		}
-		else {
-			name.Format(_T("ID:%d (%s)"), m_activeAlarm.nId, CString(m_activeAlarm.strDeviceName.c_str()));
-		}
-
-		if (!m_activeAlarm.strDescription.empty()) {
-			desc = CString(m_activeAlarm.strDescription.c_str());
-		}
-		else if (info != nullptr && !info->strDescription.empty()) {
-			desc = CString(info->strDescription.c_str());
-		}
-		else {
-			desc = _T("鏆傛棤鎻忚堪");
-		}
-
-		title.Format(_T("璁惧:%s 鍗曞厓:%s"),
-			CString(m_activeAlarm.strDeviceName.c_str()),
-			CString(m_activeAlarm.strUnitName.c_str()));
-
-		SetDlgItemText(IDC_LABEL_TITLE, title);
-		SetDlgItemText(IDC_LABEL_NAME, name);
-		SetDlgItemText(IDC_LABEL_LEVEL, level);
-		SetDlgItemText(IDC_LABEL_DESCRIPTION, desc);
+		DisplayActiveAt(m_activeIndex);
 		ShowAlarmControls(true);
 		ShowNoAlarmControls(false);
-		ShowWindow(SW_SHOW);
 	}
 	else {
 		m_hasActive = false;
@@ -235,6 +207,77 @@
 	RefreshContent();
 }
 
+void CAlarmPopupDlg::OnBnClickedPrev()
+{
+	if (m_activeIndex > 0) {
+		--m_activeIndex;
+		DisplayActiveAt(m_activeIndex);
+	}
+}
+
+void CAlarmPopupDlg::OnBnClickedNext()
+{
+	if (m_activeIndex + 1 < static_cast<int>(m_activeAlarms.size())) {
+		++m_activeIndex;
+		DisplayActiveAt(m_activeIndex);
+	}
+}
+
+void CAlarmPopupDlg::DisplayActiveAt(int idx)
+{
+	if (idx < 0 || idx >= static_cast<int>(m_activeAlarms.size())) return;
+
+	m_activeAlarm = m_activeAlarms[idx];
+
+	// 鏍囪宸茶
+	if (auto* pParent = dynamic_cast<CServoDlg*>(GetParent())) {
+		pParent->AckAlarm(m_activeAlarm.nId);
+	}
+
+	AlarmManager& alarmManager = AlarmManager::getInstance();
+	const AlarmInfo* info = alarmManager.getAlarmInfoByID(m_activeAlarm.nId);
+
+	CString title, level, name, desc;
+	level.Format(_T("绛夌骇: %d"), m_activeAlarm.nSeverityLevel);
+
+	if (info != nullptr && !info->strAlarmText.empty()) {
+		name = CString(info->strAlarmText.c_str());
+	}
+	else {
+		name.Format(_T("ID:%d (%s)"), m_activeAlarm.nId, CString(m_activeAlarm.strDeviceName.c_str()));
+	}
+
+	if (!m_activeAlarm.strDescription.empty()) {
+		desc = CString(m_activeAlarm.strDescription.c_str());
+	}
+	else if (info != nullptr && !info->strDescription.empty()) {
+		desc = CString(info->strDescription.c_str());
+	}
+	else {
+		desc = _T("鏆傛棤鎻忚堪");
+	}
+
+	title.Format(_T("璁惧:%s 鍗曞厓:%s"),
+		CString(m_activeAlarm.strDeviceName.c_str()),
+		CString(m_activeAlarm.strUnitName.c_str()));
+
+	SetDlgItemText(IDC_LABEL_TITLE, title);
+	SetDlgItemText(IDC_LABEL_NAME, name);
+	SetDlgItemText(IDC_LABEL_LEVEL, level);
+	SetDlgItemText(IDC_LABEL_DESCRIPTION, desc);
+
+	UpdateNavButtons();
+	ShowWindow(SW_SHOW);
+}
+
+void CAlarmPopupDlg::UpdateNavButtons()
+{
+	auto* pPrev = GetDlgItem(IDC_BUTTON_PREV);
+	auto* pNext = GetDlgItem(IDC_BUTTON_NEXT);
+	if (pPrev) pPrev->EnableWindow(m_activeIndex > 0);
+	if (pNext) pNext->EnableWindow(m_activeIndex + 1 < static_cast<int>(m_activeAlarms.size()));
+}
+
 HBRUSH CAlarmPopupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
 {
 	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

--
Gitblit v1.9.3