CListCtrl排序的解决办法

转载自:http://blog.csdn.net/precipitant/article/details/1254878

这两天写了一个程序,用到了CListCtrl,现把自己总结的排序的方法叙述一下。

首先建立一个formview的单文档exe工程,名为SortA

然后, 在dialog中添加一个 clistctrl控件,改成report

添加该控件的影射变量为:m_list

然后在 sortAview.h的类定义前面添加如下代码:

struct MyData ... {
CListCtrl
*listctrl; //CListCtrl控件指针
int isub; //l列号
int seq; //1为升序,0为降序
}
;

// 次函数为非常重要函数。
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
... {
MyData
*p=(MyData *)lParamSort;
CListCtrl
* list =p->listctrl;
int isub=p->isub;
LVFINDINFO findInfo;
findInfo.flags
= LVFI_PARAM;
findInfo.lParam
= lParam1;
int iItem1 = list->FindItem(&findInfo, -1);
findInfo.lParam
= lParam2;
int iItem2 = list->FindItem(&findInfo, -1);
CString strItem1
=list->GetItemText(iItem1,isub);
CString strItem2
=list->GetItemText(iItem2,isub);
if(p->seq)
return strcmp(strItem2, strItem1);
else
return -strcmp(strItem2, strItem1);
}

然后,在CSortAView类的 OnInitialUpdate 中添加:

SetProp(m_list.GetSafeHwnd(), " SORT_COLUMN " ,(HANDLE) 0 );
SetProp(m_list.GetSafeHwnd(),
" SORT_DIRECTION " ,(HANDLE) 1 );
// 为listctrl添加列头
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_list.InsertColumn(
0 , " 姓名 " ,LVCFMT_LEFT, 100 );
m_list.InsertColumn(
1 , " 年龄 " ,LVCFMT_LEFT, 100 );
m_list.InsertColumn(
2 , " 妻子的数目 " ,LVCFMT_LEFT, 100 );
// 为listctrl添加三个item
m_list.InsertItem( 0 , " 陈水扁 " , 0 );
m_list.SetItemText(
0 , 1 , " 66 " );
m_list.SetItemText(
0 , 2 , " 67 " );

m_list.InsertItem(
1 , " 游西堃 " , 0 );
m_list.SetItemText(
1 , 1 , " 85 " );
m_list.SetItemText(
1 , 2 , " 56 " );

m_list.InsertItem(
2 , " 布什 " , 0 );
m_list.SetItemText(
2 , 1 , " 77 " );
m_list.SetItemText(
2 , 2 , " 26 " );

// 下面是为每一个item设置一个 itemdata
// 如果要用sortItems排序,这个是必须的。但是他的值不会影响到排序
m_list.SetItemData( 0 ,(DWORD) " 垃圾 " );
m_list.SetItemData(
1 ,(DWORD) " 白痴 " );
m_list.SetItemData(
2 ,(DWORD) " 傻叉 " );

然后,CListCtrl控件的 LVN_COLUMNCLICK 消息影射,并添加代码如下:

void CSortAView::OnColumnclickList1(NMHDR * pNMHDR, LRESULT * pResult)
... {
NM_LISTVIEW
* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
MyData *tmpp=new MyData;
tmpp
->listctrl=&m_list;
tmpp
->isub=pNMListView->iSubItem;
int sortnum=(int)GetProp(m_list.GetSafeHwnd(),"SORT_COLUMN");
int sortasc=(int)GetProp(m_list.GetSafeHwnd(),"SORT_DIRECTION");
if(sortnum==pNMListView->iSubItem)...{
sortasc
=(sortasc+1)%2;
SetProp(m_list.GetSafeHwnd(),
"SORT_DIRECTION",(HANDLE)sortasc);
}

SetProp(m_list.GetSafeHwnd(),
"SORT_COLUMN",(HANDLE)pNMListView->iSubItem);
tmpp
->seq=sortasc;
m_list.SortItems(CompareFunc,(LPARAM)tmpp);




*pResult = 0;
}

经过上面的努力,整个程序就完成了。您可以看到如下的界面:

这个只不过是最初级简单的方法。如果感兴趣可以看一看一些复杂的,样式更加多样的排序的例子:

http://www.vckbase.com/document/viewdoc/?id=243

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值