在listview控件中向上或者向下移动列表中某一项代码

在某些情况下通过向上和向下移动选定的表项,您可能希望允许用户改变ListView中表项的顺序。


在ListView控件的API中,没有支持2个项目之间交换的API。要做到这一点的唯一方法,就是通过手动交换所有项的数


据,包括lParam参数值和所有列表项!下面的代码演示了如何做到这一点。 SwapLVItems函数通过列表项的索引进行


换两个表项。函数MoveLVSelectedItemsUp和MoveLVSelectedItemsDown实现的功能将所选的项目向上和向下移动。


下面提供封装的接口API


UINT GetLVItemState(HWND hwnd, int i, UINT mask)
{
	return ListView_GetItemState(hwnd, i, mask);
}

void GetLVItemText(HWND hwnd, int iItem, int iSubItem, LPSTR pszText, int cchTextMax)
{
	ListView_GetItemText(hwnd, iItem, iSubItem, pszText, cchTextMax);
}

void SetLVItemText(HWND hwnd, int i, int iSubItem, LPSTR pszText)
{
	ListView_SetItemText(hwnd, i, iSubItem, pszText);
}


BOOL GetLVItem(HWND hListView, UINT mask, int iItem, int iSubItem, 
		LPLVITEM pitem, UINT stateMask)
{
	pitem->mask = mask;
	pitem->stateMask = stateMask;
	pitem->iItem = iItem;
	pitem->iSubItem = iSubItem;
	return ListView_GetItem(hListView, pitem);
}


int GetHeaderItemCount(HWND hwndHD)
{
	return Header_GetItemCount(hwndHD);
}

HWND GetLVHeaderControl(HWND hListView)
{
	return ListView_GetHeader(hListView);
}

int GetLVColumnsCount(HWND hListView)
{
	return (GetHeaderItemCount(GetLVHeaderControl(hListView)));
}


void SwapLVItems(HWND hListView, int iItem1, int iItem2)
{
	//I assume that 4K buffer is really enough for storing the content of a column
	const LOCAL_BUFFER_SIZE = 4096;
	LVITEM lvi1, lvi2;
	UINT uMask = LVIF_TEXT | LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM  | LVIF_STATE;
	char szBuffer1[LOCAL_BUFFER_SIZE + 1], szBuffer2[LOCAL_BUFFER_SIZE + 1];
	lvi1.pszText = szBuffer1;
	lvi2.pszText = szBuffer2;
	lvi1.cchTextMax  = sizeof(szBuffer1);
	lvi2.cchTextMax  = sizeof(szBuffer2);

	BOOL bResult1 = GetLVItem(hListView, uMask, iItem1, 0, &lvi1, (UINT)-1);
	BOOL bResult2 = GetLVItem(hListView, uMask, iItem2, 0, &lvi2, (UINT)-1);

	if (bResult1 && bResult2)
	{
		lvi1.iItem = iItem2;
		lvi2.iItem = iItem1;
		lvi1.mask = uMask;
		lvi2.mask = uMask;
		lvi1.stateMask = (UINT)-1;
		lvi2.stateMask = (UINT)-1;
		//swap the items
		ListView_SetItem(hListView, &lvi1);
		ListView_SetItem(hListView, &lvi2);

		int iColCount = GetLVColumnsCount(hListView);
		//Loop for swapping each column in the items.
		for (int iIndex = 1; iIndex < iColCount; iIndex++)
		{
			szBuffer1[0] = '\0';
			szBuffer2[0] = '\0';
			GetLVItemText(hListView, iItem1, iIndex, 
					szBuffer1, LOCAL_BUFFER_SIZE);
			GetLVItemText(hListView, iItem2, iIndex, 
					szBuffer2, LOCAL_BUFFER_SIZE);
			SetLVItemText(hListView, iItem2, iIndex, szBuffer1);
			SetLVItemText(hListView, iItem1, iIndex, szBuffer2);
		}
	}
}

//Move up the selected items
void MoveLVSelectedItemsUp(HWND hListView)
{
	int iCount = ListView_GetItemCount(hListView);

	for (int iIndex = 1; iIndex < iCount; iIndex++)
		if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
			SwapLVItems(hListView, iIndex, iIndex - 1);

}

//Move down the selected items
void MoveLVSelectedItemsDown(HWND hListView)
{
	int iCount = ListView_GetItemCount(hListView);

	for (int iIndex = iCount - 1; iIndex >= 0; iIndex--)
		if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
			SwapLVItems(hListView, iIndex, iIndex + 1);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值