关于排序的基本用法,有一篇很好的文章:asp?type_id=9&class_id=1&cata_id=1&article_id=73&search_term">http://www.vchelp.net/vchelp/zart/sortl.asp?type_id=9&class_id=1&cata_id=1&article_id=73&search_term= 【程序编程相关:Direct3D试玩 - 实现一个Ima】
vc里的clistctrl是个很不好用的控件,特别是排序,实现起来很麻烦. 【推荐阅读:用Soap Toolkit调用WebSe】
所以,在上面的基础上,重新写了一个自身支持排序的csoftlist,从某个意义上说,也算是实现文档与视图的真正分离. 【扩展信息:DirectShow中 Filter G】
但是,在这个例子里也存在个问题:排序的实现是与数据源相关的,如果有若干个表需要排序的话,每个表都要写相应的代码,这是一件非常痛苦的事.
下面说说几个主要的地方.
1. csortlist是clistctrl的派生类 (好象是废话)
2. 要让csortlist自行排序,当然得让csortlist自己处理lvn_columnclick消息 on_notify_reflect(lvn_columnclick, onlvncolumnclick) onlvncolumnclick的作用就是设置排序列,排序方式,最后调用sortitems().
3. 排序的具体实现,也就是callback listcompare(...)的实现: 基本要求: 让csortlist根据item进行排序,而与数据源无关.(当然这样也有不足之处,就是排序只能按文本排序了.如果你需要按数字排序的话,那就只有特殊处理了.)
这里涉及到的最主要的函数是: 1)listcompare - 实现排序的回调函数 int callback csortlist::listcompare(lparam lparam1, lparam lparam2, lparam lparamsort); 2)clistctrl::finditem - 查找相应的item, 查找方式可指定 int finditem( lvfindinfo* pfindinfo, int nstart = -1 ) const; finditem的具体细节请参考msdn. 基本思路: 1)listcompare的原型:传入的参数lparam1,lparam2是相应两行的itemdata; 2)finditem根据lparam1,lparam2得到相应的item; finditem有多种查找方式(查找方式通过lvfindinfo->flags进行设置),这里只是根据itemdata进行查找. 3)再用getitemtext得到排序列的itemtext; 4)最后就是比较itemtext了. 4. 显示指明排序方式的标记 简单地说,就是给clistctrl的cheadctrl指定一个cimagelist,根据需要指定column要显示的image.... 下一页