热情软件屋

 

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、李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio