取得選中項索引 → 讀取全欄文字 → DeleteItem → InsertItem 於目標位置 → 恢復選中狀態。簡單高效,適合報表模式 CListCtrl。
void CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) {
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos);
*pResult = 0;
}
void CLCDemoDlg::OnButtonUp() {
m_listCtrl.SetFocus();
if (IndexInFieldList <= 0) { AfxMessageBox(_T("已在第一行!")); return; }
CString c1 = m_listCtrl.GetItemText(IndexInFieldList, 0);
CString c2 = m_listCtrl.GetItemText(IndexInFieldList, 1);
CString c3 = m_listCtrl.GetItemText(IndexInFieldList, 2);
m_listCtrl.DeleteItem(IndexInFieldList);
int n = m_listCtrl.InsertItem(IndexInFieldList-1, c1);
m_listCtrl.SetItemText(n, 1, c2);
m_listCtrl.SetItemText(n, 2, c3);
IndexInFieldList--;
UINT flag = LVIS_SELECTED | LVIS_FOCUSED;
m_listCtrl.SetItemState(IndexInFieldList, flag, flag);
}
void CLCDemoDlg::OnButtonDown() {
m_listCtrl.SetFocus();
int cnt = m_listCtrl.GetItemCount();
if (IndexInFieldList < 0 || IndexInFieldList >= cnt-1) {
AfxMessageBox(_T("已在最後一行!")); return;
}
// 同樣讀取三欄文字
m_listCtrl.DeleteItem(IndexInFieldList);
int n = m_listCtrl.InsertItem(IndexInFieldList+1, c1);
m_listCtrl.SetItemText(n, 1, c2);
m_listCtrl.SetItemText(n, 2, c3);
IndexInFieldList++;
m_listCtrl.SetItemState(IndexInFieldList, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
}
lParam、圖示索引、狀態旗標:GetItem/SetItem 複製完整 LVITEMLVS_EX_DRAGDROP)LVS_OWNERDATA) 配合資料模型移動

環境:VC6.0 / Windows XP 編譯通過。