一个函数,用于交换Report样式的CListCtrl列表控件的两个列表项,包括列表项的图标,列表项显示的内容都能交换成功,唯独图标交换不成功,在CListCtrl::GetItem函数的调用上可能存在一些问题,请熟悉CListCtrl控件的大虾们帮忙看看。以下是函数代码:// 交换CListCtrl控件两个列表项的内容
void ExchangeListCtrlItem(CListCtrl *pListCtrl, int iItem1, int iItem2)
{
if (NULL == pListCtrl
|| iItem1 == iItem2
|| iItem1 < 0
|| iItem2 < 0
|| iItem1 >= pListCtrl->GetItemCount()
|| iItem2 >= pListCtrl->GetItemCount())
{
return;
} DWORD_PTR ItemData1 = pListCtrl->GetItemData(iItem1);
DWORD_PTR ItemData2 = pListCtrl->GetItemData(iItem2); // 交换图标
LVITEM Item1 = {0};
LVITEM Item2 = {0};
Item1.mask = LVIF_IMAGE | LVIF_TEXT;
Item1.iItem = iItem1;
Item1.iSubItem = 1;
if (pListCtrl->GetItem(&Item1)) // 问题在这里:GetItem后Item1.iImage依旧是0
{
Item2.mask = LVIF_IMAGE;
Item2.iItem = iItem2;
if (pListCtrl->GetItem(&Item2))
{
Item1.iItem = iItem2;
pListCtrl->SetItem(&Item1);
Item2.iItem = iItem1;
pListCtrl->SetItem(&Item2);
}
} // 交换ItemData
pListCtrl->SetItemData(iItem1, ItemData2);
pListCtrl->SetItemData(iItem2, ItemData1); // 交换两个列表项的各列
CString sTemp;
for (int i = 0; i < pListCtrl->GetHeaderCtrl()->GetItemCount(); i++)
{
sTemp = pListCtrl->GetItemText(iItem1, i);
pListCtrl->SetItemText(iItem1, i, pListCtrl->GetItemText(iItem2, i));
pListCtrl->SetItemText(iItem2, i, sTemp);
}
}
void ExchangeListCtrlItem(CListCtrl *pListCtrl, int iItem1, int iItem2)
{
if (NULL == pListCtrl
|| iItem1 == iItem2
|| iItem1 < 0
|| iItem2 < 0
|| iItem1 >= pListCtrl->GetItemCount()
|| iItem2 >= pListCtrl->GetItemCount())
{
return;
} DWORD_PTR ItemData1 = pListCtrl->GetItemData(iItem1);
DWORD_PTR ItemData2 = pListCtrl->GetItemData(iItem2); // 交换图标
LVITEM Item1 = {0};
LVITEM Item2 = {0};
Item1.mask = LVIF_IMAGE | LVIF_TEXT;
Item1.iItem = iItem1;
Item1.iSubItem = 1;
if (pListCtrl->GetItem(&Item1)) // 问题在这里:GetItem后Item1.iImage依旧是0
{
Item2.mask = LVIF_IMAGE;
Item2.iItem = iItem2;
if (pListCtrl->GetItem(&Item2))
{
Item1.iItem = iItem2;
pListCtrl->SetItem(&Item1);
Item2.iItem = iItem1;
pListCtrl->SetItem(&Item2);
}
} // 交换ItemData
pListCtrl->SetItemData(iItem1, ItemData2);
pListCtrl->SetItemData(iItem2, ItemData1); // 交换两个列表项的各列
CString sTemp;
for (int i = 0; i < pListCtrl->GetHeaderCtrl()->GetItemCount(); i++)
{
sTemp = pListCtrl->GetItemText(iItem1, i);
pListCtrl->SetItemText(iItem1, i, pListCtrl->GetItemText(iItem2, i));
pListCtrl->SetItemText(iItem2, i, sTemp);
}
}
改为 Item1.iSubItem = 0;行么