在自定义ListView中覆盖CreateParams无效?

时间:2013-06-13 00:00:32

标签: c# winforms winapi listview createparams

我知道ListView有Properties可用于更改常见样式但我只是想测试一下。例如,View = View.LargeIcon将样式LVS_ICON = 0应用于ListViewGridLines = true将样式LVS_EX_GRIDLINES = 1应用于ListView。我想用CreateParams进行测试。我认为使用GetWindowLongSetWindowLong 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。这很奇怪,大多数其他适用都没有效果。

你能解释一下,或者至少给我一些有用的例子吗?再次请不要向我提供任何使用GetWindowLongSetWindowLong的解决方案或代码,只需使用CreateParams即可。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果它有助于解释其工作原理,则由ListView.UpdateExtendedStyles函数在内部处理,当设置与扩展样式相关的属性之一时,将调用该函数。

从MSDN上的相关部分引用

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无关 - 下面复制的摘录

msdn