CListCtrl行高的修改

/ 0评 / 0

Published by orzz.org(). (https://orzz.org/clistctrl%e8%a1%8c%e9%ab%98%e7%9a%84%e4%bf%ae%e6%94%b9/)

网上修改CListCtrl项高度的方法一般是扩大字体,及用图片将项高度撑大.

这两种方法虽然简单,但是效果却不是很理想.一种比较理想的方法是完全自画"CListCtrl",不过方法相对来说比较复杂,需要自己从头建立ListCtrl的各种业务逻辑和接口.下面简要介绍一下使用CListCtrl本身的接口实现修改CListCtrl行高的方法.

要修改CListCtrl的列表项高度,我们需要自己添加 MeasureItem 的消息响应函数,对应的消息是 WM_MEASUREITEM+WM_REFLECT_BASE, 而不是 WM_MEASUREITEM.在CListBox里我们可以直接在 ClassWizard 里将此消息响应添加进 class 里,但是 CListCtrl 默认是没有这个消息响应的,我们需要手动添加它(注意,这里不是 WM_MEASUREITEM. CListCtrl 仅有 WM_MEASUREITEM, 对应的函数为 OnMeasureItem).

为了响应这个消息,我们还需要给列表加上 LVS_OWNERDRAWFIXED 风格.可以在 Create 列表的时候添加,也可以在 PreCreateWindow 虚函数中添加.

添加 MeasureItem 消息响应函数,首先我们需要在类的头文件中添加:

来声明此消息响应函数;然后在cpp的消息响应宏中添加:

最后自己建立 MeasureItem 的函数定义:

其中 m_nItemHeight 是我在头文件中声明的一个成员变量,用于从外部修改列表项高度.下面我们添加一个方法,便于从外部直接修改列表项高度:

然后是该方法的定义:

这个方法的最后,使用了 SendMessage 发送 WM_WINDOWPOSCHANGED 消息让 CListCtrl 进入 MeasureItem 的消息响应函数,对列表高度进行修改.

因为我们这里使用了列表的自绘风格,因此列表项需要自己绘制.

首先在类的声明中添加 DrawItem 虚函数声明:

然后自画 CListCtrl:

现在这个 CListCtrl 的重载类就支持自定义列表项高度了.

Published by orzz.org(). (https://orzz.org/clistctrl%e8%a1%8c%e9%ab%98%e7%9a%84%e4%bf%ae%e6%94%b9/)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据