// AlarmPopupDlg.cpp : ʵÏÖÎļþ // #include "stdafx.h" #include "BoounionPLC.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_pPLC = nullptr; m_crBkgnd = RGB(225, 225, 225); m_hbrBkgnd = nullptr; m_pActiveAlarm = nullptr; m_pObserver = nullptr; } CAlarmPopupDlg::~CAlarmPopupDlg() { } void CAlarmPopupDlg::SetPLC(CPLC* pPLC) { ASSERT(pPLC); m_pPLC = pPLC; } 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) ON_BN_CLICKED(IDC_BUTTON_SOUND_OFF, &CAlarmPopupDlg::OnBnClickedButtonSoundOff) ON_BN_CLICKED(IDC_BUTTON_ALARM_OFF, &CAlarmPopupDlg::OnBnClickedButtonAlarmOff) END_MESSAGE_MAP() // CAlarmPopupDlg ÏûÏ¢´¦Àí³ÌÐò void CAlarmPopupDlg::InitRxWindows() { /* code */ // ¶©ÔÄÊý¾Ý IRxWindows* pRxWindows = RX_GetRxWindows(); pRxWindows->enableLog(5); if (m_pObserver == NULL) { m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void { // onNext pAny->addRef(); int code = pAny->getCode(); if (RX_CODE_BONDER_BEEP == code) { bool bMute = FALSE;// theApp.m_model.getBonder().isMute(); SetButtonBackgroundColors(bMute); } pAny->release(); }, [&]() -> void { // onComplete }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } 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); // ¾²Òô°´Å¥ bool bMute = FALSE;// theApp.m_model.getBonder().isMute(); 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(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)); InitRxWindows(); 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; } if (m_pObserver != nullptr) { m_pObserver->unsubscribe(); m_pObserver = NULL; } } 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 = m_pPLC->getAlarmMonitor(); 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); ShowWindow(SW_SHOW); } else { ShowWindow(SW_HIDE); } } 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(); } } void CAlarmPopupDlg::OnBnClickedButtonSoundOff() { // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë if (m_pPLC == nullptr || !m_pPLC->isConnected()) { return; } // Ïò PLC дÈëÐźŠbool bMute = m_pPLC->isMute(); char szWrite[4] = { 0x1, 0x0, 0x0, 0x0 }; szWrite[0] = !bMute; m_pPLC->writeData(MC::M, 1003, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) { if (nFlag == 0) { TRACE("²Ù×÷³É¹¦£ºµØÖ·=1003\n", nAddr); } else { TRACE("²Ù×÷ʧ°Ü£ºµØÖ·=1003£¬´íÎóÂë=%d\n", nFlag); } }); } void CAlarmPopupDlg::OnBnClickedButtonAlarmOff() { // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë if (m_pPLC == nullptr || !m_pPLC->isConnected()) { return; } // Ïò PLC дÈëÐźŠchar szWrite[4] = { 0x1, 0x0, 0x0, 0x0 }; m_pPLC->writeData(MC::M, 1009, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) { if (nFlag == 0) { TRACE("²Ù×÷³É¹¦£ºµØÖ·=1009\n", nAddr); } else { TRACE("²Ù×÷ʧ°Ü£ºµØÖ·=1009£¬´íÎóÂë=%d\n", nFlag); } }); Sleep(500); szWrite[0] = 0x0; m_pPLC->writeData(MC::M, 1009, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) { if (nFlag == 0) { TRACE("²Ù×÷³É¹¦£ºµØÖ·=1009\n", nAddr); } else { TRACE("²Ù×÷ʧ°Ü£ºµØÖ·=1009£¬´íÎóÂë=%d\n", nFlag); } }); }