void CTestthreadDlg::OnColumnclickEmailList(NMHDR* pNMHDR, LRESULT* pResult)
{ NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if( pNMListView->iSubItem == m_EmailList.m_nSortedCol )
m_EmailList.m_fAsc = !m_EmailList.m_fAsc;
else
{
m_EmailList.m_fAsc = TRUE;
m_EmailList.m_nSortedCol = pNMListView->iSubItem;
}
int count = m_EmailList.GetItemCount();
for(int i=0;i<count;i++) m_EmailList.SetItemData(i,i);
m_EmailList.SortItems(ListCompare, (DWORD)&m_EmailList); *pResult = 0;}
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortList* pV=(CSortList*)lParamSort;
//DEMO_DATA* pInfo1 = (DEMO_DATA*)lParam1;
//DEMO_DATA* pInfo2 = (DEMO_DATA*)lParam2;
CString szComp1,szComp2;
int iCompRes;
switch(pV->m_nSortedCol)
{
case(0):
szComp1=pV->GetItemText(lParam1,0);
szComp2=pV->GetItemText(lParam2,0);
iCompRes=szComp1.Compare(szComp2);
break;
case(1):
szComp1=pV->GetItemText(lParam1,1);
szComp2=pV->GetItemText(lParam2,1);
iCompRes=szComp1.Compare(szComp2);
break;
//case(3):
default:
szComp1=pV->GetItemText(lParam1,2);
szComp2=pV->GetItemText(lParam2,2);
iCompRes=szComp1.Compare(szComp2);
break;
//ASSERT(0);
//break;
}
//根据当前的排序方式进行调整
if(pV->m_fAsc)
return iCompRes;
else
return iCompRes*-1;
}
折腾了一个晚上,把网上的例子都看过了,终于完成了排序,但是我有些不明白的:lParam1和lParam2是itemdata,但是为什么我只是
for(int i=0;i<count;i++) m_EmailList.SetItemData(i,i);
这么为它赋值就可以排序呢?原理是什么?还有就是我找不到MSDN关于LISTCTRL排序的文档,我只是找到了SORTITEM()函数里有这么几句:
The comparison function has the following form:int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.
等待.........
{ NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if( pNMListView->iSubItem == m_EmailList.m_nSortedCol )
m_EmailList.m_fAsc = !m_EmailList.m_fAsc;
else
{
m_EmailList.m_fAsc = TRUE;
m_EmailList.m_nSortedCol = pNMListView->iSubItem;
}
int count = m_EmailList.GetItemCount();
for(int i=0;i<count;i++) m_EmailList.SetItemData(i,i);
m_EmailList.SortItems(ListCompare, (DWORD)&m_EmailList); *pResult = 0;}
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortList* pV=(CSortList*)lParamSort;
//DEMO_DATA* pInfo1 = (DEMO_DATA*)lParam1;
//DEMO_DATA* pInfo2 = (DEMO_DATA*)lParam2;
CString szComp1,szComp2;
int iCompRes;
switch(pV->m_nSortedCol)
{
case(0):
szComp1=pV->GetItemText(lParam1,0);
szComp2=pV->GetItemText(lParam2,0);
iCompRes=szComp1.Compare(szComp2);
break;
case(1):
szComp1=pV->GetItemText(lParam1,1);
szComp2=pV->GetItemText(lParam2,1);
iCompRes=szComp1.Compare(szComp2);
break;
//case(3):
default:
szComp1=pV->GetItemText(lParam1,2);
szComp2=pV->GetItemText(lParam2,2);
iCompRes=szComp1.Compare(szComp2);
break;
//ASSERT(0);
//break;
}
//根据当前的排序方式进行调整
if(pV->m_fAsc)
return iCompRes;
else
return iCompRes*-1;
}
折腾了一个晚上,把网上的例子都看过了,终于完成了排序,但是我有些不明白的:lParam1和lParam2是itemdata,但是为什么我只是
for(int i=0;i<count;i++) m_EmailList.SetItemData(i,i);
这么为它赋值就可以排序呢?原理是什么?还有就是我找不到MSDN关于LISTCTRL排序的文档,我只是找到了SORTITEM()函数里有这么几句:
The comparison function has the following form:int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.
等待.........
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货