// CEquipmentPage1.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CEquipmentPage1.h" #include "afxdialogex.h" // CEquipmentPage1 对话框 #define SIGNAL_GRID_ROWS 8 #define SIGNAL_GRID_COLS 8 #define SIGNAL_GRID_SIZE (SIGNAL_GRID_ROWS * SIGNAL_GRID_COLS) IMPLEMENT_DYNAMIC(CEquipmentPage1, CHMPropertyPage) CEquipmentPage1::CEquipmentPage1(CWnd* pParent /*=nullptr*/) : CHMPropertyPage(IDD_PAGE_EQUIPMENT1, pParent) { m_pEquipment = nullptr; } CEquipmentPage1::~CEquipmentPage1() { } void CEquipmentPage1::DoDataExchange(CDataExchange* pDX) { CHMPropertyPage::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CEquipmentPage1, CHMPropertyPage) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() END_MESSAGE_MAP() // CEquipmentPage1 消息处理程序 void CEquipmentPage1::OnApply() { __super::OnApply(); } void CEquipmentPage1::setEquipment(SERVO::CEquipment* pEquipment) { m_pEquipment = pEquipment; } void CEquipmentPage1::InitSignalList() { m_vSignalList.clear(); // 写入设备的信号名称,默认状态为 false,默认都可点击(输出) m_vSignalList.push_back({ _T("Upstream\r\nInline"), false, true }); m_vSignalList.push_back({ _T("Upstream\r\nTrouble"), false, true }); m_vSignalList.push_back({ _T("Interlock"), false, false }); m_vSignalList.push_back({ _T("Send\r\nAble"), false, true }); m_vSignalList.push_back({ _T("Receive\r\nStart"), false, false }); m_vSignalList.push_back({ _T("Job\r\nTransfer"), false, false }); m_vSignalList.push_back({ _T("Receive\r\nComplete"), false, false }); m_vSignalList.push_back({ _T("Shutter\r\nState"), false, false }); // TODO: 添加更多信号,最多 64 个 // 补齐至 SIGNAL_GRID_SIZE 项 while (m_vSignalList.size() < SIGNAL_GRID_SIZE) { m_vSignalList.push_back({ _T(""), false, false }); } } void CEquipmentPage1::LoadDeviceSignals() { m_ctrlSignalPanel.SetGridSize(SIGNAL_GRID_ROWS, SIGNAL_GRID_COLS); for (int i = 0; i < SIGNAL_GRID_SIZE; ++i) { int row = i / SIGNAL_GRID_COLS; int col = i % SIGNAL_GRID_COLS; const auto& signal = m_vSignalList[i]; // 显示状态(用颜色表示 ON/OFF) m_ctrlSignalPanel.SetSlotText(row, col, signal.strName); m_ctrlSignalPanel.SetSlotStatus(row, col, signal.bCurrentState); m_ctrlSignalPanel.SetSlotClickable(row, col, signal.bClickable); m_ctrlSignalPanel.SetTextFont(_T("Microsoft YaHei"), 10); } m_ctrlSignalPanel.SetSlotClickCallback([this](int nRow, int nCol) { int index = nRow * SIGNAL_GRID_COLS + nCol; if (index >= 0 && index < (int)m_vSignalList.size() && m_vSignalList[index].bClickable) { CString strMsg; strMsg.Format(_T("点击信号:%s"), m_vSignalList[index].strName); AfxMessageBox(strMsg); } }); } BOOL CEquipmentPage1::OnInitDialog() { CHMPropertyPage::OnInitDialog(); // TODO: 在此添加额外的初始化 m_ctrlSignalPanel.Create(AfxRegisterWndClass(0), _T("SignalGrid"), WS_CHILD | WS_VISIBLE, CRect(0, 0, 100, 100), this, 1002); m_ctrlSignalPanel.SetColors(RGB(0, 200, 0), RGB(220, 220, 220)); InitSignalList(); LoadDeviceSignals(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CEquipmentPage1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; } void CEquipmentPage1::OnDestroy() { CHMPropertyPage::OnDestroy(); // TODO: 在此处添加消息处理程序代码 } void CEquipmentPage1::OnSize(UINT nType, int cx, int cy) { CHMPropertyPage::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 if (::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) { CRect rc; GetClientRect(&rc); rc.DeflateRect(10, 10); m_ctrlSignalPanel.MoveWindow(rc); } }