CListCtrl控件可以通过SortItems函数进行按任意列进行排序,但是不像其他语言具有自带功能,需要重载或者编写相关的程序。
第一步、在MainDlg中添加List Contro空间并置属性为Report(其他属性未使用过)
第二步、添加控件
LVN_COLUMNCLICK消息响应函数
第三步、在CMaindlg.h中添加变量
CListCtrlCl m_m_listErrorInfo; //控件控制变量
BOOL m_bSortASC; //排序升序还是降序
DWORD m_dwSortColID; //指定列
BOOL m_bSortASC; //排序升序还是降序
DWORD m_dwSortColID; //指定列
static int CALLBACK SortCompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort); //排序回调函数
第四步、控件控制变量和控件绑定。
第五步、LVN_COLUMNCLICK消息响应函数如下:
void CMainDlg::OnLvnColumnclickMaindlgErrorinfolist(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if (m_dwSortColID != pNMLV->iSubItem)
{
m_dwSortColID = pNMLV->iSubItem;
m_bSortASC = FALSE;
}
m_bSortASC = !m_bSortASC;
for (int i = 0; i < m_listErrorInfo.GetItemCount(); i++)
{
m_listErrorInfo.SetItemData(i, i);
}
m_listErrorInfo.SortItems( (PFNLVCOMPARE)SortCompareFunc,(DWORD_PTR)&m_listErrorInfo);
ResetErrorInfoItemColor();
*pResult = 0;
}
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if (m_dwSortColID != pNMLV->iSubItem)
{
m_dwSortColID = pNMLV->iSubItem;
m_bSortASC = FALSE;
}
m_bSortASC = !m_bSortASC;
for (int i = 0; i < m_listErrorInfo.GetItemCount(); i++)
{
m_listErrorInfo.SetItemData(i, i);
}
m_listErrorInfo.SortItems( (PFNLVCOMPARE)SortCompareFunc,(DWORD_PTR)&m_listErrorInfo);
ResetErrorInfoItemColor();
*pResult = 0;
}
第六步、回调函数如下:
int CALLBACK CMainDlg::SortCompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort)
{
CMainDlg *pMainDlg = (CMainDlg*)::AfxGetApp()->GetMainWnd();
CListCtrlCl * pListCtrl = (CListCtrlCl*)lParamSort;
LVFINDINFO pInfo1, pInfo2;
pInfo1.flags = LVFI_PARAM;
pInfo2.flags = LVFI_PARAM;
pInfo1.lParam = lParam1;
pInfo2.lParam = lParam2;
int ind1 = pListCtrl->FindItem(&pInfo1);
int ind2 = pListCtrl->FindItem(&pInfo2);
CString strItem1 = pListCtrl->GetItemText(ind1,pMainDlg->m_dwSortColID);
CString strItem2 = pListCtrl->GetItemText(ind2,pMainDlg->m_dwSortColID);
if (pMainDlg->m_bSortASC == TRUE)
{
return lstrcmp( strItem1, strItem2 );
}
else
{
return lstrcmp( strItem2, strItem1 );
}
}
{
CMainDlg *pMainDlg = (CMainDlg*)::AfxGetApp()->GetMainWnd();
CListCtrlCl * pListCtrl = (CListCtrlCl*)lParamSort;
LVFINDINFO pInfo1, pInfo2;
pInfo1.flags = LVFI_PARAM;
pInfo2.flags = LVFI_PARAM;
pInfo1.lParam = lParam1;
pInfo2.lParam = lParam2;
int ind1 = pListCtrl->FindItem(&pInfo1);
int ind2 = pListCtrl->FindItem(&pInfo2);
CString strItem1 = pListCtrl->GetItemText(ind1,pMainDlg->m_dwSortColID);
CString strItem2 = pListCtrl->GetItemText(ind2,pMainDlg->m_dwSortColID);
if (pMainDlg->m_bSortASC == TRUE)
{
return lstrcmp( strItem1, strItem2 );
}
else
{
return lstrcmp( strItem2, strItem1 );
}
}
第七步、编译程序测试