ListCtrl排序时如何使用回调函数
编号:QA001052
建立日期: 1999年5月26日 最后修改日期:1999年5月30日
所属类别:
hanju:
系统:WINT9x
开发软件VC6.0或VB6.0(主要VC)
我在为ListCtrl需要排序(SortItems)我看了帮助上面说要加一个回调函数:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);
请问这三个参数分别代表什么(是不是什么结构),应该怎样用?
回答:
列表框排序
//对指定子项排序
void CDataListCtrl::Sort(DWORD dwSub)
{
static DWORD LastSort;
//相同翻转
if(dwSub == LastSort)
{
m_Revert *= -1;
}
else
{
LastSort = dwSub;
m_Revert = 1;
}
m_pThis = this;
SortItems( (PFNLVCOMPARE)CompareFunc, dwSub );
TRACE("Sort By Sub %d\n", dwSub);
}
//排序回调函数
int CALLBACK CDataListCtrl::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.
*/
if((lParamSort == 0) || (m_pThis == NULL))
{
if (lParam1 > lParam2)
return -m_Revert;
else
return m_Revert;
}
int nItem1, nItem2;
LVFINDINFO FindInfo;
FindInfo.flags = LVFI_PARAM;
FindInfo.lParam = lParam1;
nItem1 = m_pThis->FindItem(&FindInfo, -1);
FindInfo.lParam = lParam2;
nItem2 = m_pThis->FindItem(&FindInfo, -1);
if((nItem1 == -1) || (nItem2 == -1))
{
TRACE("无法找到!\n");
return 0;
}
CString Str1,Str2;
Str1 = m_pThis->GetItemText(nItem1, lParamSort);
Str2 = m_pThis->GetItemText(nItem2, lParamSort);
if(Str1 > Str2)
return -m_Revert;
else if(Str1 == Str2)
return 0;
else
return m_Revert;
}
如前面的例子,排序是通过成员函数SortItems来进行的。SortItems成员函数有两个参数。第一个是排序所用的排序回调函数,第二个是需传入的参数。
排序回调函数是排序的关键。它有三个入口参数:第一和第二个为进行比较的两项的参数;第三参数为排序时传入的参数即SortItems中传入的参数。
比较过程是这样的:
如果,第一项应在第二项的前面,则返回一个负值;
如果,第一项应在第二项的后面,则返回一个正值;
否则,第一项与第二项相等,则返回零。
这里,需要注意的是,回调函数是在对什么进行比较。回调函数进行比较的两项,是在插入列表项的参数数据项。也就是说,在插入列表项时,必须设置参数项(LVIF_PARAM)。这样才能对列表项的每一项进行比较,而这往往是我们忽略的参数。
这样,我们就可以对列表控件单击列表头,响应消息进行排序了。
此外,你可以访问http://www.codeguru.com/listview/index.shtml,那里有很多排序的实际例子。
此问题由Enigma、李海回答。
| |
|
|
| |
|
|