dodo's blog

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  3 Posts :: 0 Stories :: 18 Comments :: 0 Trackbacks

常用链接

留言簿(10)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

一直想做个QQ那样的好友列表,即选中某项后可以放大显示。如果用Windows的ListView,主要要解决一个动态设置列表项高度的问题,但我翻遍了MSDN也没有找到解决方法,网上找的有3种方法设置listview列表项高度:

1.设置字体,把列表项撑起来。
2.设置图片,也是把列表项撑起来。
3.响应WM_MEASUREITEM,但这个消息只在列表被创建时发生一次。

以上方法都只能设置所有列表项的高度,不能为不同列表项单独设置不同的高度。我查了各种资料,似乎只有一种方法:从CreateWindow开始重新做一个,研究了下QQ的实现方式,也是如此。

但是在我准备从头写的时候还是想到了一个用ListView实现的办法,那就是把两行并为一行。几经周折,终于通过从CListCtrl派生一个类实现了大致的效果:



加入了头像的好友列表:



原理就是在用户单击某行后,在此行下面插入一个新行,用自绘把这两行画成1行,当选中其他行时再把此行删除。具体方法为:

1.插入一个CListCtrl控件,把它的风格设为Report,Single Selection,No Column Header,Owner Draw Fixed。

2.从CListCtrl派生一个类,响应WM_MEASUREITEM或用一个图片设置所有列表项的高度,本例中为22。

3.准备3张图片,分别为选中列表项的上半部、下半部和没有选中的列表项背景。

4.响应WM_LBUTTONDOWN,在消息处理函数中完成列表项的插入和删除操作。需要注意的是改变选中项时在上次选中项的上面插入和下面插入的情况是不同的,要分别考虑。

5.重载DrawItem(不是OnDrawItem),根据当前选中项的状态进行绘制。这里比较麻烦的是DrawItem在WM_LBUTTONDOWN时就会触发,而列表选中项在鼠标弹起时才会改变,所以在WM_LBUTTONDOWN消息处理函数中就要根据情况提前设置好选中的列表项。

至于QQ的好友分组,用TreeView应该也能实现这种效果,可能比用ListView还简单,直接把选中项跟他的子叶画成一行就行了。

下面为VC6下的例程:
http://www.cppblog.com/Files/getborn/ListExample.rar

下面为列表类:
http://www.cppblog.com/Files/getborn/class%20CFriendList.rar
posted on 2008-05-27 13:57 多多 阅读(8221) 评论(15)  编辑 收藏 引用

Feedback

# re: 用ListView/CListCtrl实现QQ风格的好友列表[未登录] 2008-05-28 10:26 hellfire
可以去codeproject搜索一下reportctrl, 这个类的功能要强悍很多  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2008-05-28 16:07 盛大推广员
太漂亮了。学习了  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2008-05-29 08:48 werw
最新的谷歌词霸也用到了这种类型控件  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2008-05-29 12:04 albee
这个博客MS不错,以后会常来看看  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2008-07-16 17:20 dc
不知道有没有c#版的哦。  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2009-02-23 21:07 odod
牛B  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2009-03-31 09:06 虚拟主机
强人啊  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2010-01-08 19:08 XIAO蒙
加我QQ719977933 教我实现下QQ头像风格 我查找很长时间都没找到办法   回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2010-08-01 19:06 虚拟主机
品牌主机网提供万网,新网等品牌主机商业务。  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2010-08-28 14:28 ddd
谢谢贡献.终于找到点靠谱的了.  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2011-10-16 20:55 游客
好像有问题  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2013-05-09 12:47 观看
终于找到有用的东西了,非常感谢  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2013-07-12 09:39 传修
很不错的东西  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2014-09-12 10:37 liulang186
点中一行。。我只是想把这一行的高度改变,里面的字符不变 而且还要垂直居中 如何实现  回复  更多评论
  

# re: 用ListView/CListCtrl实现QQ风格的好友列表 2014-09-21 15:21 多多
很多年前的东西了,现在建议直接自己画一个列表,就是类似DirectUI的方式。@liulang186
  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理