我的程序的画面所有的控件都使用了一个样式,但是listview的column header的样式没法加上去。请问各位高手,如果重画Listview 的column header?请给出源代码,高分酬谢!

解决方案 »

  1.   

    要么全部重画,没法只画column header
      

  2.   

    例如,把ListView的标题画到窗口上protected override void OnPaint(PaintEventArgs e)
    {
    base.OnPaint (e); Graphics g = e.Graphics; //画ListView列标题
    int width = 0;
    int headerHeight = 20;
    for(int i = 0 ; i < this.listView1.Columns.Count ; i++)
    {
    width += this.listView1.Columns[i].Width;
    g.DrawString(this.listView1.Columns[i].Text,this.listView1.Font,Brushes.Red,new Rectangle(new Point(width,2),new Size(this.listView1.Columns[i].Width,headerHeight)));
    }
    }主要还是要用到GDI+绘图
      

  3.   

    先给你讲一下原理
    ListView 其实是一个复合控件Windwos 类名叫 "SysHeader32"
    column header 相当于 panel里的一个子控件
    不过这个控件没有对应的.net类型对应的就和  comboBox 里面的文本框还有下拉出来的那个窗口一样如果要重画他就比较麻烦了
    listView1.Controls[0] 也取不到,因为系统没有提供所以调用API是难免的了代码我没写过因为我没你这种需求,顶多是需要 listView 排序的时候显示个箭头(显示箭头是不需要重绘的,有API支持)写代码要写很久最近忙给你点思路吧还是
    如果这个问题你问出 1000 分还没有解决我就帮你解决(估计那时已经很久了我就不忙了)1)ListView 列头相关,列头其实是 SysHeader32 Windows 窗口类
    2)既然是窗口类就一定有句并 column header 也一样
    3)取得句并
    4)子类化(VC 的叫法 C# 不知道叫什么)子类化 可以用
        API SetWindowLong 或DotNet 的NativeWindow 类
    5)子类化后就可以拦截到windows 消息了要重画拦截 WM_PAINT 或 WM_NCPAINT 消息就可以
       画了相关代码
    1) 取得 column header 句并
    IntPtr hHeader = SendMessage(listView.Handle
                         , LVM_GETHEADER
                         , IntPtr.Zero
                         , IntPtr.Zero);
    第一个参数是 listView 的句并 返回的就是 column header 句并
    LVM_GETHEADER 是个C#常量 具体多少忘记了建立一个VC 的工程粘贴 LVM_GETHEADER 然后用鼠标点一下 LVM_GETHEADER 代码按 F12 基本就可以看到,要不去 Google 找因该可以找到的
    SendMessage 声明
    [DllImport("user32")]
    static extern IntPtr SendMessage(IntPtr Handle
    , Int32 msg
    , IntPtr wParam
    , IntPtr lParam);
    2)子类化
     继承 NativeWindow 如果想做可以放到窗口上的还需要实现 IComponent 接口
     用 NativeWindow 类的 AssignHandle 子类化 column header 列头的句并
     重写 WndProc(ref Message m) 就可以想干什么就干什么了
    你要重画就private const int WM_PAINT = 0x000F;
    protected override void WndProc(ref Message m)
    {

      if(m.Msg == WM_PAINT)
      {

       Console.WriteLine("这里写代码:Ok");
      }
      base.WndProc (ref m);
    }
    //完
      

  4.   

    另一种方法如果你还会点 VC 或  C++ Builder  可以看看http://community.csdn.net/Expert/topic/4049/4049022.xml?temp=.2363245happyct(绿叶对大树的情怀www.happy-city.com) ( ) 哥们的恢复也是可行的
    子要继承 listView 重写 protected override void WndProc(ref Message m)
    剩下的就是绘制了
    不过代码量还是上面我说的少点,不过 happyct(绿叶对大树的情怀www.happy-city.com)
    的那个更专业点。
      

  5.   

    http://chinavery.com/article/vb/439.html
    上面的连接是用API函数改进ListView控件的显示效果,对楼主会有帮助。
      

  6.   

    FlashElf(銘龘鶽)能不能够简单写一个?多谢!分数不够,可以再加(如何加法?也请告知),绝不食言。
      

  7.   

    参考一下:
    http://www.codeproject.com/cs/miscctrl/customheader.asp