From ba50ece48a4b95563031f1dacffd3e04f89d952f Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 21 八月 2025 05:25:41 +0800
Subject: [PATCH] 1.完善可折叠列表;

---
 SourceCode/Bond/Servo/CExpandableListCtrl.h   |   17 ++++----
 SourceCode/Bond/Servo/CControlJobDlg.cpp      |   10 +----
 SourceCode/Bond/Servo/CExpandableListCtrl.cpp |   43 ++++++++++++++++-----
 3 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/SourceCode/Bond/Servo/CControlJobDlg.cpp b/SourceCode/Bond/Servo/CControlJobDlg.cpp
index a438bfa..77311e8 100644
--- a/SourceCode/Bond/Servo/CControlJobDlg.cpp
+++ b/SourceCode/Bond/Servo/CControlJobDlg.cpp
@@ -39,12 +39,6 @@
 {
 	CDialogEx::OnInitDialog();
 
-    DWORD dwStyle = m_listCtrl.GetExtendedStyle();
-    dwStyle |= LVS_EX_FULLROWSELECT;
-    dwStyle |= LVS_EX_GRIDLINES;
-    dwStyle |= LVS_EX_DOUBLEBUFFER;
-    m_listCtrl.SetExtendedStyle(dwStyle);
-
     HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
     ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
 
@@ -64,8 +58,8 @@
     m_listCtrl.InsertChild(ch21, { _T("SubStep A2"), _T("Run"),  _T("Bond") });
 
     // 鍒濆璁╅《灞傚睍寮�
-    //root1->expanded = true;
-    //root2->expanded = true;
+    root1->expanded = true;
+    root2->expanded = true;
 
     m_listCtrl.RebuildVisible();
 
diff --git a/SourceCode/Bond/Servo/CExpandableListCtrl.cpp b/SourceCode/Bond/Servo/CExpandableListCtrl.cpp
index 00bdf28..11470ce 100644
--- a/SourceCode/Bond/Servo/CExpandableListCtrl.cpp
+++ b/SourceCode/Bond/Servo/CExpandableListCtrl.cpp
@@ -19,16 +19,18 @@
 
     // 鎶ヨ〃椋庢牸鍒椾妇渚�
     SetExtendedStyle(GetExtendedStyle()
-        | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES);
-
-    // 绀轰緥鍒楋紙鍙湪澶栭儴璁剧疆锛�
-    if (GetHeaderCtrl() == nullptr || GetHeaderCtrl()->GetItemCount() == 0) {
-        InsertColumn(0, _T("鍚嶇О"), LVCFMT_LEFT, 260);
-        InsertColumn(1, _T("鐘舵��"), LVCFMT_LEFT, 120);
-        InsertColumn(2, _T("鎻忚堪"), LVCFMT_LEFT, 260);
-    }
+        | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER);
 
     return 0;
+}
+
+void CExpandableListCtrl::PreSubclassWindow()
+{
+    // 鎶ヨ〃椋庢牸鍒椾妇渚�
+    SetExtendedStyle(GetExtendedStyle()
+        | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER);
+
+    CListCtrl::PreSubclassWindow();
 }
 
 CExpandableListCtrl::Node* CExpandableListCtrl::InsertRoot(const std::vector<CString>& cols)
@@ -273,6 +275,29 @@
             CString txt0 = n->cols.empty() ? _T("") : n->cols[0];
             pDC->DrawText(txt0, textRc, DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
 
+
+            // 鈥斺�� 鐢诲畬涓夎涓庢枃鏈箣鍚庯紝琛ヤ竴鏉¤琛岀殑搴曢儴妯悜缃戞牸绾� 鈥斺��
+            // 浠呭綋寮�鍚簡 LVS_EX_GRIDLINES 鎵嶇粯鍒�
+            if (GetExtendedStyle() & LVS_EX_GRIDLINES)
+            {
+                // 鐢ㄦ暣琛� bounds锛屼繚璇佹í绾胯疮绌挎墍鏈夊垪鐨勫彲瑙佸搴�
+                CRect rcRow;
+                GetSubItemRect(row, 0, LVIR_BOUNDS, rcRow);
+
+                // 搴曡竟 y 鍧愭爣锛堜笌绯荤粺缃戞牸绾垮榻愶級
+                const int y = rcRow.bottom - 1;
+
+                // 棰滆壊涓庣郴缁熼鏍兼帴杩戯紱鑻ヨ寰楀亸娴咃紝鍙崲 COLOR_3DSHADOW
+                CPen pen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT));
+                CPen* oldPen = pDC->SelectObject(&pen);
+
+                // 妯嚎浠庤宸﹀埌琛屽彸锛堝綋鍓嶅彲瑙佸尯鍩燂級
+                pDC->MoveTo(rcRow.left, y);
+                pDC->LineTo(rcRow.right, y);
+
+                pDC->SelectObject(oldPen);
+            }
+
             *pResult = CDRF_SKIPDEFAULT;
             return;
         }
@@ -286,5 +311,3 @@
 
     *pResult = CDRF_DODEFAULT;
 }
-
-
diff --git a/SourceCode/Bond/Servo/CExpandableListCtrl.h b/SourceCode/Bond/Servo/CExpandableListCtrl.h
index d4ecb51..57d606d 100644
--- a/SourceCode/Bond/Servo/CExpandableListCtrl.h
+++ b/SourceCode/Bond/Servo/CExpandableListCtrl.h
@@ -35,23 +35,24 @@
     // 便捷:通过可见行号取 Node*
     Node* GetNodeByVisibleIndex(int i) const;
 
+private:
+    void appendVisible(Node* n);
+    CRect expanderRectForRow(int row) const;        // 首列展开按钮区域
+    virtual void PreSubclassWindow();
+
 protected:
     // 消息
     afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
     afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
     afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
-
     DECLARE_MESSAGE_MAP()
 
 private:
-    std::vector<std::unique_ptr<Node>> m_roots;   // 顶层节点
-    std::vector<Node*>                 m_visible; // 展开后的可见节点顺序
-    int  m_expanderPadding = 6;   // 首列内侧边距
-    int  m_expanderSize = 10;  // 小三角/方块大小
+    std::vector<std::unique_ptr<Node>> m_roots;     // 顶层节点
+    std::vector<Node*>                 m_visible;   // 展开后的可见节点顺序
+    int  m_expanderPadding = 6;                     // 首列内侧边距
+    int  m_expanderSize = 10;                       // 小三角/方块大小
     int  m_textGap = 6;
-
-    void appendVisible(Node* n);
-    CRect expanderRectForRow(int row) const; // 首列展开按钮区域
 };
 
 

--
Gitblit v1.9.3