精易论坛

标题: 真正完美修改超级列表框的行高 [打印本页]

作者: brucelee0720    时间: 2014-11-25 12:50
标题: 真正完美修改超级列表框的行高
本帖最后由 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消息给超列。这样整个的修改过程就全部完成了。

欢迎下载:[hide=d365] 超列行高.zip (49.27 KB, 下载次数: 2213) [/hide]
作者: 拉勾勾    时间: 2014-11-25 12:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 晓月Am    时间: 2014-11-25 12:57
信息量好大
作者: sos521    时间: 2014-11-25 13:09
好强大的帖子表示没看很懂  学习中...

作者: 陈兴华    时间: 2014-11-25 14:15
了不起,一个更比一个了不起

作者: MyEc    时间: 2014-11-25 14:23
我看看      

作者: 千年的等待    时间: 2014-11-25 17:55
确实有点给力哈
作者: 1686331335    时间: 2014-11-25 17:58
感谢楼主分享

作者: 岩途    时间: 2014-11-25 18:25
打那么多字挺累的
作者: niming    时间: 2014-11-25 18:51
确实有点给力哈
作者: 土豆萌萌哒    时间: 2014-11-25 19:39
感谢分享,很给力!~
作者: 兔八哥    时间: 2014-11-25 19:45
有例子吗{:soso_e129:}

作者: 腾龙跃然    时间: 2014-11-25 19:46

作者: bill3k    时间: 2014-11-25 21:26
朋友还可以改超级列表框的 边框颜色 和粗细吗
作者: 灰灰君    时间: 2014-11-25 23:15
非常详细的解说,很少见的精品贴,赞!
作者: 花花°    时间: 2014-11-26 00:44
蟹蟹楼主啊!

作者: geven1    时间: 2014-11-26 11:29
这是 调整外观的软件吧

作者: 非典男人    时间: 2014-11-26 15:12
没啥说的先顶在下!!!!!!!!!!

作者: 淑名夏凛月    时间: 2014-11-26 16:07
非常详细的解说,很少见的精品贴,赞!
作者: maxthon    时间: 2014-11-26 21:05
支持一下,写得很详细
作者: Violation    时间: 2014-11-27 13:36
感谢分享,很给力!~
作者: 1320407858    时间: 2014-11-27 21:29
............................
作者: 我会让你抓狂    时间: 2014-12-1 16:27
好东西!!!!!!

作者: 挥别凡尘    时间: 2014-12-1 19:42
学习学习!
!!!
作者: 逍遥紫枫    时间: 2014-12-2 00:32
支持楼主,感谢分享.回复查看!!...
作者: 宇智波·佐助    时间: 2014-12-3 23:03
aPI弄的?      
作者: 山药    时间: 2014-12-4 19:53
支持啊,感觉很不错
作者: 完美无泪    时间: 2014-12-9 23:56
值得学习的哦   学习
作者: wjswzj0    时间: 2014-12-16 10:36
值得学习的哦 昀恛
作者: mengyouwudila    时间: 2015-1-18 21:16
好东西 必须拿走
作者: zhuifengke3088    时间: 2015-1-27 01:20
下了,顶,好帖子一定顶起来
作者: csdym    时间: 2015-3-16 16:17
很强悍的修改方法,高手
作者: 瓶中仙子    时间: 2015-3-17 09:35
正在找,好下个
作者: 梦影幽龙    时间: 2015-11-11 21:12
回复下载。。学习学习
作者: woshunfa    时间: 2015-11-24 22:51
感谢分享学习学习
作者: zhangyibin8111    时间: 2016-1-21 17:03
本帖最后由 zhangyibin8111 于 2016-1-21 17:04 编辑

▼ 只♡
 ▼ 想♡
  ▼ 为♡
   ▼ 楼♡
    ▼ 主♡
     ▼ 留♡
      ▼ 一♡
♡—————————次——▪▪►♥
      ▲ 霸♡
     ▲ 气♡
    ▲ 的♡
   ▲ 十♡
  ▲ 五♡
 ▲ 字♡
▲ 。♡

作者: gto250    时间: 2016-4-3 22:26
提个小小的建议,可以修改每个行为不同的高度吗?
作者: 沫茗    时间: 2016-5-26 00:01
好东西,拿走了,之前下载的丢了!
作者: dawei2066    时间: 2016-7-1 17:14
感谢分享学习
作者: a89300952    时间: 2016-7-23 16:52
来膜拜大神啊
作者: jd501    时间: 2016-8-2 17:02
感谢楼主的无私奉献,小弟膜拜
作者: ﹏最后的拥抱へ    时间: 2016-8-29 17:12
来膜拜大神啊
作者: 向阳花    时间: 2016-9-22 01:08

作者: 18969716691    时间: 2016-10-27 09:52
找你很久了
作者: liangshenda    时间: 2016-11-27 19:48
谢谢,正需要,神码源码。
作者: 992377193    时间: 2016-12-2 08:41
与之上不同,是真正修改超列的行高度。
作者: zjwaian    时间: 2016-12-10 20:01
感谢楼主分享。
作者: 小小小小鸟啊    时间: 2016-12-15 12:53
大牛太给力了!!!
作者: weijun590    时间: 2017-1-11 16:32
谢谢分享,正需要..
作者: zhouchihua1    时间: 2017-1-18 08:29
感谢楼主,一直在找这个
作者: 374237370    时间: 2017-2-6 12:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 154215395    时间: 2017-2-10 20:49
瞎子啊来学习了 谢谢
作者: zhuyuan520    时间: 2017-2-17 08:36
下来学习一下,谢谢
作者: malin158    时间: 2017-2-20 20:44
374237370 发表于 2017-2-6 12:15
有没有超列置列宽的

自带属性就有
作者: 374237370    时间: 2017-2-20 21:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: malin158    时间: 2017-2-22 01:29
374237370 发表于 2017-2-20 21:56
行高呢

行高看楼主
作者: 374237370    时间: 2017-2-22 01:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: oursn    时间: 2017-3-17 18:31
谢谢 看上去好复杂
作者: 我本善良    时间: 2017-4-26 17:25
支持了               
作者: cvenshry    时间: 2017-6-3 09:36
66666666666666
作者: 慕尚网    时间: 2017-6-29 18:26
感谢分享。。
作者: ILJX    时间: 2017-8-12 13:50
感谢楼主分享
作者: a964747046    时间: 2017-8-14 19:07
感谢楼主分享

作者: nekoparapoi    时间: 2017-8-24 16:14
谢谢谢
作者: f236964158    时间: 2017-9-14 11:19
分析的很细致,很透彻
作者: mzwe    时间: 2017-9-21 14:07
谢谢分享谢谢分享谢谢分享
作者: q313971654    时间: 2017-10-3 00:09
小白表示头已炸裂
作者: 兰色的夜晚    时间: 2017-10-19 23:13
谢谢 正在找这个东西//
作者: nantian    时间: 2017-12-8 15:38
6666666666666666666
作者: 王者祝福    时间: 2017-12-17 08:09
4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}4_261:}
作者: 18682722999    时间: 2017-12-30 13:26
正需要,学习一下
作者: dashang    时间: 2018-1-4 01:25
支持开源@1学些了..
作者: 依灵宝贝0227    时间: 2018-1-5 16:39
谢谢 正在找这个东西//
作者: ocxo    时间: 2018-1-26 18:24
表头行高怎么改
作者: 兰色的夜晚    时间: 2018-2-24 09:43
认真学习  天天向上
作者: 178826559    时间: 2018-2-24 16:28
下载备用 ,谢谢楼主无私分享。
作者: antny1314    时间: 2018-3-4 15:11
感谢分享,很给力!~
作者: ♀方鸿科技♂    时间: 2018-3-14 11:10
就是需要这玩意
作者: lao4jiadian    时间: 2018-9-10 13:18
好好学习,天天向上。谢谢你的源码
作者: cococo789    时间: 2018-9-12 16:12
感谢分享,很给力!~
作者: AdGame    时间: 2018-11-4 03:43
谢谢你的源码
作者: cld9557    时间: 2018-11-30 22:11
谢分享,很给力!~
作者: 亿悠    时间: 2018-12-21 15:56
谢谢你的源码,感谢大神分享
作者: wanzrf123    时间: 2018-12-25 14:44
学习学习~!!!
作者: lsttf    时间: 2018-12-25 20:59
我就是来学习一下
作者: 汉风    时间: 2019-2-14 08:27
我就是来学习一下
作者: Mick    时间: 2019-2-15 17:20
我下载学习了
作者: 柏柏    时间: 2019-2-20 11:15
好源码。。。
作者: 曾彬    时间: 2019-3-20 23:34
正需要,谢谢

作者: ihswc101    时间: 2019-4-1 16:39
正需要,谢谢   
作者: zhagntoa    时间: 2019-4-21 09:05
收到用到很好的东西 收藏了!
作者: 流氓免125    时间: 2019-4-25 10:21
我想收藏这个帖子怎么收藏呢
作者: a37755406    时间: 2019-4-25 10:32
支持这样的号帖子
作者: wxmthh    时间: 2019-4-29 01:04
撸主,你是最胖的
作者: wei88622    时间: 2019-5-8 05:22

作者: 淡然忘情    时间: 2019-5-28 03:40
这个好东西啊,有没有固定列宽而不是自动的?
作者: 淡然忘情    时间: 2019-5-30 00:16
找了很多,不不知道  你这个能用不
作者: fxiaodi    时间: 2019-7-6 22:26
谢谢楼主分享
作者: jingyizhanghao    时间: 2019-7-15 14:24
真正完美修改超级列表框的行高
作者: nydqg    时间: 2019-7-28 13:43
我想收藏这个帖子怎么收藏呢




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4