From 4597db5a8e60149028e87d57692d61b97c456350 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 06 六月 2025 14:22:24 +0800
Subject: [PATCH] 1. 添加Link Signal显示 2. 优化CJobSlotGrid::DrawGrid,支持文本换行

---
 SourceCode/Bond/Servo/CEquipmentPage1.cpp |   63 +++++++++++++++++++++
 SourceCode/Bond/Servo/CEquipmentPage1.h   |   13 ++++
 SourceCode/Bond/Servo/JobSlotGrid.cpp     |   59 +++++++++++++------
 3 files changed, 117 insertions(+), 18 deletions(-)

diff --git a/SourceCode/Bond/Servo/CEquipmentPage1.cpp b/SourceCode/Bond/Servo/CEquipmentPage1.cpp
index 30aa397..2012b34 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage1.cpp
+++ b/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);
+	}
 }
diff --git a/SourceCode/Bond/Servo/CEquipmentPage1.h b/SourceCode/Bond/Servo/CEquipmentPage1.h
index 91e4f90..34106f1 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage1.h
+++ b/SourceCode/Bond/Servo/CEquipmentPage1.h
@@ -1,9 +1,17 @@
 锘�#pragma once
 #include "CHMPropertyPage.h"
 #include "CEquipment.h"
+#include "JobSlotGrid.h"
 
 
 // CEquipmentPage1 瀵硅瘽妗�
+
+struct SignalInfo
+{
+	CString strName;       // 淇″彿鍚嶇О
+	bool bCurrentState;    // 褰撳墠鐘舵�侊紙ON/OFF锛�
+	bool bClickable;       // 鏄惁鍏佽鐐瑰嚮
+};
 
 class CEquipmentPage1 : public CHMPropertyPage
 {
@@ -17,6 +25,11 @@
 
 private:
 	SERVO::CEquipment* m_pEquipment;
+	std::vector<SignalInfo> m_vSignalList;
+	CJobSlotGrid m_ctrlSignalPanel;
+
+	void InitSignalList();
+	void LoadDeviceSignals();
 
 
 // 瀵硅瘽妗嗘暟鎹�
diff --git a/SourceCode/Bond/Servo/JobSlotGrid.cpp b/SourceCode/Bond/Servo/JobSlotGrid.cpp
index 12a4c2f..46551e6 100644
--- a/SourceCode/Bond/Servo/JobSlotGrid.cpp
+++ b/SourceCode/Bond/Servo/JobSlotGrid.cpp
@@ -229,9 +229,22 @@
     CRect rect;
     GetClientRect(&rect);
 
+    if (m_nCols == 0 || m_nRows == 0) {
+        return;
+    }
+
+    // 璁$畻鏍煎瓙灏哄
     int nCellWidth = rect.Width() / m_nCols;
     int nCellHeight = rect.Height() / m_nRows;
+
+    // 瀛椾綋璁剧疆
     CFont* pOldFont = pDC->SelectObject(&m_fontText);
+    pDC->SetBkMode(TRANSPARENT);
+    pDC->SetTextColor(RGB(0, 0, 0));
+
+    // 瀹氫箟棰滆壊甯搁噺
+    constexpr COLORREF COLOR_HOVER = RGB(200, 230, 255);
+    constexpr COLORREF COLOR_CLICK = RGB(0, 120, 215);
 
     for (int i = 0; i < m_nRows; ++i) {
         for (int j = 0; j < m_nCols; ++j) {
@@ -241,29 +254,39 @@
             bool bIsHover = (m_ptHover.x == j && m_ptHover.y == i);
             bool bIsClicking = bIsHover && m_bLButtonDown;
 
-            // 閫夋嫨棰滆壊
-            COLORREF fillColor;
-            if (bIsClicking) {
-                fillColor = RGB(0, 120, 215);   // 榧犳爣鎸変笅鑹�
-            }
-            else if (bIsHover) {
-                fillColor = RGB(200, 230, 255); // 鎮仠楂樹寒
-            }
-            else {
-                fillColor = m_vSlotStatus[i][j] ? m_colorHasJob : m_colorNoJob;
+            // 閫夋嫨濉厖棰滆壊
+            COLORREF fillColor = m_vSlotStatus[i][j] ? m_colorHasJob : m_colorNoJob;
+            if (IsSlotClickable(i, j)) {
+                if (bIsClicking)
+                    fillColor = COLOR_CLICK;
+                else if (bIsHover)
+                    fillColor = COLOR_HOVER;
             }
 
-            // 鐢昏儗鏅�
-            CBrush brush(fillColor);
-            pDC->FillRect(&cellRect, &brush);
+            // 缁樺埗鑳屾櫙锛堥珮鏁堟浛浠� CBrush锛�
+            pDC->FillSolidRect(&cellRect, fillColor);
 
-            // 杈规
+            // 缁樺埗杈规
             pDC->DrawEdge(&cellRect, EDGE_SUNKEN, BF_RECT);
 
-            // 鏂囨湰
-            pDC->SetBkMode(TRANSPARENT);
-            pDC->SetTextColor(RGB(0, 0, 0));
-            pDC->DrawText(m_vSlotText[i][j], &cellRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+            // 鑾峰彇鏂囧瓧锛堝畨鍏級
+            CString strText;
+            if (i < m_vSlotText.size() && j < m_vSlotText[i].size()) {
+                strText = m_vSlotText[i][j];
+            }
+
+            if (!strText.IsEmpty()) {
+                // 鍏堣绠楁枃瀛楅珮搴︼紙鏀寔鎹㈣锛�
+                CRect calcRect = cellRect;
+                pDC->DrawText(strText, &calcRect, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_CALCRECT);
+
+                // 閲嶆柊璁惧畾灞呬腑缁樺埗鍖哄煙
+                CRect textRect = cellRect;
+                textRect.top += (cellRect.Height() - calcRect.Height()) / 2;
+
+                // 瀹為檯缁樺埗鏂囧瓧
+                pDC->DrawText(strText, &textRect, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX);
+            }
         }
     }
 

--
Gitblit v1.9.3