请问各位,如何重画listview的column header(求源码,高分酬谢,谢绝灌水)? 我的程序的画面所有的控件都使用了一个样式,但是listview的column header的样式没法加上去。请问各位高手,如果重画Listview 的column header?请给出源代码,高分酬谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要么全部重画,没法只画column header 例如,把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+绘图 先给你讲一下原理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);}//完 另一种方法如果你还会点 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)的那个更专业点。 http://chinavery.com/article/vb/439.html上面的连接是用API函数改进ListView控件的显示效果,对楼主会有帮助。 FlashElf(銘龘鶽)能不能够简单写一个?多谢!分数不够,可以再加(如何加法?也请告知),绝不食言。 参考一下:http://www.codeproject.com/cs/miscctrl/customheader.asp 关于在子线程创建子窗体; 如何设置GroupBox的边框有颜色或有凹凸感 Entity Framework 问题,添加记录时怎么使用数据库的默认值? string类型的如何转化为CookieContainer 多线程运行不起来,怎么回事?? 我刚入公司,有几个初级问题急等解决,得到正解立即结贴 请教C#操作数据库的事务问题 ?菜鸟提问 串口读写问题 VS.NET 2003 最终测试版好像没有地方可以下载哦 [100分求助]C#里怎么添加动态代码啊,代码是在一个文本框内生成的,怎么编译文本框内的代码啊? 如何画出一个圆,要求其内部填充色彩??
{
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+绘图
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);
}
//完
子要继承 listView 重写 protected override void WndProc(ref Message m)
剩下的就是绘制了
不过代码量还是上面我说的少点,不过 happyct(绿叶对大树的情怀www.happy-city.com)
的那个更专业点。
上面的连接是用API函数改进ListView控件的显示效果,对楼主会有帮助。
http://www.codeproject.com/cs/miscctrl/customheader.asp