// CPageLinkSignal.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CPageLinkSignal.h" #include "afxdialogex.h" #define FACECOLOR_ON RGB(34, 177, 76) #define FACECOLOR_OFF RGB(195, 195, 195) #define TIMER_ID_SIGNAL_UPDATE 1001 #define TIMER_INTERVAL_MS 1000 // 每 1 秒更新一次 // CPageLinkSignal 对话框 IMPLEMENT_DYNAMIC(CPageLinkSignal, CHMPropertyPage) CPageLinkSignal::CPageLinkSignal(CWnd* pParent /*=nullptr*/) : CHMPropertyPage(IDD_PAGE_LINK_SIGNAL, pParent) { m_pEquipment = nullptr; } CPageLinkSignal::~CPageLinkSignal() { } void CPageLinkSignal::DoDataExchange(CDataExchange* pDX) { CHMPropertyPage::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CPageLinkSignal, CHMPropertyPage) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_TIMER() END_MESSAGE_MAP() // CPageLinkSignal 消息处理程序 void CPageLinkSignal::setEquipment(SERVO::CEquipment* pEquipment) { m_pEquipment = pEquipment; } BOOL CPageLinkSignal::OnInitDialog() { CHMPropertyPage::OnInitDialog(); CreateSignalButtons(); KillTimer(TIMER_ID_SIGNAL_UPDATE); SetTimer(TIMER_ID_SIGNAL_UPDATE, TIMER_INTERVAL_MS, nullptr); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CPageLinkSignal::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; } void CPageLinkSignal::OnDestroy() { CHMPropertyPage::OnDestroy(); // TODO: 在此处添加消息处理程序代码 for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (m_pBtn[i][j] != nullptr) { m_pBtn[i][j]->DestroyWindow(); delete m_pBtn[i][j]; m_pBtn[i][j] = nullptr; } } } } void CPageLinkSignal::OnSize(UINT nType, int cx, int cy) { CHMPropertyPage::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 } #define BTN_X 98 #define BTN_Y 80 #define BTN_WIDTH 36 void CPageLinkSignal::CreateSignalButtons() { int x = 100; int y = 100; int marginx = 32; int marginy = 12; for (int row = 0; row < 8; row++) { y = BTN_Y + (BTN_WIDTH + marginy) * row; for (int col = 0; col < 8; col++) { x = BTN_X + (BTN_WIDTH + marginx) * col; m_pBtn[row][col] = new CBlButton(); m_pBtn[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000); m_pBtn[row][col]->SetFaceColor(FACECOLOR_OFF); m_pBtn[row][col]->SetFrameColor(RGB(28, 28, 28)); m_pBtn[row][col]->SetTextColor(RGB(238, 238, 238)); } } CWnd* pItem; CRect rcItem; int idx[] = { IDC_LABEL_PATH1, IDC_LABEL_PATH2, IDC_LABEL_PATH3, IDC_LABEL_PATH4, IDC_LABEL_PATH5, IDC_LABEL_PATH6, IDC_LABEL_PATH7, IDC_LABEL_PATH8}; for (int i = 0; i < 8; i++) { pItem = GetDlgItem(idx[i]); pItem->GetWindowRect(&rcItem); pItem->MoveWindow(BTN_X - rcItem.Width() - 18, BTN_Y + (36 - rcItem.Height()) / 2 + (BTN_WIDTH + marginy) * i, rcItem.Width(), rcItem.Height()); } int idy[] = { IDC_LABEL_NAME1, IDC_LABEL_NAME2, IDC_LABEL_NAME3, IDC_LABEL_NAME4, IDC_LABEL_NAME5, IDC_LABEL_NAME6, IDC_LABEL_NAME7, IDC_LABEL_NAME8 }; for (int i = 0; i < 8; i++) { pItem = GetDlgItem(idy[i]); pItem->GetWindowRect(&rcItem); pItem->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * i, BTN_Y - 36, rcItem.Width(), rcItem.Height()); } } void CPageLinkSignal::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == TIMER_ID_SIGNAL_UPDATE) { if (m_pEquipment) { UpdateAllSignalStatesFromDevice(); } } CHMPropertyPage::OnTimer(nIDEvent); } void CPageLinkSignal::UpdateAllSignalStatesFromDevice() { ASSERT(m_pEquipment); for (int nRow = 0; nRow < 8; ++nRow) { for (int nCol = 0; nCol < 8; ++nCol) { BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol); UpdateSignalState(nRow, nCol, bCurrentState); } } } void CPageLinkSignal::UpdateSignalState(int nRow, int nCol, bool bNewState) { if (!::IsWindow(m_pBtn[nRow][nCol]->GetSafeHwnd())) { return; } bool bState = ::GetProp(m_pBtn[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1; if (bState != bNewState) { m_pBtn[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF); ::SetProp(m_pBtn[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0); } }