#include "stdafx.h" #include "Servo.h" #include "AlarmPopupDlg.h" #include "afxdialogex.h" #include "Log.h" #include "Common.h" #include "HorizontalLine.h" IMPLEMENT_DYNAMIC(CAlarmPopupDlg, CDialogEx) CAlarmPopupDlg::CAlarmPopupDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_DIALOG_POPUP_ALARM, pParent) , m_hasActive(false) { memset(&m_activeAlarm, 0, sizeof(m_activeAlarm)); m_crBkgnd = RGB(112, 146, 190); m_hbrBkgnd = nullptr; } CAlarmPopupDlg::~CAlarmPopupDlg() { } void CAlarmPopupDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAlarmPopupDlg, CDialogEx) ON_BN_CLICKED(IDC_POPUP_BTN_CLOSE, &CAlarmPopupDlg::OnBnClickedClose) ON_BN_CLICKED(IDC_BUTTON_ALARM_OFF, &CAlarmPopupDlg::OnBnClickedAlarmOff) ON_WM_CTLCOLOR() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CAlarmPopupDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 背景刷 if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); // 字体 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); GetDlgItem(IDC_LABEL_NO_ALARM)->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_POPUP_BTN_CLOSE, this); m_btnClose.SetIcon(hIcon, hIcon, 24); m_btnClose.SetFaceColor(m_crBkgnd); m_btnClose.SetBkgndColor(BS_NORMAL, BTN_ALARM_OFF_BKGND_NORMAL); m_btnClose.SetBkgndColor(BS_HOVER, BTN_ALARM_OFF_BKGND_NORMAL); m_btnClose.SetBkgndColor(BS_PRESS, BTN_ALARM_OFF_BKGND_PRESS); m_btnClose.SetFrameColor(m_crBkgnd); // 解除警告按钮 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); // 静音按钮 bool bMute = false; 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); SetButtonBackgroundColors(bMute); // 横线1 CHorizontalLine* pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE1)->m_hWnd); pLine->SetBkgndColor(m_crBkgnd); pLine->SetLineColor(RGB(168, 168, 168)); pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE2)->m_hWnd); pLine->SetBkgndColor(m_crBkgnd); pLine->SetLineColor(RGB(168, 168, 168)); RefreshContent(); return TRUE; } void CAlarmPopupDlg::ShowNoAlarmControls(bool bShow) { const int ids[] = { IDC_LABEL_NO_ALARM }; for (int id : ids) { if (auto* p = GetDlgItem(id)) { p->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } } } void CAlarmPopupDlg::ShowAlarmControls(bool bShow) { const int ids[] = { 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, IDC_LINE2, IDC_LABEL_DESCRIPTION }; for (int id : ids) { if (auto* p = GetDlgItem(id)) { p->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } } } void CAlarmPopupDlg::RefreshContent() { auto actives = AlarmManager::getInstance().getActiveAlarms(); if (!actives.empty()) { m_activeAlarm = actives.front(); 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); ShowAlarmControls(true); ShowNoAlarmControls(false); ShowWindow(SW_SHOW); } else { m_hasActive = false; SetDlgItemText(IDC_LABEL_NO_ALARM, _T("当前无报警")); SetDlgItemText(IDC_LABEL_NAME, _T("")); SetDlgItemText(IDC_LABEL_LEVEL, _T("")); SetDlgItemText(IDC_LABEL_DESCRIPTION, _T("")); ShowAlarmControls(false); ShowNoAlarmControls(true); } } void CAlarmPopupDlg::OnBnClickedClose() { ShowWindow(SW_HIDE); } void CAlarmPopupDlg::OnBnClickedAlarmOff() { if (!m_hasActive) return; AlarmManager& alarmManager = AlarmManager::getInstance(); alarmManager.clearAlarmByAttributes( m_activeAlarm.nId, m_activeAlarm.nDeviceId, m_activeAlarm.nUnitId, CToolUnits::getCurrentTimeString()); RefreshContent(); } 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(30, 30, 30)); hbr = m_hbrBkgnd; } else if (nCtlColor == CTLCOLOR_DLG) { hbr = m_hbrBkgnd; } return hbr; } void CAlarmPopupDlg::OnDestroy() { CDialogEx::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); m_hbrBkgnd = nullptr; } } void CAlarmPopupDlg::SetButtonBackgroundColors(bool bMute) { if (!bMute) { 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); m_btnSoundOff.Invalidate(); } else { m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_ON_BKGND_NORMAL); m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_ON_BKGND_HOVER); m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_ON_BKGND_PRESS); m_btnSoundOff.Invalidate(); } }