LAPTOP-SNT8I5JK\Boounion
2024-12-12 02fb493f0903013e5258c2ff5e2cb27de873378a
1.警告性息弹窗;
2.警告性息列表;
已添加8个文件
已修改15个文件
524 ■■■■■ 文件已修改
SourceCode/Bond/BondEq/AlarmMonitor.cpp 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/AlarmMonitor.h 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/AlarmPopupDlg.cpp 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/AlarmPopupDlg.h 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEqDlg.cpp 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEqDlg.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CBonder.cpp 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CPageAlarm.cpp 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CPageAlarm.h 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/Common.h 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/Component.h 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/HorizontalLine.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/HorizontalLine.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/InputDialog.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/Resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico 补丁 | 查看 | 原始文档 | blame | 历史
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++) {
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);
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);
    }
}
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();
};
SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
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" />
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();
}
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
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)
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();
}
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();
};
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
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:
SourceCode/Bond/BondEq/HorizontalLine.cpp
@@ -201,3 +201,9 @@
    m_crBkgnd = cr;
}
void CHorizontalLine::SetLineColor(COLORREF cr)
{
    m_crLineColor = cr;
}
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);
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
SourceCode/Bond/BondEq/Resource.h
Binary files differ
SourceCode/Bond/x64/Debug/Res/Alarm_o_24.ico
SourceCode/Bond/x64/Debug/Res/Alarm_o_64.ico
SourceCode/Bond/x64/Debug/Res/Alarm_red_128.ico
SourceCode/Bond/x64/Debug/Res/Alarm_white_128.ico
SourceCode/Bond/x64/Debug/Res/Alarm_white_24.ico
SourceCode/Bond/x64/Debug/Res/close_blcak_24.ico