CListCtrl排序的解决办法

这两天写了一个程序,用到了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;
}

 

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

CListCtrl排序的解决办法_第1张图片

 

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

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

你可能感兴趣的:(ListView,list,report,文档,exe,dialog)