點擊欄位標題進行排序。
1,定義兩個變數:
BOOL m_iSortFlag; //用來指示本次排序是升序還是降序
int m_iSort;//排序依據的列號
2,為CtrlList添加事件:
void CCardManageDlg::OnColumnclickWareTable(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
m_iSort = pNMListView->iSubItem;
for(int i = 0;i < m_waretable.GetItemCount();i++)
{
m_waretable.SetItemData(i,i);//為所有行設定一個序號,排序的依據。
}
m_iSortFlag > 0 ? m_iSortFlag=-1 : m_iSortFlag=1;// 確定升降序
m_waretable.SortItems((PFNLVCOMPARE)CompareFunc,(LPARAM)this);//發送排序資訊給排序函數。
*pResult = 0;
}
3,實現排序函數,此函數的功能是比較兩行的大小,這裡比較字串的大小:
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
CListCtrl* pListCtrl = &(((CCardManageDlg*)lParamSort)->m_waretable);
CString strItem1 = pListCtrl->GetItemText(lParam1,((CCardManageDlg*)lParamSort)->m_iSort);
CString strItem2 = pListCtrl->GetItemText(lParam2,((CCardManageDlg*)lParamSort)->m_iSort);
TRACE("lParam1=%d %s compare with lParam2 = %d %s \n",lParam1,strItem1,lParam2,strItem2);
return strcmp(strItem2,strItem1)*((CCardManageDlg*)lParamSort)->m_iSortFlag;//乘以iSortFlag以實現點一次換一種排序法。
}