From 2254c453025136727917601091f14da02af1b548 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期三, 21 一月 2026 15:02:41 +0800
Subject: [PATCH] 1.完善警告,软警告上抛和清除测试;

---
 SourceCode/Bond/Servo/resource.h        |    4 +
 SourceCode/Bond/Servo/Servo.rc          |    8 +-
 SourceCode/Bond/Servo/AlarmPopupDlg.cpp |  110 ++++++++++++++++++++++++------------
 SourceCode/Bond/Servo/ServoDlg.cpp      |   36 ++++++++----
 SourceCode/Bond/Servo/AlarmPopupDlg.h   |    6 ++
 SourceCode/Bond/Servo/ServoDlg.h        |    4 +
 6 files changed, 116 insertions(+), 52 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmPopupDlg.cpp b/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
index 5b7bc56..0c64574 100644
--- a/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
+++ b/SourceCode/Bond/Servo/AlarmPopupDlg.cpp
@@ -30,6 +30,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()
@@ -151,6 +153,7 @@
 void CAlarmPopupDlg::ShowAlarmControls(bool bShow)
 {
 	const int ids[] = {
+		IDC_BUTTON_PREV, IDC_BUTTON_NEXT,
 		IDC_LABEL_TITLE, IDC_ICON_ALARM, IDC_ICON_TITLE,
 		IDC_LABEL_LEVEL, IDC_LABEL_NAME,
 		IDC_LINE1, IDC_BUTTON_SOUND_OFF, IDC_BUTTON_ALARM_OFF,
@@ -165,45 +168,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;
@@ -234,6 +206,72 @@
 	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];
+
+	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);
diff --git a/SourceCode/Bond/Servo/AlarmPopupDlg.h b/SourceCode/Bond/Servo/AlarmPopupDlg.h
index 5ca49a0..9822f18 100644
--- a/SourceCode/Bond/Servo/AlarmPopupDlg.h
+++ b/SourceCode/Bond/Servo/AlarmPopupDlg.h
@@ -43,11 +43,17 @@
 	afx_msg void OnDestroy();
 	afx_msg void OnBnClickedClose();
 	afx_msg void OnBnClickedAlarmOff();
+	afx_msg void OnBnClickedPrev();
+	afx_msg void OnBnClickedNext();
 
 private:
 	bool m_hasActive;
 	AlarmData m_activeAlarm;
+	std::vector<AlarmData> m_activeAlarms;
+	int m_activeIndex = 0;
 	void SetButtonBackgroundColors(bool bMute);
 	void ShowNoAlarmControls(bool bShow);
 	void ShowAlarmControls(bool bShow);
+	void UpdateNavButtons();
+	void DisplayActiveAt(int idx);
 };
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index 7249afd..e0f3ec0 100644
--- a/SourceCode/Bond/Servo/Servo.rc
+++ b/SourceCode/Bond/Servo/Servo.rc
@@ -841,10 +841,10 @@
 BEGIN
     PUSHBUTTON      "<< 上一条",IDC_BUTTON_PREV,8,224,50,14,NOT WS_VISIBLE
     PUSHBUTTON      "下一条 >>",IDC_BUTTON_NEXT,62,224,50,14,NOT WS_VISIBLE
-    LTEXT           "警告",IDC_LABEL_TITLE,27,6,67,17,SS_CENTERIMAGE | NOT WS_VISIBLE
+    LTEXT           "警告",IDC_LABEL_TITLE,27,6,212,17,SS_CENTERIMAGE | NOT WS_VISIBLE
     ICON            "",IDC_ICON_ALARM,29,28,20,20
     ICON            "",IDC_ICON_TITLE,7,8,20,20,NOT WS_VISIBLE
-    LTEXT           "等级:--",IDC_LABEL_LEVEL,75,26,118,18
+    LTEXT           "等级:--",IDC_LABEL_LEVEL,75,26,161,18
     LTEXT           "警告名称",IDC_LABEL_NAME,120,45,251,24
     PUSHBUTTON      "",IDC_POPUP_BTN_CLOSE,354,0,24,22
     CONTROL         "Custom1",IDC_LINE1,"BYHorizontalLine",WS_TABSTOP,7,78,364,8
@@ -852,7 +852,7 @@
     PUSHBUTTON      "异常解除",IDC_BUTTON_ALARM_OFF,304,216,68,22,WS_DISABLED
     CONTROL         "Custom1",IDC_LINE2,"BYHorizontalLine",WS_TABSTOP,7,202,364,8
     LTEXT           "警告描述:",IDC_LABEL_DESCRIPTION,18,98,329,89
-    LTEXT           "当前没有警告", IDC_LABEL_NO_ALARM, 18, 98, 329, 89, SS_CENTER | SS_CENTERIMAGE | NOT WS_VISIBLE
+    CTEXT           "当前没有警告",IDC_LABEL_NO_ALARM,18,98,329,89,SS_CENTERIMAGE | NOT WS_VISIBLE
 END
 
 
@@ -1633,6 +1633,8 @@
     END
     POPUP "测试(&T)"
     BEGIN
+        MENUITEM "Test1",                       ID_MENU_TEST_ALARM_ON
+        MENUITEM "Test2",                       ID_MENU_TEST_ALARM_OFF
         MENUITEM "Message &Set",                ID_MENU_TEST_MESSAGE_SET
         MENUITEM "Message &Clear",              ID_MENU_TEST_MESSAGE_CLEAR
     END
diff --git a/SourceCode/Bond/Servo/ServoDlg.cpp b/SourceCode/Bond/Servo/ServoDlg.cpp
index f8a74b8..9d50889 100644
--- a/SourceCode/Bond/Servo/ServoDlg.cpp
+++ b/SourceCode/Bond/Servo/ServoDlg.cpp
@@ -140,6 +140,10 @@
 	ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SECSTEST, &CServoDlg::OnUpdateMenuFileSecsTest)
 	ON_COMMAND(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnMenuProjectVarialbleList)
 	ON_UPDATE_COMMAND_UI(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnUpdateMenuProjectVarialbleList)
+	ON_COMMAND(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnMenuTestAlarmOn)
+	ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnUpdateMenuTestAlarmOn)
+	ON_COMMAND(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnMenuTestAlarmOff)
+	ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnUpdateMenuTestAlarmOff)
 	ON_COMMAND(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnMenuTestMessageSet)
 	ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnUpdateMenuTestMessageSet)
 	ON_COMMAND(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnMenuTestMessageClear)
@@ -815,6 +819,26 @@
 	pCmdUI->Enable(TRUE);
 }
 
+void CServoDlg::OnMenuTestAlarmOn()
+{
+	RaiseTestAlarm();
+}
+
+void CServoDlg::OnUpdateMenuTestAlarmOn(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable(TRUE);
+}
+
+void CServoDlg::OnMenuTestAlarmOff()
+{
+	ClearTestAlarm();
+}
+
+void CServoDlg::OnUpdateMenuTestAlarmOff(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable(TRUE);
+}
+
 void CServoDlg::OnMenuTestMessageSet()
 {
 	SERVO::CEquipment* pEquipment = m_pPanelMaster->GetActiveEquipment();
@@ -1464,18 +1488,6 @@
 
 BOOL CServoDlg::PreTranslateMessage(MSG* pMsg)
 {
-	if (pMsg->message == WM_KEYDOWN) {
-		const bool ctrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
-		const bool alt = (GetKeyState(VK_MENU) & 0x8000) != 0;
-		if (ctrl && alt && pMsg->wParam == 'T') {
-			RaiseTestAlarm();
-			return TRUE;
-		}
-		if (ctrl && alt && pMsg->wParam == 'Y') {
-			ClearTestAlarm();
-			return TRUE;
-		}
-	}
 	return CDialogEx::PreTranslateMessage(pMsg);
 }
 
diff --git a/SourceCode/Bond/Servo/ServoDlg.h b/SourceCode/Bond/Servo/ServoDlg.h
index ec0cba7..aa16b76 100644
--- a/SourceCode/Bond/Servo/ServoDlg.h
+++ b/SourceCode/Bond/Servo/ServoDlg.h
@@ -113,6 +113,10 @@
 	afx_msg void OnUpdateMenuFileExit(CCmdUI* pCmdUI);
 	afx_msg void OnMenuProjectVarialbleList();
 	afx_msg void OnUpdateMenuProjectVarialbleList(CCmdUI* pCmdUI);
+	afx_msg void OnMenuTestAlarmOn();
+	afx_msg void OnUpdateMenuTestAlarmOn(CCmdUI* pCmdUI);
+	afx_msg void OnMenuTestAlarmOff();
+	afx_msg void OnUpdateMenuTestAlarmOff(CCmdUI* pCmdUI);
 	afx_msg void OnMenuTestMessageSet();
 	afx_msg void OnUpdateMenuTestMessageSet(CCmdUI* pCmdUI);
 	afx_msg void OnMenuTestMessageClear();
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index 5eacbaf..9cfbdd4 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
@@ -381,13 +381,15 @@
 #define ID_MENU_TOOLS_CLIENT_LIST       32801
 #define ID_MENU_WND_TEST_PANEL          32802
 #define ID_MENU_WND_PRO_PANEL           32803
+#define ID_MENU_TEST_ALARM_ON           32804
+#define ID_MENU_TEST_ALARM_OFF          32805
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        192
-#define _APS_NEXT_COMMAND_VALUE         32804
+#define _APS_NEXT_COMMAND_VALUE         32806
 #define _APS_NEXT_CONTROL_VALUE         1273
 #define _APS_NEXT_SYMED_VALUE           101
 #endif

--
Gitblit v1.9.3