listcontrol排序的實現

轉自:http://blog.csdn.net/wlq5800/article/details/6090028


先在.cpp文件的上面定義幾個全局變量
BOOL m_bAsc1;//是否順序排序
int m_nSortedCol1;//當前排序的列
static int CALLBACK SortLVProc1(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);排序函數

static int CALLBACK SortLVProc1(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
   CListCtrl *pList=(CListCtrl*)lParamSort;
int nItem1,nItem2;
LVFINDINFO FindInfo;
FindInfo.flags=LVFI_PARAM;
FindInfo.lParam=lParam1;
nItem1=pList->FindItem(&FindInfo,-1);
FindInfo.lParam=lParam2;
nItem2=pList->FindItem(&FindInfo,-1);
if((nItem1==-1)||(nItem2==-1))
{
   return 0;
}
CString str1,str2;
str1=pList->GetItemText(nItem1,m_nSortedCol1);
str2=pList->GetItemText(nItem2,m_nSortedCol1);
HDITEM headerItem;
headerItem.mask = HDI_LPARAM;
CHeaderCtrl* pHeaderCtrl = pList->GetHeaderCtrl( );
pHeaderCtrl->GetItem( m_nSortedCol1, &headerItem );
UINT nType = (UINT)(headerItem.lParam);
int iCompRes = 0;
switch( nType )
{
case INT_TYPE:
   {
    int i1,i2;
    i1 = atoi( str1 );
    i2 = atoi( str2 );
    if( i1 > i2)
     iCompRes = 1;
    else if( i1 == i2 )
     iCompRes = 0;
    else
     iCompRes = -1;
   }
   break;
case DOUBLE_TYPE:
   {
    double i1,i2;
    i1 = atof( str1 );
    i2 = atof( str2 );
    if( i1 > i2)
     iCompRes = 1;
    else if( i1 == i2 )
     iCompRes = 0;
    else
     iCompRes = -1;
   }
   break;
case STRING_TYPE:
default:
   {
    if( str1 > str2)
     iCompRes = 1;
    else if( str1 == str2 )
     iCompRes = 0;
    else
     iCompRes = -1;
   }
   break;
}
if(m_bAsc1)
  return iCompRes;
else
   return iCompRes*-1;
return 0;
}
這個排序函數的有點在於他對要排序的變量包括的很全,有int ,cstring,double型的,這是在.h文件的函數體外定義的:enum { INT_TYPE = 0, STRING_TYPE, DOUBLE_TYPE };
最後加一個單擊表頭的消息響應函數 ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1)
void CGAMEFAST::OnLvnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

if(pNMListView->iSubItem==m_nSortedCol1)
      m_bAsc1=!m_bAsc1;
else
{
    m_bAsc1=true;
    m_nSortedCol1=pNMListView->iSubItem;
}

int    i=m_MyList.GetItemCount();                //   這兩句函數是關鍵哦。。。。
    while(i--)m_MyList.SetItemData(i,i);  

m_MyList.SortItems(SortLVProc1,(DWORD)&m_MyList);
*pResult = 0;

}
把控件變量名改成你的控件變量就可以了!上面標着關鍵的那兩句就是關鍵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章