Windows 控件自绘(基于WTL的ListViewCtrl)

来源:互联网 发布:java微信登录接口开发 编辑:程序博客网 时间:2024/05/24 15:42

Windows的控件提供了自绘的功能,有时默认的界面不能满足我们需要的时候可以对界面直接进行定制,本文简单的介绍了Windows listviewctrl的自绘原理和实现方法,着重介绍了listviewctrl Report模态,仅供抛砖引玉所用,如果有其他高见,尽管拍砖。

ListViewCtrl自绘主要依赖于几个Windows消息:

  1. WM_MEASUREITEM:定制控件子项的大小,Windows不知道我们想要绘制的项的大小,所以发这个消息来问我们一下。
  2. WM_DRAWITEM:Windows需要重绘的时候就发这个消息给我们,通知我们对自己的项进行绘制。
  3. WM_COMPAREITEM:当Windows需要对控件里面的项排序的时候,就发这个消息来问我们:谁大啊?我把它放前面了哦。
  4. WM_DELETEITEM:Windows删除项的时候给我们发这个消息。

在我们的程序里面只需要对这几个消息进行处理即可。

 

WTL的COwnerDraw类对这几个消息进行了映射处理,我们只需要覆写其中几个函数即可。

WM_MEASUREITEM 对应MeasureItem函数

WM_DRAWITEM对应DrawItem函数

WM_COMPAREITEM对应CompareItem函数

WM_DELETEITEM 对应DeleteItem函数

 

当然必须要把COwnerDraw先chain到我们的消息映射表里面。

其他的都比较简单,您可以用DrawText来测试看看是否绘制成功。

 

需要注意的地方:

  1. Listviewctrl必须添加项之后才会收到这几个消息。Report模式,比如插入列之后才会有效。
  2. 如果设置了doublebuffered模式,那么您对系统的背景绘制将无效,系统会再填充一次。
  3. 系统无效区域的时候只会对item的大小区域进行无效,所以这里可能需要特殊处理才不会出现尴尬的现象。

 

如果大家有什么问题,可以进行留言。希望能够给您帮助。

原创粉丝点击