CListCtrl排序功能


很多第三方列表控件,在作简介时都会说:我们的控件有xxx功能,还有xxx功能,以及牛逼的排序功能。那么我们原生态的CListCtrl控件呢?答案是肯定的。

秘密就在于CListCtrl提供的

BOOL SortItems(_In_ PFNLVCOMPARE pfnCompare, _In_ DWORD_PTR dwData)

void CXXXDlg::OnLvnColumnclickListResult(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: Add your control notification handler code here
	int Length = m_result.GetItemCount();
	PItemData pItemData = NULL;

	if (Length <= 0)
	{
		return;
	}

	for (int i = 0; i < Length; i++)
	{
		pItemData = (PItemData)m_result.GetItemData(i);
		pItemData->sSortText = m_result.GetItemText(i, pNMLV->iSubItem);
		m_result.SetItemData(i, (DWORD_PTR)pItemData);
	}

	static int sort = 0;
	if (g_iSortSubItem != pNMLV->iSubItem)
	{
		sort = 0;
		g_iSortSubItem = pNMLV->iSubItem;
	}
	else
	{
		if (sort == 0)
		{
			sort = 1;
		}
		else
		{
			sort = 0;
		}
	}
	m_result.SortItems(SortFunc, (DWORD_PTR)&sort);

	*pResult = 0;
}
static int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CString &lp1 = ((PItemData)lParam1)->sSortText;
	CString &lp2 = ((PItemData)lParam2)->sSortText;
	int &sort = *(int *)lParamSort;
	if (sort == 0)
	{
		if (g_iSortSubItem == 0)
		{
			return (_ttoi(lp1) - _ttoi(lp2)); // sort number
		}
		else
		{
			return lp1.CompareNoCase(lp2); // sort string
		}
	}
	else
	{
		if (g_iSortSubItem == 0)
		{
			return (_ttoi(lp2) - _ttoi(lp1));
		}
		else
		{
			return lp2.CompareNoCase(lp1);
		}
	}
}


参考资料:http://support.microsoft.com/kb/250614/en-us

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值