我知道ListView有Properties
可用于更改常见样式但我只是想测试一下。例如,View = View.LargeIcon
将样式LVS_ICON = 0
应用于ListView
或GridLines = true
将样式LVS_EX_GRIDLINES = 1
应用于ListView
。我想用CreateParams
进行测试。我认为使用GetWindowLong
和SetWindowLong
Win32函数会没问题,但为了方便起见,据我所知,CreateParams
可以改变控件的样式。但这次使用ListView
,我无法使其工作,它根本没有效果,我想知道ListView
是否是一个特殊情况?这是我的代码:
public class CustomListView : ListView {
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.Style |= 3; //Apply LVS_LIST (View as List)
return cp;
}
}
}
只有LVS_EX_GRIDLINES = 1
有效,但效果不是Grid lines are drawn on the ListView
,而是Border becomes thicker and looks like 3D-border
。这很奇怪,大多数其他适用都没有效果。
你能解释一下,或者至少给我一些有用的例子吗?再次请不要向我提供任何使用GetWindowLong
和SetWindowLong
的解决方案或代码,只需使用CreateParams
即可。
谢谢!
答案 0 :(得分:0)
如果它有助于解释其工作原理,则由ListView.UpdateExtendedStyles
函数在内部处理,当设置与扩展样式相关的属性之一时,将调用该函数。
从MSDN上的相关部分引用
Reflector将函数反汇编如下
protected void UpdateExtendedStyles()
{
if (base.IsHandleCreated)
{
int lparam = 0;
int wparam = 0x10cfd;
switch (this.activation)
{
case ItemActivation.OneClick:
lparam |= 0x40;
break;
case ItemActivation.TwoClick:
lparam |= 0x80;
break;
}
if (this.AllowColumnReorder)
{
lparam |= 0x10;
}
if (this.CheckBoxes)
{
lparam |= 4;
}
if (this.DoubleBuffered)
{
lparam |= 0x10000;
}
if (this.FullRowSelect)
{
lparam |= 0x20;
}
if (this.GridLines)
{
lparam |= 1;
}
if (this.HoverSelection)
{
lparam |= 8;
}
if (this.HotTracking)
{
lparam |= 0x800;
}
if (this.ShowItemToolTips)
{
lparam |= 0x400;
}
base.SendMessage(0x1036, wparam, lparam);
base.Invalidate();
}
}
修改强>
您无法使用CreateParams
的原因是因为它与ListView
see MSDN here无关 - 下面复制的摘录