CListCtrl排序的解决办法

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

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

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

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

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

 

CListCtrl排序的解决办法CListCtrl排序的解决办法struct MyData...{
CListCtrl排序的解决办法     CListCtrl 
*listctrl;                 //CListCtrl控件指针
CListCtrl排序的解决办法
     int isub;        //l列号
CListCtrl排序的解决办法
     int seq;        //1为升序,0为降序
CListCtrl排序的解决办法
}
;
CListCtrl排序的解决办法
CListCtrl排序的解决办法
//次函数为非常重要函数。
CListCtrl排序的解决办法
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
CListCtrl排序的解决办法CListCtrl排序的解决办法
...{
CListCtrl排序的解决办法     MyData 
*p=(MyData *)lParamSort;
CListCtrl排序的解决办法     CListCtrl
* list =p->listctrl;
CListCtrl排序的解决办法     
int isub=p->isub;
CListCtrl排序的解决办法     LVFINDINFO findInfo; 
CListCtrl排序的解决办法     findInfo.flags 
= LVFI_PARAM; 
CListCtrl排序的解决办法     findInfo.lParam 
= lParam1; 
CListCtrl排序的解决办法     
int iItem1 = list->FindItem(&findInfo, -1); 
CListCtrl排序的解决办法     findInfo.lParam 
= lParam2; 
CListCtrl排序的解决办法     
int iItem2 = list->FindItem(&findInfo, -1); 
CListCtrl排序的解决办法     CString strItem1 
=list->GetItemText(iItem1,isub); 
CListCtrl排序的解决办法     CString strItem2 
=list->GetItemText(iItem2,isub);
CListCtrl排序的解决办法     
if(p->seq)
CListCtrl排序的解决办法          
return strcmp(strItem2, strItem1);
CListCtrl排序的解决办法     
else
CListCtrl排序的解决办法          
return -strcmp(strItem2, strItem1);
CListCtrl排序的解决办法}

 

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

 

CListCtrl排序的解决办法    SetProp(m_list.GetSafeHwnd(),"SORT_COLUMN",(HANDLE)0);
CListCtrl排序的解决办法    SetProp(m_list.GetSafeHwnd(),
"SORT_DIRECTION",(HANDLE)1);
CListCtrl排序的解决办法    
//为listctrl添加列头
CListCtrl排序的解决办法
    m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
CListCtrl排序的解决办法      m_list.InsertColumn(
0,"姓名",LVCFMT_LEFT,100);
CListCtrl排序的解决办法      m_list.InsertColumn(
1,"年龄",LVCFMT_LEFT,100);
CListCtrl排序的解决办法    m_list.InsertColumn(
2,"妻子的数目",LVCFMT_LEFT,100);
CListCtrl排序的解决办法   
//为listctrl添加三个item
CListCtrl排序的解决办法
    m_list.InsertItem(0,"陈水扁",0);    
CListCtrl排序的解决办法    m_list.SetItemText(
0,1,"66");         
CListCtrl排序的解决办法    m_list.SetItemText(
0,2,"67");    
CListCtrl排序的解决办法
CListCtrl排序的解决办法    m_list.InsertItem(
1,"游西堃",0);    
CListCtrl排序的解决办法    m_list.SetItemText(
1,1,"85");          
CListCtrl排序的解决办法    m_list.SetItemText(
1,2,"56");    
CListCtrl排序的解决办法     
CListCtrl排序的解决办法    m_list.InsertItem(
2,"布什",0);
CListCtrl排序的解决办法    m_list.SetItemText(
2,1,"77");          
CListCtrl排序的解决办法    m_list.SetItemText(
2,2,"26");
CListCtrl排序的解决办法    
CListCtrl排序的解决办法    
//下面是为每一个item设置一个 itemdata
CListCtrl排序的解决办法    
//如果要用sortItems排序,这个是必须的。但是他的值不会影响到排序
CListCtrl排序的解决办法
    m_list.SetItemData(0,(DWORD)"垃圾");     
CListCtrl排序的解决办法    m_list.SetItemData(
1,(DWORD)"白痴"); 
CListCtrl排序的解决办法    m_list.SetItemData(
2,(DWORD)"傻叉"); 

 

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

 

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

CListCtrl排序的解决办法     SetProp(m_list.GetSafeHwnd(),
"SORT_COLUMN",(HANDLE)pNMListView->iSubItem);
CListCtrl排序的解决办法     tmpp
->seq=sortasc;
CListCtrl排序的解决办法     m_list.SortItems(CompareFunc,(LPARAM)tmpp);
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法     
*pResult = 0;
CListCtrl排序的解决办法}

 

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

CListCtrl排序的解决办法

 

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

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

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

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

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

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

 

CListCtrl排序的解决办法CListCtrl排序的解决办法struct MyData...{
CListCtrl排序的解决办法     CListCtrl 
*listctrl;                 //CListCtrl控件指针
CListCtrl排序的解决办法
     int isub;        //l列号
CListCtrl排序的解决办法
     int seq;        //1为升序,0为降序
CListCtrl排序的解决办法
}
;
CListCtrl排序的解决办法
CListCtrl排序的解决办法
//次函数为非常重要函数。
CListCtrl排序的解决办法
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
CListCtrl排序的解决办法CListCtrl排序的解决办法
...{
CListCtrl排序的解决办法     MyData 
*p=(MyData *)lParamSort;
CListCtrl排序的解决办法     CListCtrl
* list =p->listctrl;
CListCtrl排序的解决办法     
int isub=p->isub;
CListCtrl排序的解决办法     LVFINDINFO findInfo; 
CListCtrl排序的解决办法     findInfo.flags 
= LVFI_PARAM; 
CListCtrl排序的解决办法     findInfo.lParam 
= lParam1; 
CListCtrl排序的解决办法     
int iItem1 = list->FindItem(&findInfo, -1); 
CListCtrl排序的解决办法     findInfo.lParam 
= lParam2; 
CListCtrl排序的解决办法     
int iItem2 = list->FindItem(&findInfo, -1); 
CListCtrl排序的解决办法     CString strItem1 
=list->GetItemText(iItem1,isub); 
CListCtrl排序的解决办法     CString strItem2 
=list->GetItemText(iItem2,isub);
CListCtrl排序的解决办法     
if(p->seq)
CListCtrl排序的解决办法          
return strcmp(strItem2, strItem1);
CListCtrl排序的解决办法     
else
CListCtrl排序的解决办法          
return -strcmp(strItem2, strItem1);
CListCtrl排序的解决办法}

 

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

 

CListCtrl排序的解决办法    SetProp(m_list.GetSafeHwnd(),"SORT_COLUMN",(HANDLE)0);
CListCtrl排序的解决办法    SetProp(m_list.GetSafeHwnd(),
"SORT_DIRECTION",(HANDLE)1);
CListCtrl排序的解决办法    
//为listctrl添加列头
CListCtrl排序的解决办法
    m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
CListCtrl排序的解决办法      m_list.InsertColumn(
0,"姓名",LVCFMT_LEFT,100);
CListCtrl排序的解决办法      m_list.InsertColumn(
1,"年龄",LVCFMT_LEFT,100);
CListCtrl排序的解决办法    m_list.InsertColumn(
2,"妻子的数目",LVCFMT_LEFT,100);
CListCtrl排序的解决办法   
//为listctrl添加三个item
CListCtrl排序的解决办法
    m_list.InsertItem(0,"陈水扁",0);    
CListCtrl排序的解决办法    m_list.SetItemText(
0,1,"66");         
CListCtrl排序的解决办法    m_list.SetItemText(
0,2,"67");    
CListCtrl排序的解决办法
CListCtrl排序的解决办法    m_list.InsertItem(
1,"游西堃",0);    
CListCtrl排序的解决办法    m_list.SetItemText(
1,1,"85");          
CListCtrl排序的解决办法    m_list.SetItemText(
1,2,"56");    
CListCtrl排序的解决办法     
CListCtrl排序的解决办法    m_list.InsertItem(
2,"布什",0);
CListCtrl排序的解决办法    m_list.SetItemText(
2,1,"77");          
CListCtrl排序的解决办法    m_list.SetItemText(
2,2,"26");
CListCtrl排序的解决办法    
CListCtrl排序的解决办法    
//下面是为每一个item设置一个 itemdata
CListCtrl排序的解决办法    
//如果要用sortItems排序,这个是必须的。但是他的值不会影响到排序
CListCtrl排序的解决办法
    m_list.SetItemData(0,(DWORD)"垃圾");     
CListCtrl排序的解决办法    m_list.SetItemData(
1,(DWORD)"白痴"); 
CListCtrl排序的解决办法    m_list.SetItemData(
2,(DWORD)"傻叉"); 

 

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

 

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

CListCtrl排序的解决办法     SetProp(m_list.GetSafeHwnd(),
"SORT_COLUMN",(HANDLE)pNMListView->iSubItem);
CListCtrl排序的解决办法     tmpp
->seq=sortasc;
CListCtrl排序的解决办法     m_list.SortItems(CompareFunc,(LPARAM)tmpp);
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法
CListCtrl排序的解决办法     
*pResult = 0;
CListCtrl排序的解决办法}

 

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

CListCtrl排序的解决办法

 

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

相关文章: