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/JobSlotGrid.cpp | 142 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 133 insertions(+), 9 deletions(-)
diff --git a/SourceCode/Bond/Servo/JobSlotGrid.cpp b/SourceCode/Bond/Servo/JobSlotGrid.cpp
index cf7df72..46551e6 100644
--- a/SourceCode/Bond/Servo/JobSlotGrid.cpp
+++ b/SourceCode/Bond/Servo/JobSlotGrid.cpp
@@ -10,6 +10,10 @@
BEGIN_MESSAGE_MAP(CJobSlotGrid, CWnd)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
+ ON_WM_MOUSEMOVE()
+ ON_WM_MOUSELEAVE()
+ ON_WM_LBUTTONDOWN()
+ ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
CJobSlotGrid::CJobSlotGrid() {
@@ -48,6 +52,7 @@
m_nRows = nRows;
m_nCols = nCols;
m_vSlotStatus.assign(nRows, std::vector<bool>(nCols, false));
+ m_vSlotClickable.assign(nRows, std::vector<bool>(nCols, false));
// 鍒濆鍖栨枃鏈暟缁�
m_vSlotText.assign(nRows, std::vector<CString>(nCols));
@@ -130,8 +135,88 @@
Invalidate();
}
+void CJobSlotGrid::SetSlotClickable(int nRow, int nCol, bool bClickable)
+{
+ if (nRow >= 0 && nRow < m_nRows && nCol >= 0 && nCol < m_nCols) {
+ m_vSlotClickable[nRow][nCol] = bClickable;
+ }
+}
+
+bool CJobSlotGrid::IsSlotClickable(int nRow, int nCol) const
+{
+ if (nRow >= 0 && nRow < m_nRows && nCol >= 0 && nCol < m_nCols) {
+ return m_vSlotClickable[nRow][nCol];
+ }
+ return false;
+}
+
+void CJobSlotGrid::SetSlotClickCallback(SlotClickCallback fnCallback)
+{
+ m_fnSlotClickCallback = fnCallback;
+}
+
BOOL CJobSlotGrid::OnEraseBkgnd(CDC* pDC) {
return TRUE;
+}
+
+void CJobSlotGrid::OnMouseMove(UINT nFlags, CPoint point)
+{
+ TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd };
+ ::TrackMouseEvent(&tme);
+
+ CRect rect;
+ GetClientRect(&rect);
+ int nCellWidth = rect.Width() / m_nCols;
+ int nCellHeight = rect.Height() / m_nRows;
+
+ int nCol = point.x / nCellWidth;
+ int nRow = point.y / nCellHeight;
+
+ if (nRow != m_ptHover.y || nCol != m_ptHover.x) {
+ m_ptHover = CPoint(nCol, nRow);
+ Invalidate();
+ }
+
+ CWnd::OnMouseMove(nFlags, point);
+}
+
+void CJobSlotGrid::OnMouseLeave()
+{
+ m_ptHover = CPoint(-1, -1);
+ Invalidate();
+
+ CWnd::OnMouseLeave();
+}
+
+void CJobSlotGrid::OnLButtonDown(UINT nFlags, CPoint point)
+{
+ m_bLButtonDown = true;
+ Invalidate();
+
+ CWnd::OnLButtonDown(nFlags, point);
+}
+
+void CJobSlotGrid::OnLButtonUp(UINT nFlags, CPoint point)
+{
+ m_bLButtonDown = false;
+ Invalidate();
+
+ // 淇濇寔鍘熸湁閫昏緫涓嶅彉
+ CRect rect;
+ GetClientRect(&rect);
+ int nCellWidth = rect.Width() / m_nCols;
+ int nCellHeight = rect.Height() / m_nRows;
+
+ int nCol = point.x / nCellWidth;
+ int nRow = point.y / nCellHeight;
+
+ if (IsSlotClickable(nRow, nCol)) {
+ if (m_fnSlotClickCallback) {
+ m_fnSlotClickCallback(nRow, nCol);
+ }
+ }
+
+ CWnd::OnLButtonUp(nFlags, point);
}
void CJobSlotGrid::OnPaint() {
@@ -144,27 +229,66 @@
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) {
CRect cellRect(j * nCellWidth, i * nCellHeight, (j + 1) * nCellWidth, (i + 1) * nCellHeight);
- // 鑳屾櫙
- CBrush* pBrush = m_vSlotStatus[i][j] ? &m_brushHasJob : &m_brushNoJob;
- pDC->FillRect(&cellRect, pBrush);
+ // 鍒ゆ柇鐘舵�侊細鎮仠 / 鎸変笅
+ bool bIsHover = (m_ptHover.x == j && m_ptHover.y == i);
+ bool bIsClicking = bIsHover && m_bLButtonDown;
- // 杈规
+ // 閫夋嫨濉厖棰滆壊
+ 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锛�
+ 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);
+ }
}
}
pDC->SelectObject(pOldFont);
-}
+}
\ No newline at end of file
--
Gitblit v1.9.3