CtrlList 排序问题。

点击列标题进行排序。

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以实现点一次换一种排序法。
}

你可能感兴趣的:(list)