原版 `CSortListCtrl` 僅支援整列選取。專案需求:按住滑鼠左鍵拖曳,任意選取多個 **儲存格 (SubItem)**,右鍵彈出選單對選中儲存格批次運算 (加/減/乘/除)。
class CSortListCtrlEx : public CSortListCtrl {
CUIntArray m_arrSelItems; // 選中列索引
CUIntArray m_arrSelSubItems; // 對應欄索引
};
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
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
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