转载自: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为降序
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
次函数为非常重要函数。
int
CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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
"
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
*pResult = 0;
}
经过上面的努力,整个程序就完成了。您可以看到如下的界面:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/precipitant/36234/o_pic1.JPG)
这个只不过是最初级简单的方法。如果感兴趣可以看一看一些复杂的,样式更加多样的排序的例子:
http://www.vckbase.com/document/viewdoc/?id=243