这是我的回调函数:
int CALLBACK SortMeAscending(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int nRetVal = 0;
PITEMDATA pData1 = (PITEMDATA)lParam1;
PITEMDATA pData2 = (PITEMDATA)lParam2;
switch(lParamSort)
{
case 0:
if(pData1->iSeq < pData2->iSeq)
nRetVal = -1;
else if(pData1->iSeq > pData2->iSeq)
nRetVal = 1;
else
nRetVal = 0;
break;
case 1:
nRetVal = lstrcmp(pData2->pszCueName, pData1->pszCueName);
break;
case 2:
nRetVal = lstrcmp(pData2->pszTags, pData1->pszTags);
break;
default:
break;
}
return nRetVal;
}
int CALLBACK SortMeDescending(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int nRetVal = 0;
PITEMDATA pData1 = (PITEMDATA)lParam1;
PITEMDATA pData2 = (PITEMDATA)lParam2;
switch(lParamSort)
{
case 0:
if(pData1->iSeq > pData2->iSeq)
nRetVal = -1;
else if(pData1->iSeq < pData2->iSeq)
nRetVal = 1;
else
nRetVal = 0;
break;
case 1:
nRetVal = lstrcmp(pData1->pszCueName, pData2->pszCueName);
break;
case 2:
nRetVal = lstrcmp(pData1->pszTags, pData2->pszTags);
break;
default:
break;
}
return nRetVal;
}
这是我的OnCompareItems:
int CTest::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
CMFCHeaderCtrl &headerCntrl = GetHeaderCtrl();
BOOL b = 0;
if(headerCntrl.IsAscending())
{
return SortItems(SortMeDescending, iColumn);
}
else
{
return SortItems(SortMeAscending, iColumn);
}
}
如果我关注此帖http://support.microsoft.com/kb/250614 我没有在标题中排序的箭头。 如果我使用你上面可以看到的方法,我在排序方面会有一些差距。 我点击它排序,下次它不会排序和反复 请帮帮我
答案 0 :(得分:1)
我认为您需要使用CMFCHeaderCtrl::SetSortColumn来设置列的排序顺序。每次你排序。除此之外,应该从HDN_ITEMCLICK处理程序调用实际的排序函数。
所以,假设你已经指定了这个:
ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)
在OnItemclickList1方法中编写以下代码:
void CTest::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
CMFCHeaderCtrl &headerCntrl = GetHeaderCtrl();
BOOL b = 0;
if(headerCntrl.IsAscending())
{
headerCntrl.SetSortColumn(pLV->iItem, FALSE);
SortItems(SortMeDescending, pLV->iItem);
}
else
{
headerCntrl.SetSortColumn(pLV->iItem, TRUE);
SortItems(SortMeAscending, iColumn);
}
*pResult = 0;
}
并放弃您的OnCompareItems