实现CListctrl自动排序

1、在对话框(CStatusDlg)中放入CListCtrl控件,并为其添加变量_listCtrl
   设置控件风格为report
2、在初始化对框框中初始化CListCtrl控件
BOOL CStatusDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
           //这里注意后面多加了一个空格,方便直接添加排序的图标
_listCtrl.InsertColumn(0, _T("模拟设备号 "), LVCFMT_LEFT, 180);
_listCtrl.InsertColumn(1, _T("发包总数 "), LVCFMT_LEFT, 180);
_listCtrl.InsertColumn(2, _T("发包总耗时(S) "), LVCFMT_LEFT, 180);

_listCtrl.InsertColumn(3, _T("每秒发包数量 "), LVCFMT_LEFT, 180);


DWORD dwStyle = _listCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;
dwStyle |= LVS_EX_GRIDLINES;
dwStyle |= LVS_EX_SINGLEROW;
_listCtrl.SetExtendedStyle(dwStyle);
return TRUE;
}
3、响应点击控件Column的消息
struct DATA
{
bool fav;
int subitem;// 点击表头的列数  
CListCtrl* plist; //listctrl的指针  
};
void CStatusDlg::OnLvnColumnclickList2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);




for (int i = 0; i < _listCtrl.GetItemCount(); ++i) //这个for用来给表中的项添加上索引号  
{
_listCtrl.SetItemData(i, i);
}
_listData.fav = !_listData.fav;
_listData.subitem = pNMLV->iSubItem; 

_listData.plist = &_listCtrl;
_listCtrl.SortItems(listCompare, (LPARAM)&_listData);

LVCOLUMN Vol; 
CString csStr("");
TCHAR szCol[MAX_PATH];

//_listCtrl.GetHeaderCtrl()->GetItemCount()
for (int i = 0; i < 4; i++)
{
Vol.pszText = szCol;
Vol.mask = LVCF_TEXT;
Vol.cchTextMax = sizeof(szCol);
_listCtrl.GetColumn(pNMLV->iSubItem, &Vol); //这里是得到列头上的字符串  
csStr = CString(Vol.pszText, wcslen(Vol.pszText) - 1);
if (i == pNMLV->iSubItem)
{
if (_listData.fav)
csStr = csStr + L"▲";
else
csStr = csStr + L"▼";
}
else
csStr = csStr + L" ";


Vol.pszText = csStr.GetBuffer();
_listCtrl.SetColumn(i, &Vol);
}
*pResult = 0;
}


4、添加排序函数
int CALLBACK listCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
DATA* pListCtrl = (DATA*)lParamSort;
int col = pListCtrl->subitem;//点击的列项传递给col,用来判断点击了第几列  
CString strItem1 = (pListCtrl->plist)->GetItemText(lParam1, col);
CString strItem2 = (pListCtrl->plist)->GetItemText(lParam2, col);
switch (col)
{
case 0: //字符串比较
{
if (pListCtrl->fav)
return _tcscmp(strItem1.GetBuffer(MAX_PATH), strItem2.GetBuffer(MAX_PATH));
else
return _tcscmp(strItem2.GetBuffer(MAX_PATH), strItem1.GetBuffer(MAX_PATH));
break;
}
case 1:
case 2:
case 3://double比较 
{
//将字符串转为double型比较  
double n1 = _wtof_l(strItem1, 0);
double n2 = _wtof_l(strItem2, 0);
if (pListCtrl->fav)
{  
if (n1 < n2)
return -1;
else
return 1;
break;
}
else
{
if (n1 < n2)
return 1;
else
return -1;
break;
}
}
}
}

猜你喜欢

转载自blog.csdn.net/qianpeng4/article/details/80416296
今日推荐