mrDarker
2025-06-06 4597db5a8e60149028e87d57692d61b97c456350
SourceCode/Bond/Servo/CEquipmentPage1.cpp
@@ -9,6 +9,10 @@
// 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*/)
@@ -45,11 +49,64 @@
   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
@@ -77,4 +134,10 @@
   CHMPropertyPage::OnSize(nType, cx, cy);
   // TODO: 在此处添加消息处理程序代码
   if (::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) {
      CRect rc;
      GetClientRect(&rc);
      rc.DeflateRect(10, 10);
      m_ctrlSignalPanel.MoveWindow(rc);
   }
}