完美修改程序超级列表框的行高

易语言 2020-07-10 09:21:46

完美修改程序超级列表框的行高

要想修改行高,需要考虑的第一个问题,就是超列中有没有行高这个属性,以及如何修改他。答案确实是有的,这个值通过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,就可以为超列增加这个风格。