CListCtrl类控件如何排序呢?

No9 2002-05-05 11:06:30
请问高手,在程序中使用了了一个CListCtrl类控件,使用了Report模式,我想请问如何让它可以象“资源管理器”那样点击标签后对其中的条目进行适当的排序呢?
...全文
766 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
akademecia 2002-05-07
  • 打赏
  • 举报
回复
在您的代码中是通过捕获NM_COLUMNCLICK信息,并进行处理,在其处理函数中调用的SortItems()函数的,我理解的对吧?


可以这样做。

但SortItems()是自动的,也就是说你creat了listctl后,他会被自动调用。
No9 2002-05-07
  • 打赏
  • 举报
回复
但在你的代码中有一点我还不明白,就是下面的代码:
for(int i=0;i<this->GetItemCount();i++)
{
this->SetItemData(i,i);
}
SetItemData()函数在说明中是设置条目的自定义数据功能,为什么一定这样设置,而且我将它们注释掉后,比较功能就失效了!

经调试后发现:转递给比较函数的参数lParam1和lParam2始终为 “0” !
而加上上面的代码后这两个参数转递就正常了, 这是为什么呢?
No9 2002-05-07
  • 打赏
  • 举报
回复
谢了, xuying!

感谢 talcon_hu 提供的代码,通过对你的代码的分析,我有点明白了,好像并不象前面几位朋友的介绍的那样,系统会自动的调用排序函数(其实我觉得应该由用户指定并编写比较函数,然后让系统自动调用比较好一些)!

在您的代码中是通过捕获NM_COLUMNCLICK信息,并进行处理,在其处理函数中调用的SortItems()函数的,我理解的对吧?
xuying 2002-05-07
  • 打赏
  • 举报
回复
up
No9 2002-05-07
  • 打赏
  • 举报
回复
TO akademecia:
关于SortItems()是自动调用的,我不知道你说的对不对?

但如果你说的正确的话,系统怎么知道如何比较它们之间的大小呢?
No9 2002-05-06
  • 打赏
  • 举报
回复
我就总也搞不明白系统怎么调用的比较函数呢?在MSDN中的解释我看了还是不太明白?!

上面不是有二位朋友说有源代码的,能否发一份让在下参考一下呢?或者重点解释一下比较函数的调用机制,好吗?

我的E-mail地址为:chinahlsoft@21cn.com

谢谢了!
No9 2002-05-06
  • 打赏
  • 举报
回复
To winne_ll:
其实排序功能是很简单的,也有很多的方法,这也并不重要!

关键是我想知道如何让列表控件去调用呢?!!!
No9 2002-05-06
  • 打赏
  • 举报
回复
TO xuying:
系统自动调用排序函数???我还是不明白呀!

那么系统是如何知道那个是你所定义的排序函数的呢?比如说我定义排序函数为Compare()!
talcon_hu 2002-05-05
  • 打赏
  • 举报
回复
我写了一个类,想要的话我可以发给你!
No9 2002-05-05
  • 打赏
  • 举报
回复
TO elc(酋长):
谢谢这位老兄的代码,好长呀,我先研究一下再说!
No9 2002-05-05
  • 打赏
  • 举报
回复
TO yu_hl:
怎么调用SortItems()函数?
比较的函数我已经编写过了,但什么时候调用呢?谁来调用呢?是自己编写代码调用呢?还是系统自动调用呢?
elc 2002-05-05
  • 打赏
  • 举报
回复

class CSortClass
{
public:
CSortClass(CListCtrl * _pWnd, const int _iCol, const bool _bIsNumeric);
//CSortClass(CListCtrl * _pWnd, const int _iCol, const bool _bIsNumeric, int iStartingItem, int iEndingItem );
virtual ~CSortClass();

int iCol;
int m_iStartingItem;
int m_iEndingItem;

CListCtrl * pWnd;
bool bIsNumeric;

void Sort(const bool bAsc);

static int CALLBACK CompareAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int CALLBACK CompareDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int CALLBACK CompareAscI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int CALLBACK CompareDesI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

public:
class CSortItem
{
public:
virtual ~CSortItem();
CSortItem(const DWORD _dw, const CString &_txt);
CString txt;
DWORD dw;
};
class CSortItemInt
{
public:
CSortItemInt(const DWORD _dw, const CString &_txt);
int iInt ;
DWORD dw;
};
};




#include "stdafx.h"
#include "SortClass.h"
/////////////////////////////////////////////////////////////////////////////
// CSortClass
CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol, const bool _bIsNumeric )
{
iCol = _iCol;
pWnd = _pWnd;
bIsNumeric = _bIsNumeric;
ASSERT(pWnd);
int max = pWnd->GetItemCount();
DWORD dw;
CString txt;
if (bIsNumeric)
{
for (int t = 0; t < max; t++)
{
dw = pWnd->GetItemData(t);
txt = pWnd->GetItemText(t, iCol);
pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt));
}
}
else
{
for (int t = 0; t < max; t++)
{
dw = pWnd->GetItemData(t);
txt = pWnd->GetItemText(t, iCol);
pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt));
}
}
}
CSortClass::~CSortClass()
{
ASSERT(pWnd);
int max = pWnd->GetItemCount();
if (bIsNumeric)
{
CSortItemInt * pItem;
for (int t = 0; t < max; t++)
{
pItem = (CSortItemInt *) pWnd->GetItemData(t); ASSERT(pItem);
pWnd->SetItemData(t, pItem->dw);
delete pItem;
}
}
else
{
CSortItem * pItem;
for (int t = 0; t < max; t++)
{
pItem = (CSortItem *) pWnd->GetItemData(t);
ASSERT(pItem);
pWnd->SetItemData(t, pItem->dw);
delete pItem;
}
}
}

void CSortClass::Sort(const bool bAsc)
{
if (bIsNumeric)
{
if (bAsc)
pWnd->SortItems(CompareAscI, 0L);
else
pWnd->SortItems(CompareDesI, 0L);
}
else
{
if (bAsc)
pWnd->SortItems(CompareAsc, 0L);
else
pWnd->SortItems(CompareDes, 0L);
}
}

int CALLBACK CSortClass::CompareAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItem * i1 = (CSortItem *) lParam1;
CSortItem * i2 = (CSortItem *) lParam2;
ASSERT(i1 && i2);
return i1->txt.CompareNoCase(i2->txt);
}

int CALLBACK CSortClass::CompareDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItem * i1 = (CSortItem *) lParam1;
CSortItem * i2 = (CSortItem *) lParam2;
ASSERT(i1 && i2);
return i2->txt.CompareNoCase(i1->txt);
}

int CALLBACK CSortClass::CompareAscI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{ CSortItemInt * i1 = (CSortItemInt *) lParam1;
CSortItemInt * i2 = (CSortItemInt *) lParam2;
ASSERT(i1 && i2);
if (i1->iInt == i2->iInt)
return 0;
return i1->iInt > i2->iInt ? 1 : -1;
}

int CALLBACK CSortClass::CompareDesI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItemInt * i1 = (CSortItemInt *) lParam1;
CSortItemInt * i2 = (CSortItemInt *) lParam2;
ASSERT(i1 && i2);
if (i1->iInt == i2->iInt)
return 0;
return i1->iInt < i2->iInt ? 1 : -1;
}

CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt)
{
dw = _dw;
txt = _txt;
}

CSortClass::CSortItem::~CSortItem()
{
}

CSortClass::CSortItemInt::CSortItemInt(const DWORD _dw, const CString & _txt)
{
iInt = atoi(_txt);
dw = _dw;
}

Yokishiro 2002-05-05
  • 打赏
  • 举报
回复
要设置一个style
用SetExtendedStyle()
那个style应该是LVS_EX_ASCEND吧(现在机器上没有MSDN,sorry)
yu_hl 2002-05-05
  • 打赏
  • 举报
回复
要自己写一个sort函数,然后调用SortItems.
在MSDN里查CListCtrl::SortItems就可以查到例子。
winne_ll 2002-05-05
  • 打赏
  • 举报
回复
qsort()函数可以实现排序功能。
yu_hl 2002-05-05
  • 打赏
  • 举报
回复
listctrl排序时它自己调用。
xuying 2002-05-05
  • 打赏
  • 举报
回复
系统自动调用排序函数。
xuying 2002-05-05
  • 打赏
  • 举报
回复
我有一个程序,封装了一个可以排序的listctrl类,还有例子程序。
需要的话给我来信: xuying@nlsde.buaa.edu.cn
No9 2002-05-05
  • 打赏
  • 举报
回复
各位老兄,帮个忙好吗?
No9 2002-05-05
  • 打赏
  • 举报
回复
TO elc(酋长):
老兄,我看过你的代码了,非常谢谢你好心提供的代码。
但可能是我问的不太具体的缘故吧,包括下面的 talcon_hu 老兄也好像理解错了!

我想问的意思就是“比较函数什么时候被调用呢?谁来调用呢?是自己编写代码调用呢?还是系统自动调用呢?”!

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧