使用MFC的CListCtrl的排序功能

来源:互联网 发布:洛枫网络软件公司 编辑:程序博客网 时间:2024/05/01 00:34

CListCtrl控件的表头可以当作按钮来使用,当鼠标点击表头时,会向父窗口发送一个LNV_COLUMNCLICK消息,在重绘的CMyListCtrl类或者IDC_LIST控件中响应对应的LNV_COLUMNCLICK消息,就可以对列表进行排序了。

其函数使用方法见程序,其中SubItem为排序的表列索引号,MyCompareProc()为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItems属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。

// 排序用的比较函数

static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
  CString &lp1 = *((CString *)lParam1);
  CString &lp2 = *((CString *)lParam2);
  int &sort = *(int *)lParamSort;
  if (sort == 0)
  {
  return lp1.CompareNoCase(lp2);
  }
  else
  {
  return lp2.CompareNoCase(lp1);
  }
}
//要处理的事件
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CDlg::OnLvnColumnclickList1)
//处理代码 
void CDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  int Length = m_ListCtrl.GetItemCount();
  CArray<CString,CString> ItemData;
  ItemData.SetSize(Length);
  for (int i = 0; i < Length; i++)
  {
  ItemData[i] = m_ListCtrl.GetItemText(i,pNMLV->iSubItem);
  m_ListCtrl.SetItemData(i,(DWORD_PTR)&ItemData[i]);//设置排序关键字
  }
  static int sort = 0;
  static int SubItem = 0;
  if (SubItem != pNMLV->iSubItem)
  {
  sort = 0;
  SubItem = pNMLV->iSubItem;
  }
  else
  {
  if (sort == 0)
  {
  sort = 1;
  }
  else
  {
  sort = 0;
  }
  }
  m_ListCtrl.SortItems(MyCompareProc,(DWORD_PTR)&sort);//排序
  *pResult = 0;
}

0 0