CListCtrl排序的解决办法
来源:互联网 发布:广告接单软件 编辑:程序博客网 时间:2024/06/12 05:42
转载自: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);
}
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)"傻叉");
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;
}
...{
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
- CListCtrl排序的解决办法
- CListCtrl排序的解决办法
- CListCtrl排序的解决办法
- CListCtrl排序的解决办法
- cListctrl的排序
- CListCtrl的InsertColumn无效,解决办法
- 将CListCtrl的项目排序
- CListCtrl::SortItems排序的用法
- CListCtrl排序功能的实现
- CListCtrl中排序的问题
- CListCtrl控件(2)可排序的CListCtrl控件
- CListCtrl控件(3)可排序的CListCtrl控件
- CListCtrl控件(4)可排序的CListCtrl控件
- CListCtrl控件(3)可排序的CListCtrl控件
- CListCtrl控件(3)可排序的CListCtrl控件
- CListCtrl 排序
- CListCtrl排序
- CListCTrl排序
- iOS学习--详解UIView的 contentStretch属性
- 锂电池基本原理篇
- android实现后台自动发邮件功能
- DDS源码编译
- MongoDB MapReduce速度提升20倍的优化宝典
- CListCtrl排序的解决办法
- sql truncate 、delete与drop区别
- ADB server didn't ACK
- 【视听盛宴】《高效能人士的七个习惯》分享会
- hdu 1829 A Bug's Life(并查集)
- android关机充电流程、充电画面显示
- android电池系统
- 家庭能源管理,有待挖掘的金矿
- 浅析spring中的webApplicationContext