From 02fb493f0903013e5258c2ff5e2cb27de873378a Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 12 十二月 2024 10:51:43 +0800
Subject: [PATCH] 1.警告性息弹窗; 2.警告性息列表;

---
 SourceCode/Bond/BondEq/CBonder.cpp                |   23 ++
 SourceCode/Bond/BondEq/InputDialog.cpp            |    1 
 SourceCode/Bond/BondEq/Resource.h                 |    0 
 SourceCode/Bond/BondEq/AlarmMonitor.cpp           |   44 +++-
 SourceCode/Bond/BondEq/BondEqDlg.h                |    4 
 SourceCode/Bond/BondEq/HorizontalLine.h           |    1 
 SourceCode/Bond/BondEq/BondEq.rc                  |    0 
 SourceCode/Bond/BondEq/AlarmMonitor.h             |    5 
 SourceCode/Bond/BondEq/HorizontalLine.cpp         |    6 
 SourceCode/Bond/BondEq/Component.h                |    4 
 SourceCode/Bond/BondEq/BondEqDlg.cpp              |   32 +++
 SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico      |    0 
 SourceCode/Bond/BondEq/BondEq.vcxproj             |    2 
 SourceCode/Bond/BondEq/AlarmPopupDlg.h            |   53 +++++
 SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico   |    0 
 SourceCode/Bond/BondEq/AlarmPopupDlg.cpp          |  216 ++++++++++++++++++++++++
 SourceCode/Bond/BondEq/CPageAlarm.h               |    6 
 SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico |    0 
 SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico  |    0 
 SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico  |    0 
 SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico      |    0 
 SourceCode/Bond/BondEq/CPageAlarm.cpp             |  109 +++++++++++
 SourceCode/Bond/BondEq/Common.h                   |   18 ++
 23 files changed, 506 insertions(+), 18 deletions(-)

diff --git a/SourceCode/Bond/BondEq/AlarmMonitor.cpp b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
index 8d3c9f5..4e23b8d 100644
--- a/SourceCode/Bond/BondEq/AlarmMonitor.cpp
+++ b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
@@ -95,13 +95,14 @@
 	for (auto iter = m_mapAlarming.begin(); iter != m_mapAlarming.end();/* iter++*/) {
 		if (!findAlarm(alarmIds, iter->first)) {
 			// 消除警告, 同时将信息发出,以使界面显示和历史记录保存
-			iter->second->alarmOff();
-			addAlarmToHistoryRecord(iter->second);
-			LOGE("消除了警告:%s", iter->second->toString().c_str());
-			SendBroadcast(&CIntent(BC_CODE_ALARM_OFF, "", iter->second));
-
-			iter->second->release();
+			CAlarm* pAlarm = iter->second;
+			pAlarm->alarmOff();
+			addAlarmToHistoryRecord(pAlarm);
 			m_mapAlarming.erase(iter++);
+
+			LOGE("消除了警告:%s", pAlarm->toString().c_str());
+			SendBroadcast(&CIntent(BC_CODE_ALARM_OFF, "", pAlarm));
+			pAlarm->release();
 		}
 		else {
 			iter++;
@@ -190,11 +191,9 @@
 	}
 }
 
-void CAlarmMonitor::getAlarmingMap(std::map<int, CAlarm*>& alarms)
+std::map<int, CAlarm*>& CAlarmMonitor::getAlarmingMap()
 {
-	Lock();
-	alarms = m_mapAlarming;
-	Unlock();
+	return m_mapAlarming;
 }
 
 BOOL CAlarmMonitor::isAlarming()
@@ -205,6 +204,31 @@
 	return bAlarming;
 }
 
+CAlarm* CAlarmMonitor::getActiveAlarm()
+{
+	Lock();
+	if (m_mapAlarming.empty()) {
+		Unlock();
+		return nullptr;
+	}
+	auto iter = m_mapAlarming.begin();
+	Unlock();
+
+	return iter->second;
+}
+
+std::list< CAlarm*>& CAlarmMonitor::getAlarmRecords()
+{
+	return m_alarms;
+}
+
+void CAlarmMonitor::getAlarmRecords(std::list< CAlarm*>& list)
+{
+	Lock();
+	list = m_alarms;
+	Unlock();
+}
+
 BOOL CAlarmMonitor::compareData(const char* pScrData, const char* pTarData, int len)
 {
 	for (int i = 0; i < len; i++) {
diff --git a/SourceCode/Bond/BondEq/AlarmMonitor.h b/SourceCode/Bond/BondEq/AlarmMonitor.h
index ecf7cbd..a0b0fac 100644
--- a/SourceCode/Bond/BondEq/AlarmMonitor.h
+++ b/SourceCode/Bond/BondEq/AlarmMonitor.h
@@ -21,8 +21,11 @@
 	virtual void OnTimer(UINT nTimerid);
 	const char* getAlarmText(int nID);
 	virtual void Serialize(CArchive& ar);
-	void getAlarmingMap(std::map<int, CAlarm*>& alarms);
+	std::map<int, CAlarm*>& getAlarmingMap();
 	BOOL isAlarming();
+	CAlarm* getActiveAlarm();
+	void getAlarmRecords(std::list< CAlarm*>& list);
+	std::list< CAlarm*>& getAlarmRecords();
 
 private:
 	BOOL compareData(const char* pScrData, const char* pTarData, int len);
diff --git a/SourceCode/Bond/BondEq/AlarmPopupDlg.cpp b/SourceCode/Bond/BondEq/AlarmPopupDlg.cpp
new file mode 100644
index 0000000..6df9740
--- /dev/null
+++ b/SourceCode/Bond/BondEq/AlarmPopupDlg.cpp
@@ -0,0 +1,216 @@
+// AlarmPopupDlg.cpp : 实现文件
+//
+
+#include "stdafx.h"
+#include "BondEq.h"
+#include "AlarmPopupDlg.h"
+#include "afxdialogex.h"
+#include "HorizontalLine.h"
+#include "AlarmMonitor.h"
+
+
+// CAlarmPopupDlg 对话框
+
+IMPLEMENT_DYNAMIC(CAlarmPopupDlg, CDialogEx)
+
+CAlarmPopupDlg::CAlarmPopupDlg(CWnd* pParent /*=NULL*/)
+	: CDialogEx(IDD_DIALOG_POPUP_ALARM, pParent)
+{
+	m_crBkgnd = RGB(225, 225, 225);
+	m_hbrBkgnd = nullptr;
+	m_pActiveAlarm = nullptr;
+}
+
+CAlarmPopupDlg::~CAlarmPopupDlg()
+{
+}
+
+void CAlarmPopupDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialogEx::DoDataExchange(pDX);
+}
+
+
+BEGIN_MESSAGE_MAP(CAlarmPopupDlg, CDialogEx)
+	ON_WM_CTLCOLOR()
+	ON_WM_DESTROY()
+	ON_WM_SIZE()
+	ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CAlarmPopupDlg::OnBnClickedButtonClose)
+END_MESSAGE_MAP()
+
+
+// CAlarmPopupDlg 消息处理程序
+
+
+BOOL CAlarmPopupDlg::OnInitDialog()
+{
+	CDialogEx::OnInitDialog();
+
+
+	// 字体
+	HFONT hFontDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+	LOGFONT lf;
+
+	::GetObject(hFontDefault, sizeof(LOGFONT), &lf);
+	lf.lfHeight -= 8;
+	lf.lfWeight = 700;
+	m_fontTitle.CreateFontIndirect(&lf);
+
+	::GetObject(hFontDefault, sizeof(LOGFONT), &lf);
+	lf.lfHeight -= 8;
+	m_fontLevel.CreateFontIndirect(&lf);
+
+	::GetObject(hFontDefault, sizeof(LOGFONT), &lf);
+	lf.lfHeight -= 16;
+	m_fontName.CreateFontIndirect(&lf);
+
+	::GetObject(hFontDefault, sizeof(LOGFONT), &lf);
+	lf.lfHeight -= 8;
+	m_fontDescription.CreateFontIndirect(&lf);
+
+	GetDlgItem(IDC_LABEL_TITLE)->SetFont(&m_fontTitle);
+	GetDlgItem(IDC_LABEL_LEVEL)->SetFont(&m_fontLevel);
+	GetDlgItem(IDC_LABEL_NAME)->SetFont(&m_fontName);
+	GetDlgItem(IDC_LABEL_DESCRIPTION)->SetFont(&m_fontDescription);
+
+
+	// 图标
+	CString strIcon1;
+	HICON hIcon;
+	CStatic* pStatic;
+
+	strIcon1.Format(_T("%s\\Res\\Alarm_o_24.ico"), theApp.m_strAppDir);
+	pStatic = (CStatic*)GetDlgItem(IDC_ICON_TITLE);
+	hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),
+		strIcon1, IMAGE_ICON, 24, 24,
+		LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
+	pStatic->SetIcon(hIcon);
+
+	strIcon1.Format(_T("%s\\Res\\Alarm_o_64.ico"), theApp.m_strAppDir);
+	pStatic = (CStatic*)GetDlgItem(IDC_ICON_ALARM);
+	hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),
+		strIcon1, IMAGE_ICON, 64, 64,
+		LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
+	pStatic->SetIcon(hIcon);
+
+
+	// 关闭按钮
+	strIcon1.Format(_T("%s\\Res\\close_blcak_24.ico"), theApp.m_strAppDir);
+	pStatic = (CStatic*)GetDlgItem(IDC_ICON_ALARM);
+	hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),
+		strIcon1, IMAGE_ICON, 128, 128,
+		LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
+	m_btnClose.SubclassDlgItem(IDC_BUTTON_CLOSE, this);
+	m_btnClose.SetIcon(hIcon, hIcon, 24);
+
+
+	// 解除警告按钮
+	m_btnAlarmOff.SubclassDlgItem(IDC_BUTTON_ALARM_OFF, this);
+	m_btnAlarmOff.SetFrameColor(BS_NORMAL, BTN_ALARM_OFF_FRAME_NORMAL);
+	m_btnAlarmOff.SetFrameColor(BS_HOVER, BTN_ALARM_OFF_FRAME_HOVER);
+	m_btnAlarmOff.SetFrameColor(BS_PRESS, BTN_ALARM_OFF_FRAME_PRESS);
+	m_btnAlarmOff.SetBkgndColor(BS_NORMAL, BTN_ALARM_OFF_BKGND_NORMAL);
+	m_btnAlarmOff.SetBkgndColor(BS_HOVER, BTN_ALARM_OFF_BKGND_HOVER);
+	m_btnAlarmOff.SetBkgndColor(BS_PRESS, BTN_ALARM_OFF_BKGND_PRESS);
+
+
+	// 静音按钮
+	m_btnSoundOff.SubclassDlgItem(IDC_BUTTON_SOUND_OFF, this);
+	m_btnSoundOff.SetFrameColor(BS_NORMAL, BTN_SOUND_OFF_FRAME_NORMAL);
+	m_btnSoundOff.SetFrameColor(BS_HOVER, BTN_SOUND_OFF_FRAME_HOVER);
+	m_btnSoundOff.SetFrameColor(BS_PRESS, BTN_SOUND_OFF_FRAME_PRESS);
+	m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_OFF_BKGND_NORMAL);
+	m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_OFF_BKGND_HOVER);
+	m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_OFF_BKGND_PRESS);
+
+
+	// 横线1
+	CHorizontalLine* pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE1)->m_hWnd);
+	pLine->SetBkgndColor(RGB(225, 225, 225));
+	pLine->SetLineColor(RGB(168, 168, 168));
+
+	pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE2)->m_hWnd);
+	pLine->SetBkgndColor(RGB(225, 225, 225));
+	pLine->SetLineColor(RGB(168, 168, 168));
+
+
+	return TRUE;  // return TRUE unless you set the focus to a control
+				  // 异常: OCX 属性页应返回 FALSE
+}
+
+
+HBRUSH CAlarmPopupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	if (nCtlColor == CTLCOLOR_STATIC) {
+		pDC->SetBkColor(m_crBkgnd);
+		pDC->SetTextColor(RGB(0, 0, 0));
+	}
+
+	if (m_hbrBkgnd == nullptr) {
+		m_hbrBkgnd = CreateSolidBrush(m_crBkgnd);
+	}
+
+	return m_hbrBkgnd;
+}
+
+
+void CAlarmPopupDlg::OnDestroy()
+{
+	CDialogEx::OnDestroy();
+
+	if (m_hbrBkgnd != nullptr) {
+		::DeleteObject(m_hbrBkgnd);
+	}
+
+	if (m_pActiveAlarm != nullptr) {
+		m_pActiveAlarm->release();
+		m_pActiveAlarm = nullptr;
+	}
+}
+
+
+void CAlarmPopupDlg::OnSize(UINT nType, int cx, int cy)
+{
+	CDialogEx::OnSize(nType, cx, cy);
+
+	// TODO: 在此处添加消息处理程序代码
+}
+
+void CAlarmPopupDlg::AlarmOn()
+{
+	ShowFirstAlarm();
+}
+
+void CAlarmPopupDlg::AlarmOff()
+{
+	ShowFirstAlarm();
+}
+
+void CAlarmPopupDlg::OnBnClickedButtonClose()
+{
+	// OnCancel();
+	ShowWindow(SW_HIDE);
+}
+
+void CAlarmPopupDlg::ShowFirstAlarm()
+{
+	// 取出警告信息首条并显示
+	if (m_pActiveAlarm != nullptr) {
+		m_pActiveAlarm->release();
+	}
+
+	CString strText;
+	CAlarmMonitor* pAlarmMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("警告信息");
+	m_pActiveAlarm = pAlarmMonitor->getActiveAlarm();
+	if (m_pActiveAlarm != nullptr) {
+		m_pActiveAlarm->addRef();
+		SetDlgItemText(IDC_LABEL_NAME, pAlarmMonitor->getAlarmText(m_pActiveAlarm->getId()));
+		strText.Format(_T("ID: %d"), m_pActiveAlarm->getId());
+		SetDlgItemText(IDC_LABEL_LEVEL, strText);		
+	}
+	else {
+		ShowWindow(SW_HIDE);
+	}
+}
diff --git a/SourceCode/Bond/BondEq/AlarmPopupDlg.h b/SourceCode/Bond/BondEq/AlarmPopupDlg.h
new file mode 100644
index 0000000..e9437a2
--- /dev/null
+++ b/SourceCode/Bond/BondEq/AlarmPopupDlg.h
@@ -0,0 +1,53 @@
+#pragma once
+#include "BlButton.h"
+#include "Alarm.h"
+
+
+// CAlarmPopupDlg 对话框
+
+class CAlarmPopupDlg : public CDialogEx
+{
+	DECLARE_DYNAMIC(CAlarmPopupDlg)
+
+public:
+	CAlarmPopupDlg(CWnd* pParent = NULL);   // 标准构造函数
+	virtual ~CAlarmPopupDlg();
+
+
+public:
+	void AlarmOn();
+	void AlarmOff();
+
+private:
+	void ShowFirstAlarm();
+
+private:
+	COLORREF m_crBkgnd;
+	HBRUSH m_hbrBkgnd;
+	CFont m_fontTitle;
+	CFont m_fontLevel;
+	CFont m_fontName;
+	CFont m_fontDescription;
+
+private:
+	CAlarm* m_pActiveAlarm;
+	CBlButton m_btnClose;
+	CBlButton m_btnSoundOff;
+	CBlButton m_btnAlarmOff;
+
+// 对话框数据
+#ifdef AFX_DESIGN_TIME
+	enum { IDD = IDD_DIALOG_POPUP_ALARM };
+#endif
+
+protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
+
+	DECLARE_MESSAGE_MAP()
+public:
+	virtual BOOL OnInitDialog();
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	afx_msg void OnDestroy();
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnBnClickedButtonClose();
+};
diff --git a/SourceCode/Bond/BondEq/BondEq.rc b/SourceCode/Bond/BondEq/BondEq.rc
index 22fdfef..f3596f0 100644
--- a/SourceCode/Bond/BondEq/BondEq.rc
+++ b/SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
diff --git a/SourceCode/Bond/BondEq/BondEq.vcxproj b/SourceCode/Bond/BondEq/BondEq.vcxproj
index f39bd84..73727f0 100644
--- a/SourceCode/Bond/BondEq/BondEq.vcxproj
+++ b/SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -191,6 +191,7 @@
     <Text Include="ReadMe.txt" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="AlarmPopupDlg.h" />
     <ClInclude Include="CComponentDlg.h" />
     <ClInclude Include="CComponentPLCDlg.h" />
     <ClInclude Include="CPLC.h" />
@@ -263,6 +264,7 @@
     <ClInclude Include="View\UserManagerDlg.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="AlarmPopupDlg.cpp" />
     <ClCompile Include="CComponentDlg.cpp" />
     <ClCompile Include="CComponentPLCDlg.cpp" />
     <ClCompile Include="CPLC.cpp" />
diff --git a/SourceCode/Bond/BondEq/BondEqDlg.cpp b/SourceCode/Bond/BondEq/BondEqDlg.cpp
index 3f3103b..9aa2398 100644
--- a/SourceCode/Bond/BondEq/BondEqDlg.cpp
+++ b/SourceCode/Bond/BondEq/BondEqDlg.cpp
@@ -72,6 +72,7 @@
 	m_pHomeDialog = nullptr;
 	m_pActiveView = nullptr;
 	m_pActiveComponentDlg = nullptr;
+	m_pAlarmWnd = nullptr;
 }
 
 void CBondEqDlg::DoDataExchange(CDataExchange* pDX)
@@ -151,6 +152,12 @@
 						}
 					}
 				}
+			}
+			else if (code == RX_CODE_ALARM_ON) {
+				AlarmOn();
+			}
+			else if (code == RX_CODE_ALARM_OFF) {
+				AlarmOff();
 			}
 			pAny->release();
 		}, [&]() -> void {
@@ -391,6 +398,11 @@
 
 	if (m_hbrBkgnd != nullptr) {
 		::DeleteObject(m_hbrBkgnd);
+	}
+
+	if (m_pAlarmWnd != nullptr) {
+		m_pAlarmWnd->DestroyWindow();
+		delete m_pAlarmWnd;
 	}
 
 	ASSERT(m_pObserver != NULL);
@@ -785,3 +797,23 @@
 	return pDlg;
 }
 
+void CBondEqDlg::AlarmOn()
+{
+	if (m_pAlarmWnd == nullptr) {
+		m_pAlarmWnd = new CAlarmPopupDlg();
+		m_pAlarmWnd->Create(IDD_DIALOG_POPUP_ALARM, this);
+		m_pAlarmWnd->CenterWindow();
+	}
+	m_pAlarmWnd->ShowWindow(SW_SHOW);
+	m_pAlarmWnd->AlarmOn();
+}
+
+void CBondEqDlg::AlarmOff()
+{
+	if (m_pAlarmWnd == nullptr) {
+		m_pAlarmWnd = new CAlarmPopupDlg();
+		m_pAlarmWnd->Create(IDD_DIALOG_POPUP_ALARM, this);
+		m_pAlarmWnd->CenterWindow();
+	}
+	m_pAlarmWnd->AlarmOff();
+}
diff --git a/SourceCode/Bond/BondEq/BondEqDlg.h b/SourceCode/Bond/BondEq/BondEqDlg.h
index d7827a3..19f50e1 100644
--- a/SourceCode/Bond/BondEq/BondEqDlg.h
+++ b/SourceCode/Bond/BondEq/BondEqDlg.h
@@ -10,6 +10,7 @@
 #include "CRemoteEqView.h"
 #include "TopToolbar.h"
 #include "CComponentPLCDlg.h"
+#include "AlarmPopupDlg.h"
 
 
 // CBondEqDlg 对话框
@@ -28,6 +29,8 @@
 	CBaseView* CreateRemoteEqView(BEQ::IRemoteEquipment* pEquipment);
 	CComponentPLCDlg* CreateComponentPLCDlg(CComponent* pComponent);
 	void UpdateLoginStatus();
+	void AlarmOn();
+	void AlarmOff();
 
 private:
 	COLORREF m_crBkgnd;
@@ -39,6 +42,7 @@
 	CHomeDialog* m_pHomeDialog;
 	CBaseView* m_pActiveView;
 	CComponentDlg* m_pActiveComponentDlg;
+	CAlarmPopupDlg* m_pAlarmWnd;
 
 // 对话框数据
 #ifdef AFX_DESIGN_TIME
diff --git a/SourceCode/Bond/BondEq/CBonder.cpp b/SourceCode/Bond/BondEq/CBonder.cpp
index 4ebcf7a..c4196dd 100644
--- a/SourceCode/Bond/BondEq/CBonder.cpp
+++ b/SourceCode/Bond/BondEq/CBonder.cpp
@@ -185,7 +185,7 @@
 	pPlc->addMonitor(1, 4400, 4499, MC::SOFT_COMPONENT::D, m_pPlcData);
 	pPlc->addMonitor(2, 4500, 4599, MC::SOFT_COMPONENT::D, &m_pPlcData[200]);
 	pPlc->addMonitor(3, 4700, 4791, MC::SOFT_COMPONENT::D, &m_pPlcData[400]);
-	pPlc->addMonitor(MONITOR_ID_ALARM, 1001, 1064, MC::SOFT_COMPONENT::M, &m_pPlcData[600]);
+	pPlc->addMonitor(MONITOR_ID_ALARM, 10001, 10064, MC::SOFT_COMPONENT::M, &m_pPlcData[600]);
 	
 	pPlc->setName("PLC(1)");
 	pPlc->setDescription("PLC");
@@ -429,6 +429,27 @@
 	if (iii % 5 == 0) {
 		save();
 	}
+
+
+	// 测试
+	BOOL bTest = FALSE;
+	if (bTest) {
+		static int xx = 0;
+		xx++;
+		memset(&m_pPlcData[600], 0, 260);
+		if (xx == 12) {
+			m_pPlcData[600] = 0x01;
+			for (auto c : m_components) {
+				c->onData(MONITOR_ID_ALARM, &m_pPlcData[600], 260);
+			}
+		}
+		else if (xx == 20) {
+			m_pPlcData[600] = 0x00;
+			for (auto c : m_components) {
+				c->onData(MONITOR_ID_ALARM, &m_pPlcData[600], 260);
+			}
+		}
+	}
 }
 
 void CBonder::AddComponent(CComponent* pComponent)
diff --git a/SourceCode/Bond/BondEq/CPageAlarm.cpp b/SourceCode/Bond/BondEq/CPageAlarm.cpp
index 5533d1e..0d76752 100644
--- a/SourceCode/Bond/BondEq/CPageAlarm.cpp
+++ b/SourceCode/Bond/BondEq/CPageAlarm.cpp
@@ -6,6 +6,7 @@
 #include "CPageAlarm.h"
 #include "afxdialogex.h"
 #include "Common.h"
+#include "ToolUnits.h"
 
 
 // CPageAlarm 对话框
@@ -50,8 +51,17 @@
 			// onNext
 			pAny->addRef();
 			int code = pAny->getCode();
-			if (RX_CODE_LOG == code && ::IsWindow(m_hWnd)) {
-
+			if (RX_CODE_ALARM_ON == code) {
+				CAlarm* pAlarm;
+				if (pAny->getObject("obj", (IRxObject*&)pAlarm)) {
+					AddAlarm(nullptr, pAlarm);
+				}
+			}
+			else if (RX_CODE_ALARM_OFF == code) {
+				CAlarm* pAlarm;
+				if (pAny->getObject("obj", (IRxObject*&)pAlarm)) {
+					UpdateAlarm(nullptr, pAlarm);
+				}
 			}
 
 			pAny->release();
@@ -71,6 +81,26 @@
 {
 	CDialogEx::OnInitDialog();
 	InitRxWindow();
+
+
+	// 报表控件
+	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+	DWORD dwStyle = pListCtrl->GetExtendedStyle();
+	dwStyle |= LVS_EX_FULLROWSELECT;
+	dwStyle |= LVS_EX_GRIDLINES;
+	pListCtrl->SetExtendedStyle(dwStyle);
+
+	HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
+	ListView_SetImageList(pListCtrl->GetSafeHwnd(), imageList, LVSIL_SMALL);
+	pListCtrl->InsertColumn(0, _T(""), LVCFMT_RIGHT, 0);
+	pListCtrl->InsertColumn(2, _T("警告ID"), LVCFMT_LEFT, 100);
+	pListCtrl->InsertColumn(3, _T("描述"), LVCFMT_LEFT, 580);
+	pListCtrl->InsertColumn(4, _T("发生时间"), LVCFMT_LEFT, 180);
+	pListCtrl->InsertColumn(5, _T("解除时间"), LVCFMT_LEFT, 180);
+
+
+	Resize();
+	LoadAlarms();
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 				  // 异常: OCX 属性页应返回 FALSE
@@ -92,7 +122,6 @@
 	return m_hbrBkgnd;
 }
 
-
 void CPageAlarm::OnDestroy()
 {
 	CDialogEx::OnDestroy();
@@ -107,10 +136,80 @@
 	}
 }
 
-
 void CPageAlarm::OnSize(UINT nType, int cx, int cy)
 {
 	CDialogEx::OnSize(nType, cx, cy);
+	if (GetDlgItem(IDC_LIST_ALARM) == nullptr) return;
+	Resize();
+}
 
-	// TODO: 在此处添加消息处理程序代码
+void CPageAlarm::Resize()
+{
+	CWnd* pItem;
+	CRect rcClient;
+	GetClientRect(&rcClient);
+
+	pItem = GetDlgItem(IDC_LIST_ALARM);
+	pItem->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
+}
+
+void CPageAlarm::LoadAlarms()
+{
+	CAlarmMonitor* pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("警告信息");
+
+	pMonitor->Lock();
+	std::map<int, CAlarm*>& alarmings = pMonitor->getAlarmingMap();
+	std::list< CAlarm*>& alarms = pMonitor->getAlarmRecords();
+
+	for (auto item : alarmings) {
+		AddAlarm(pMonitor, item.second);
+	}
+	for (auto item : alarms) {
+		AddAlarm(pMonitor, item);
+	}
+
+	pMonitor->Unlock();
+}
+
+void CPageAlarm::AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm)
+{
+	if (pMonitor == nullptr) {
+		pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("警告信息");
+	}
+	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+	pListCtrl->InsertItem(0, _T(""));
+	pListCtrl->SetItemData(0, (DWORD_PTR)pAlarm);
+	pAlarm->addRef();
+	pListCtrl->SetItemText(0, 1, std::to_string(pAlarm->getId()).c_str());
+	pListCtrl->SetItemText(0, 2, pMonitor->getAlarmText(pAlarm->getId()));
+	pListCtrl->SetItemText(0, 3, CToolUnits::timeToString2(pAlarm->getOnTime()).c_str());
+	if (pAlarm->getOffTime() > 0) {
+		pListCtrl->SetItemText(0, 4, CToolUnits::timeToString2(pAlarm->getOffTime()).c_str());
+	}
+}
+
+void CPageAlarm::UpdateAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm)
+{
+	if (pMonitor == nullptr) {
+		pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("警告信息");
+	}
+	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+	for (int i = 0; i < pListCtrl->GetItemCount(); i++) {
+		if (pListCtrl->GetItemData(i) == (DWORD_PTR)pAlarm) {
+			if (pAlarm->getOffTime() > 0) {
+				pListCtrl->SetItemText(i, 4, CToolUnits::timeToString2(pAlarm->getOffTime()).c_str());
+			}
+		}
+	}
+}
+
+BOOL CPageAlarm::DestroyWindow()
+{
+	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+	for (int i = 0; i < pListCtrl->GetItemCount(); i++) {
+		CAlarm* pAlarm = (CAlarm*)pListCtrl->GetItemData(i);
+		pAlarm->release();
+	}
+
+	return CDialogEx::DestroyWindow();
 }
diff --git a/SourceCode/Bond/BondEq/CPageAlarm.h b/SourceCode/Bond/BondEq/CPageAlarm.h
index 2fdbcb7..583a6b2 100644
--- a/SourceCode/Bond/BondEq/CPageAlarm.h
+++ b/SourceCode/Bond/BondEq/CPageAlarm.h
@@ -1,4 +1,5 @@
 #pragma once
+#include "AlarmMonitor.h"
 
 
 // CPageAlarm 对话框
@@ -13,6 +14,10 @@
 
 private:
 	void InitRxWindow();
+	void Resize();
+	void LoadAlarms();
+	void AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
+	void UpdateAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
 
 private:
 	COLORREF m_crBkgnd;
@@ -34,4 +39,5 @@
 	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
 	afx_msg void OnDestroy();
 	afx_msg void OnSize(UINT nType, int cx, int cy);
+	virtual BOOL DestroyWindow();
 };
diff --git a/SourceCode/Bond/BondEq/Common.h b/SourceCode/Bond/BondEq/Common.h
index d52651b..5a559d2 100644
--- a/SourceCode/Bond/BondEq/Common.h
+++ b/SourceCode/Bond/BondEq/Common.h
@@ -145,6 +145,24 @@
 #define BTN_POINT_BKGND_PRESS			RGB(0, 232, 0)
 
 
+/* 解除警告 按钮 */
+#define BTN_ALARM_OFF_FRAME_NORMAL		RGB(88, 88, 88)
+#define BTN_ALARM_OFF_FRAME_HOVER		RGB(88, 88, 88)
+#define BTN_ALARM_OFF_FRAME_PRESS		RGB(88, 88, 88)
+#define BTN_ALARM_OFF_BKGND_NORMAL		RGB(255, 127, 39)
+#define BTN_ALARM_OFF_BKGND_HOVER		RGB(255, 157, 59)
+#define BTN_ALARM_OFF_BKGND_PRESS		RGB(255, 100, 29)
+
+
+/* 静音按钮 */
+#define BTN_SOUND_OFF_FRAME_NORMAL		RGB(88, 88, 88)
+#define BTN_SOUND_OFF_FRAME_HOVER		RGB(88, 88, 88)
+#define BTN_SOUND_OFF_FRAME_PRESS		RGB(88, 88, 88)
+#define BTN_SOUND_OFF_BKGND_NORMAL		RGB(255, 127, 39)
+#define BTN_SOUND_OFF_BKGND_HOVER		RGB(255, 157, 59)
+#define BTN_SOUND_OFF_BKGND_PRESS		RGB(255, 100, 29)
+
+
 /* 按钮id */
 #define VIEW_TOOL_BTN_CLOSE				0x1016
 
diff --git a/SourceCode/Bond/BondEq/Component.h b/SourceCode/Bond/BondEq/Component.h
index 46e43c3..8b239a3 100644
--- a/SourceCode/Bond/BondEq/Component.h
+++ b/SourceCode/Bond/BondEq/Component.h
@@ -38,9 +38,11 @@
 	int WriteData(MC::SOFT_COMPONENT softComponent, unsigned int addr,
 		const char* pszData, unsigned int length, ONWRITE funOnWrite);
 
-protected:
+public:
 	inline void Lock() { EnterCriticalSection(&m_criticalSection); }
 	inline void Unlock() { LeaveCriticalSection(&m_criticalSection); }
+
+protected:
 	void SendBroadcast(CIntent* pIntent);
 
 protected:
diff --git a/SourceCode/Bond/BondEq/HorizontalLine.cpp b/SourceCode/Bond/BondEq/HorizontalLine.cpp
index e306993..fc48b76 100644
--- a/SourceCode/Bond/BondEq/HorizontalLine.cpp
+++ b/SourceCode/Bond/BondEq/HorizontalLine.cpp
@@ -201,3 +201,9 @@
 	m_crBkgnd = cr;
 }
 
+void CHorizontalLine::SetLineColor(COLORREF cr)
+{
+	m_crLineColor = cr;
+}
+
+
diff --git a/SourceCode/Bond/BondEq/HorizontalLine.h b/SourceCode/Bond/BondEq/HorizontalLine.h
index 14d4b62..f5b3647 100644
--- a/SourceCode/Bond/BondEq/HorizontalLine.h
+++ b/SourceCode/Bond/BondEq/HorizontalLine.h
@@ -71,6 +71,7 @@
 	void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0);
 	void Release();
 	void SetBkgndColor(COLORREF cr);
+	void SetLineColor(COLORREF cr);
 	static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 	static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
 	LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);
diff --git a/SourceCode/Bond/BondEq/InputDialog.cpp b/SourceCode/Bond/BondEq/InputDialog.cpp
index 86252f9..ac0301d 100644
--- a/SourceCode/Bond/BondEq/InputDialog.cpp
+++ b/SourceCode/Bond/BondEq/InputDialog.cpp
@@ -50,6 +50,7 @@
     SetWindowText(m_strTitle);
     m_staticPrompt.SetWindowText(m_strPrompt);
 	m_editInput.SetFocus();
+	m_editInput.SetWindowText("1");
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
diff --git a/SourceCode/Bond/BondEq/Resource.h b/SourceCode/Bond/BondEq/Resource.h
index d27a070..0e92991 100644
--- a/SourceCode/Bond/BondEq/Resource.h
+++ b/SourceCode/Bond/BondEq/Resource.h
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico b/SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico
new file mode 100644
index 0000000..1f40dee
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico b/SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico
new file mode 100644
index 0000000..bd6014d
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico b/SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico
new file mode 100644
index 0000000..8584f70
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico b/SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico
new file mode 100644
index 0000000..3fa0d49
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico b/SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico
new file mode 100644
index 0000000..d22fa68
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico b/SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico
new file mode 100644
index 0000000..163976d
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico
Binary files differ

--
Gitblit v1.9.3