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