#define LIST_DVS_NVSNAME_COL 0 //CListCtrl列表的第1项
#define LIST_DVS_CHANNEL_COL 1 //CListCtrl列表的第2项
#define LIST_DVS_IP_COL 3 //CListCtrl列表的第4项
static int m_Sorted = 0 ;//排列序号
static bool m_Asc = true;//排列方式
1 为CListCtrl控件添加消息:ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_DVS, OnColumnclickListDvs)
2 在void CSearchDVSDlg::OnColumnclickListDvs(NMHDR* pNMHDR, LRESULT* pResult) 这个函数中进行实现,如:
void CSearchDVSDlg::OnColumnclickListDvs(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
for ( int i = 0; i < m_ListDVS.GetItemCount(); ++i)
{
m_ListDVS.SetItemData(i, i);
}
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // 获取一项值
if (pNMListView->iSubItem==m_Sorted)
{
m_Asc = !m_Asc;
}
m_Sorted=pNMListView->iSubItem;
m_ListDVS.SortItems(CompareFunc,(LPARAM)&m_ListDVS); // 排序函数 只能为类的静态成员函数或者是全局函数
// 刷新NVS的(添加)状态
// RefreshListDVSItemData();
*pResult = 0;
}
3排序函数:int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
4 排序函数的实现:
// 如果排序函数返回值 >0 升序排序, <0 降序排序, =0则不排序
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
if( m_Sorted < 0 )//排列序号
return 0 ;
//通过传递的参数来得到CSortList对象指针,从而得到排序方式
CListCtrl * pV=(CListCtrl *)lParamSort;
//通过ItemData来确定数据
CString szComp1,szComp2;
int iCompRes,iCompRes2=0;
szComp1=pV->GetItemText(lParam1,m_Sorted);
szComp2=pV->GetItemText(lParam2,m_Sorted);
if(m_Sorted==LIST_DVS_IP_COL)
{
unsigned long Ip1 = ntohl(inet_addr(szComp1)) ;
unsigned long Ip2 = ntohl(inet_addr(szComp2)) ;
if(Ip1 == Ip2)
iCompRes = 0;
if(Ip1 < Ip2)
iCompRes = -1;
if(Ip1 > Ip2)
iCompRes = 1;
}
else
{
iCompRes=szComp1.Compare(szComp2);
if(iCompRes==0 )
{
if(m_Sorted==LIST_DVS_NVSNAME_COL || m_Sorted==LIST_DVS_CHANNEL_COL)
{
szComp1=pV->GetItemText(lParam1,LIST_DVS_IP_COL);
szComp2=pV->GetItemText(lParam2,LIST_DVS_IP_COL);
unsigned long Ip1 = ntohl(inet_addr(szComp1)) ;
unsigned long Ip2 = ntohl(inet_addr(szComp2)) ;
if(Ip1 == Ip2)
iCompRes2 = 0;
if(Ip1 < Ip2)
iCompRes2 = -1;
if(Ip1 > Ip2)
iCompRes2 = 1;
}
}
}
if(iCompRes2!=0) // 复合比较
return iCompRes2;
if( m_Asc ) //对设备的ip进行排序,是升序排序还是降序排序
return iCompRes;
else
return -iCompRes;
}