LAPTOP-SNT8I5JK\Boounion
2025-09-17 4ef35bf238fc6f7217e4b6de4aee37192ec503ec
SourceCode/Bond/Servo/CPageLinkSignal.cpp
@@ -19,6 +19,7 @@
CPageLinkSignal::CPageLinkSignal(CWnd* pParent /*=nullptr*/)
   : CHMPropertyPage(IDD_PAGE_LINK_SIGNAL, pParent)
   , m_bEnable(TRUE)
{
   m_pEquipment = nullptr;
}
@@ -30,6 +31,7 @@
void CPageLinkSignal::DoDataExchange(CDataExchange* pDX)
{
   CHMPropertyPage::DoDataExchange(pDX);
   DDX_Check(pDX, IDC_CHECK_ENABLE, m_bEnable);
}
@@ -38,6 +40,7 @@
   ON_WM_DESTROY()
   ON_WM_SIZE()
   ON_WM_TIMER()
   ON_BN_CLICKED(IDC_CHECK_ENABLE, &CPageLinkSignal::OnClickedCheckEnable)
END_MESSAGE_MAP()
@@ -56,6 +59,12 @@
   KillTimer(TIMER_ID_SIGNAL_UPDATE);
   SetTimer(TIMER_ID_SIGNAL_UPDATE, TIMER_INTERVAL_MS, nullptr);
   if (m_pEquipment) {
      m_bEnable = m_pEquipment->IsEnabled();
      UpdateData(FALSE);
   }
   return TRUE;  // return TRUE unless you set the focus to a control
              // 异常: OCX 属性页应返回 FALSE
@@ -80,10 +89,20 @@
   // 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;
         if (m_pBtnUpstream[i][j] != nullptr) {
            m_pBtnUpstream[i][j]->DestroyWindow();
            delete m_pBtnUpstream[i][j];
            m_pBtnUpstream[i][j] = nullptr;
         }
      }
   }
   for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 4; j++) {
         if (m_pBtnDwonstream[i][j] != nullptr) {
            m_pBtnDwonstream[i][j]->DestroyWindow();
            delete m_pBtnDwonstream[i][j];
            m_pBtnDwonstream[i][j] = nullptr;
         }
      }
   }
@@ -110,11 +129,28 @@
      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));
         m_pBtnUpstream[row][col] = new CBlButton();
         m_pBtnUpstream[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000);
         m_pBtnUpstream[row][col]->SetFaceColor(FACECOLOR_OFF);
         m_pBtnUpstream[row][col]->SetFrameColor(RGB(28, 28, 28));
         m_pBtnUpstream[row][col]->SetTextColor(RGB(238, 238, 238));
      }
   }
   CRect rcLine;
   GetDlgItem(IDC_LINE1)->GetWindowRect(&rcLine);
   GetDlgItem(IDC_LINE1)->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * 8 - marginx / 2, BTN_Y,
      rcLine.Width(), (BTN_WIDTH + marginy) * 7 + BTN_WIDTH);
   for (int row = 0; row < 8; row++) {
      y = BTN_Y + (BTN_WIDTH + marginy) * row;
      for (int col = 0; col < 4; col++) {
         x = BTN_X + (BTN_WIDTH + marginx) * (col + 8);
         m_pBtnDwonstream[row][col] = new CBlButton();
         m_pBtnDwonstream[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000);
         m_pBtnDwonstream[row][col]->SetFaceColor(FACECOLOR_OFF);
         m_pBtnDwonstream[row][col]->SetFrameColor(RGB(28, 28, 28));
         m_pBtnDwonstream[row][col]->SetTextColor(RGB(238, 238, 238));
      }
   }
@@ -131,13 +167,22 @@
   }
   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++) {
      IDC_LABEL_NAME6, IDC_LABEL_NAME7, IDC_LABEL_NAME8, IDC_LABEL_NAME9, IDC_LABEL_NAME10,
      IDC_LABEL_NAME11, IDC_LABEL_NAME12};
   for (int i = 0; i < sizeof(idy) / sizeof(int); i++) {
      pItem = GetDlgItem(idy[i]);
      pItem->GetWindowRect(&rcItem);
      pItem->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * i,
         BTN_Y - 36,
         rcItem.Width(), rcItem.Height());
   }
   pItem = GetDlgItem(IDC_CHECK_ENABLE);
   if (pItem) {
      int nCheckboxX = max(0, BTN_X - 50);
      int nCheckboxY = max(0, BTN_Y - rcItem.Height() - 30);
      pItem->GetWindowRect(&rcItem);
      pItem->MoveWindow(nCheckboxX, nCheckboxY, rcItem.Width(), rcItem.Height());
   }
}
@@ -145,36 +190,67 @@
{
   if (nIDEvent == TIMER_ID_SIGNAL_UPDATE) {
      if (m_pEquipment) {
         UpdateAllSignalStatesFromDevice();
         UpdateAllUpstreamSignalStatesFromDevice();
         UpdateAllDownstreamSignalStatesFromDevice();
      }
   }
   CHMPropertyPage::OnTimer(nIDEvent);
}
void CPageLinkSignal::UpdateAllSignalStatesFromDevice()
void CPageLinkSignal::UpdateAllUpstreamSignalStatesFromDevice()
{
   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);
         BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol) && m_pEquipment->IsEnabled();
         UpdateUpstreamSignalState(nRow, nCol, bCurrentState);
      }
   }
}
void CPageLinkSignal::UpdateSignalState(int nRow, int nCol, bool bNewState)
void CPageLinkSignal::UpdateAllDownstreamSignalStatesFromDevice()
{
   if (!::IsWindow(m_pBtn[nRow][nCol]->GetSafeHwnd())) {
      return;
   }
   ASSERT(m_pEquipment);
   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);
   for (int nRow = 0; nRow < 8; ++nRow) {
      for (int nCol = 0; nCol < 4; ++nCol) {
         BOOL bCurrentState = m_pEquipment->isLinkSignalDownstreamOn(nRow, nCol) && m_pEquipment->IsEnabled();
         UpdateDownstreamSignalState(nRow, nCol, bCurrentState);
      }
   }
}
void CPageLinkSignal::UpdateUpstreamSignalState(int nRow, int nCol, bool bNewState)
{
   if (!::IsWindow(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd())) {
      return;
   }
   bool bState = ::GetProp(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1;
   if (bState != bNewState) {
      m_pBtnUpstream[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF);
      ::SetProp(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0);
   }
}
void CPageLinkSignal::UpdateDownstreamSignalState(int nRow, int nCol, bool bNewState)
{
   if (!::IsWindow(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd())) {
      return;
   }
   bool bState = ::GetProp(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1;
   if (bState != bNewState) {
      m_pBtnDwonstream[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF);
      ::SetProp(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0);
   }
}
void CPageLinkSignal::OnClickedCheckEnable()
{
   // TODO: 在此添加控件通知处理程序代码
   UpdateData(TRUE);
   m_pEquipment->SetEnable(m_bEnable);
}