您的位置:首页 > 其它

CListCtrl 实现排序功能(数字和字母)

2014-12-22 15:04 323 查看
通过CListCtrl显示全部的进程信息,并且点击CListCtrl控件的头按钮 会进行升序或是降序进程排序。



一、其中 CListCtrl控件的排序有几个要点这里列出来:

1.

BOOL CListCtrl::SortItems(
PFNLVCOMPARE pfnCompare,
DWORD dwData);

其中第一个参数为全局排序函数(它就是回调函数)的地址,

第二个参数为用户数据,你可以根据你的需要传递一个数据或是指针。

该函数返回-1,代表第一项排应在第二项前面;

返回1代表第一项排应在第二项后面;

返回0代表两项相等

2.回调函数

int CALLBACK ListCompare(LPARAM
lParam1, LPARAM lParam2, LPARAM lParamSort);

其中第三个参数为调用者传递的数据(即调用SortItems时的第二个参数dwData)。

第一和第二个参数为用于比较的两项的ItemData,你可以通过DWORD
CListCtrl::GetItemData(
int nItem )/

BOOL CListCtrl::SetItemData(
int nItem, DWORD dwData )来对每一项的ItemData进行存取。

注意:回调函数只能为全局函数或是静态类成员函数

3.响应LVN_COLUMNCLICK事件,当单击控件头按钮时触发

二、正确代码:

以下代码可以实现CListCtrl控件的升序/降序并且分字符串和数字进行排序。

1.结构体和回调函数

struct SortData
{
CListCtrl *listctrl;                 //CListCtrl控件指针
int isub;        //列号
int isAsc;        //1为升序,0为降序
};

//回调函数
int static CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
SortData *paramSort=(SortData *)lParamSort;
CListCtrl* list =paramSort->listctrl;
int isub=paramSort->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);

//将CString转换成char*
wchar_t *chItem1,*chItem2;
chItem1=(LPWSTR)strItem1.GetBuffer(strItem1.GetLength());
chItem2=(LPWSTR)strItem2.GetBuffer(strItem2.GetLength());

//判断字符串是否都是数字
int count=0;
for(int i=0;i<strItem1.GetLength();i++)
{
if(!isdigit(chItem1[i]))
{
count++;
}
}
//分情况进行比较
if(count<=1)
{
int intItem1 =_ttol(chItem1);
int intItem2 = _ttol(chItem2);
int sum =(intItem1>=intItem2 ? -1:1);
if(paramSort->isAsc)
return sum;
else
return -sum;
}else
{
if(paramSort->isAsc)
return strItem1.CompareNoCase(strItem2);
else
return strItem2.CompareNoCase(strItem1);
}
}


2//响应LVN_COLUMNCLICK事件

void CProp_Process::OnColumnclickListProcess(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
SortData *paramSort=new SortData;
paramSort->listctrl=&m_ListCtrl; //m_ListCtrl 为CListCtrl控件的关联变量
paramSort->isub=pNMListView->iSubItem;
int sortNum=(int)GetProp(m_ListCtrl.GetSafeHwnd(),_T("SORT_COLUMN"));
int sortAsc=(int)GetProp(m_ListCtrl.GetSafeHwnd(),_T("SORT_DIRECTION"));
if(sortNum==pNMListView->iSubItem){
sortAsc=(sortAsc+1)%2;
SetProp(m_ListCtrl.GetSafeHwnd(),_T("SORT_DIRECTION"),(HANDLE)sortAsc);
}
SetProp(m_ListCtrl.GetSafeHwnd(),_T("SORT_COLUMN"),(HANDLE)pNMListView->iSubItem);
paramSort->isAsc=sortAsc;
m_ListCtrl.SortItems(CompareFunc,(LPARAM)paramSort);

*pResult = 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐