VS2013 MFC list control空间点击表头排序
直接从代码中理解
//全局变量
int sort_column; // 记录点击的列
bool method=true; // 记录比较方法
// 比较函数
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// 从参数中提取所需比较lc的两行数据
int row1 = (int)lParam1;
int row2 = (int)lParam2;
CListCtrl* lc = (CListCtrl*)lParamSort;
CString lp1 = lc->GetItemText(row1, sort_column);
CString lp2 = lc->GetItemText(row2, sort_column);
// 比较,对不同的列,不同比较,注意记录前一次排序方向,下一次要相反排序
if (sort_column == 1)//sort_column 表示哪一列,比如这里等于1表示第2列,用CString类型
{
// 文字型比较
if (method)
return lp1.CompareNoCase(lp2);
else
return lp2.CompareNoCase(lp1);
}
else if (sort_column == 6)//第6列用double类型排序
{
// double型比较
if (method)
return _tstof(lp1) > _tstof(lp2);
else
return _tstof(lp2) > _tstof(lp1);
}
else
{
// int型比较
if (method)
return _ttoi(lp1) - _ttoi(lp2);
else
return _ttoi(lp2) - _ttoi(lp1);
}
//建议数字类型的转换为int,道理都明白,字符串是一位一位比较大小的
return 0;
}
void CZFBRankInfoDlg::OnLvnColumnclickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
sort_column = pNMLV->iSubItem;//点击的列
int count = m_list.GetItemCount();//m_list是你控件的名字
for (int i = 0; i < count; i++)
m_list.SetItemData(i, i); // 每行的比较关键字,此处为列序号(点击的列号),可以设置为其他 比较函数的第一二个参数
m_list.SortItems(MyCompareProc, (DWORD_PTR)&m_list);//排序 第二个参数是比较函数的第三个参数
method = !method;
*pResult = 0;
}
以上代码亲测可行 …
- created on Fri 2020/10/2 20:21
- lasted update on Fri 2020/10/2 22:06