很多第三方列表控件,在作简介时都会说:我们的控件有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);
}
}
}