现在的位置: 首页 > 综合 > 正文

CListCtrl排序的解决办法

2017年10月17日 ⁄ 综合 ⁄ 共 2393字 ⁄ 字号 评论关闭

转载自: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

抱歉!评论已关闭.