首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ CSortListCtrl 增強版:滑鼠拖曳多選 SubItem (儲存格級選取)

     編輯:VC 教學

需求

原版 `CSortListCtrl` 僅支援整列選取。專案需求:按住滑鼠左鍵拖曳,任意選取多個 **儲存格 (SubItem)**,右鍵彈出選單對選中儲存格批次運算 (加/減/乘/除)。

核心修改

1. 新增成員陣列


class CSortListCtrlEx : public CSortListCtrl {
    CUIntArray m_arrSelItems;   // 選中列索引
    CUIntArray m_arrSelSubItems; // 對應欄索引
};

2. OnMouseMove - 拖曳選取


void CSortListCtrlEx::OnMouseMove(UINT nFlags, CPoint point) {
    if (nFlags & MK_LBUTTON) {
        LVHITTESTINFO hti = { point };
        SubItemHitTest(&hti);
        if (hti.iItem >= 0 && hti.iSubItem >= 0) {
            // 高亮顯示
            SetItemColor(hti.iItem, hti.iSubItem, RGB(255,255,255), RGB(50,50,50));
            // 去重存入
            for (int i=0; i

3. OnLvnBeginDrag / OnNMClick - 清除舊選取


void CSortListCtrlEx::OnLvnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) {
    ClearSelection();
    *pResult = 0;
}
void CSortListCtrlEx::OnNMClick(NMHDR* pNMHDR, LRESULT* pResult) {
    ClearSelection();
    *pResult = 0;
}
void CSortListCtrlEx::ClearSelection() {
    for (int i=0; i

4. 右鍵選單批次運算範例


void CSortListCtrlEx::OnContextMenu(CWnd* pWnd, CPoint point) {
    if (m_arrSelItems.IsEmpty()) return;
    CMenu menu; menu.CreatePopupMenu();
    menu.AppendMenu(MF_STRING, ID_OP_ADD, _T("加法"));
    menu.AppendMenu(MF_STRING, ID_OP_SUB, _T("減法"));
    // ...
    menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
void CSortListCtrlEx::OnOpAdd() {
    for (int i=0; i

關鍵點

  • `SubItemHitTest` 取得游標下的精確列/欄。
  • `SetItemColor` (CSortListCtrl 提供) 視覺標示選中狀態。
  • 陣列一一對應儲存 `(row, col)`,支援非連續、跨列跨欄選取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved