List控件排序,别处看到的,记下来

先在.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;

}

 

 


把控件变量名改成你的控件变量就可以了!上面标着关键的那两句就是关键

posted @ 2013-12-25 09:22  风刮过冷  阅读(325)  评论(0编辑  收藏  举报