开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 36356|回复: 149
收起左侧

[易语言纯源码] 真正完美修改超级列表框的行高

[复制链接]
结帖率:59% (13/22)
发表于 2014-11-25 12:50:11 | 显示全部楼层 |阅读模式   江苏省淮安市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 brucelee0720 于 2014-11-25 13:06 编辑

在百度搜索修改超级列表框(SysListView32)的行高的方法,可以得到很多结果。不过都是千篇一律的。无论是修改字体还是设置图片组,本质都是一样的,通过撑开的方法调整行的高度。

今天这里介绍的方法,与之上不同,是真正修改超列的行高度。

要想修改行高,需要考虑的第一个问题,就是超列中有没有行高这个属性,以及如何修改他。答案确实是有的,这个值通过WM_MEASUREITEM消息设置。从字面可以理解,这是一个测量项目的消息。消息的lParam参数是一个MEASUREITEMSTRUCT结构。这个结构中包含了控件的ID,项目的索引,项目的宽高等成员。对于超列,他的有效成员只有控件的ID和项目的高度成员。只要在子类化过程中修改这个成员的值就可以达到真正改变行高的目的。
typedef struct MEASUREITEMSTRUCT {
  UINT      CtlType;
  UINT      CtlID;
  UINT      itemID;
  UINT      itemWidth;
  UINT      itemHeight;
  ULONG_PTR itemData;
} MEASUREITEMSTRUCT


有了上边这个消息的介绍,似乎一切都变的简单了,但是事实并非如此,如果直接SEND这个消息给窗口是木有什么效果的,事实上这个消息是超列控件通知给父窗口的。我们要考虑的第二个问题来了,如何让超列发送这个消息给他的父窗口呢?在MSDN关于WM_MEASUREITEM消息的说明中找到如下内容:
The system sends the WM_MEASUREITEM message to the owner window of combo boxes and list boxes created with the OWNERDRAWFIXED style before sending the WM_INITDIALOG message.

大概的意思就是:系统为使用OWNERDRAWFIXED 风格创建的组合框和列表框的父窗口发送WM_MEASUREITEM 消息,还有就是,这个消息是在WM_INITDLALOG消息之前发送的。

看来要处理WM_MEASUREITEM 消息,我们要做两件事:1、为超列增加OWNERDRAWFIXED 风格。2、在WM_INITDLALOG之前处理。
先来看看OWNERDRAWFIXED风格。他在超列中对应的常量名是LVS_OWNERDRAWFIXED。这个解决起来比较简单,我们只需要调用SetWindowLong这个API设置超列的GWL_STYLE,就可以为超列增加这个风格。

第二个问题就变的有些棘手,因为这个消息是在窗口创建后就触发的,所以除非我们自己创建一个超列控件,不然即便修改了超列,也还是得不到这个WM_MEASUREITEM 消息。到了这里似乎事情变的要无解了!不过办法总是会有的,既然WM_MEASUREITEM 是一个用来核算尺寸的消息,那么如果控件的字体或则尺寸被改变的话自然应该会触发这个消息。事实印证这个方法是可行的。我们可以通过修改一下超列的宽度属性,或者直接伪造一个WM_WINDOWPOSCHANGED消息,就可以在父窗口中收到WM_MEASUREITEM 消息了。

经过上边的一番折腾,终于得到了WM_MEASUREITEM 消息,修改了itemHeight成员的值后,超列的行高就被改变了。可是问题还没有完。这个时候,超列的行高虽然改变了,但是表项里的内容却不显示了。这个问题的原因是由于我们为超列增加了OWNERDRAWFIXED风格导致的。这个风格的作用是是否使用自绘,如果选择了这个风格,那么就表示你要自己把表项中的那些文本啊图标啊之类的内容自己画上去。单纯为了修改一个行高,这个代价太大了。先别怕,解决的办法很简单,反正这个时候,WM_MEASUREITEM 已经执行过了,超列中行高值已经被修改成功,如果不是需要再次修改行高的话,我们已经不在需要WM_MEASUREITEM 消息了,所以我们只要把LVS_OWNERDRAWFIXED风格从超列中移除就可以了。

执行完上面这些步骤后,超列的行高就被完美修改了。
最后的收尾工作:如果在调整窗口尺寸的时候,使用伪造WM_WINDOWPOSCHANGED消息的方法的话,这个时候滚动条的显示是没有变化的。需要在发送一个LVM_UPDATE消息给超列。这样整个的修改过程就全部完成了。

欢迎下载: 超列行高.zip (49.27 KB, 下载次数: 2178)

点评

大佬 有没有办法换行呀   河南省焦作市  发表于 2021-6-29 23:52

评分

参与人数 3好评 +2 精币 +8 收起 理由
xmw666 + 4 感谢分享,很给力!~
兵者 + 1 + 1 奉上小小红包希望笑纳
冰点 + 1 + 3 感谢分享,很给力!~

查看全部评分


本帖被以下淘专辑推荐:

  • · 鱼木|主题: 1546, 订阅: 152
  • · 老琛|主题: 36, 订阅: 1
结帖率:78% (73/93)

签到天数: 24 天

发表于 2024-4-21 19:54:19 | 显示全部楼层   贵州省遵义市

学习一下
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)
发表于 2023-8-4 22:19:48 | 显示全部楼层   广东省中山市
有点吊吊的,确实可行
回复 支持 反对

使用道具 举报

发表于 2023-4-25 12:53:15 | 显示全部楼层   河南省焦作市
好像很好啊
回复 支持 反对

使用道具 举报

发表于 2023-3-21 17:09:20 | 显示全部楼层   福建省福州市
好像很好啊
回复 支持 反对

使用道具 举报

结帖率:100% (13/13)

签到天数: 18 天

发表于 2023-3-12 10:49:12 | 显示全部楼层   浙江省金华市
正好需要,感谢!
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)
发表于 2023-3-6 11:44:01 | 显示全部楼层   广东省江门市
谢谢谢谢谢谢谢谢谢谢...
回复 支持 反对

使用道具 举报

发表于 2022-10-25 11:40:14 | 显示全部楼层   广西壮族自治区河池市
谢谢谢谢谢谢谢谢谢谢谢谢
回复 支持 反对

使用道具 举报

结帖率:67% (4/6)
发表于 2022-8-18 00:33:30 | 显示全部楼层   广东省东莞市
回复 支持 反对

使用道具 举报

发表于 2022-7-4 23:35:07 | 显示全部楼层   北京市北京市
优秀,点赞
回复 支持 反对

使用道具 举报

结帖率:43% (6/14)
发表于 2022-4-26 21:01:09 | 显示全部楼层   天津市天津市
学习一下学习一下学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表