正文

CListCtrl学习笔记(3)---中级篇(2)2007-01-03 17:44:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/22196.html

分享到:

专题2:CListCtrl中如何实现排序功能?

1.排序功能的实现需要用到下面这个函数:

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );

其中 第一个参数是回调函数的指针,后面是所要传递的参数

而回调函数一般定义如下:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
   LPARAM lParamSort);

其中lParam1是其中list的一项数据,而lparam2是另外一项,第三个参数是刚才传递过来的参数.

2.举例如下:

(1)回调函数的编写

注意回调函数必须是全局或者静态的,并且不能调用成员变量,所以要凭借最后一个参数传递某些数据.

int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{

//传递list指针
 Cmylist *list=(Cmylist*)lParamSort;

//获得指定行的索引号
 LVFINDINFO findInfo;
 findInfo.flags = LVFI_PARAM;
 findInfo.lParam = lParam1;
 int iItem1 = list->FindItem(&findInfo, -1);
 findInfo.lParam = lParam2;
 int iItem2 = list->FindItem(&findInfo, -1);

//根据指定列的索引号,得到所在项的数据
 CString strItem1 =list->GetItemText(iItem1,list->selectedField);
 CString strItem2 =list->GetItemText(iItem2,list->selectedField);

//判断是升序还是降序
  if(!list->shunxu)
  if(index==1)//判断数据类型是整型还是字符串
  return strcmp(strItem2, strItem1);
  else
  return atoi(strItem2)-atoi(strItem1);
 
 else
  if(index==1)
  return -strcmp(strItem2, strItem1);
  else
  return atoi(strItem1)-atoi(strItem2);
}

(2)调用函数的编写

如果是点击列头响应排序功能,那么请响应LVN_COLUMNCLICK:

如果是其他,例如响应菜单项:

void Cmylist::OnSheng()
{
 // TODO: Add your command handler code here
 shunxu=TRUE;
 SortItems(CompareFunc,(LPARAM)this);
}

void Cmylist::OnJiang()
{
 // TODO: Add your command handler code here
 shunxu=FALSE;
 SortItems(CompareFunc,(LPARAM)this);
}

即可完成排序功能!!!

阅读(3522) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册