关于ListView表头重绘的问题!

bashilong 2009-08-14 01:03:41
在重绘listview表头时
我是在DrawColumnHeader事件下完成
发现当column少时不能填充满整个listview时,windows回自动追加一段背景色
请教这段背景色该如何重绘? 有人说要用API得到listView句柄创建Graphics对象
试了试,发现我的代码不能正确的引发重绘,我也不大懂API,请教该如何修改?或者还有别的好方法?
代码如下:

[DllImport("user32.dll",EntryPoint="GetWindowDC",CharSet=CharSet.Auto,ExactSpelling=true)]
private static extern IntPtr GetWindowDC(IntPtr hWnd);

protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
.....
}

protected override void OnPaint(PaintEventArgs e)
{
//我在这里创建Graphics对象,不知道对不对
Graphics g = Graphics.FromHdc(GetWindowDC(this.Handle));
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, this.Width, 30)); //希望为表头做背景色
base.OnPaint(e);
}
...全文
471 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dancingbit 2009-08-15
  • 打赏
  • 举报
回复
1.你使用的ListView是否派生自.Net Framework中的ListView类?不派生的话,On_xxx方法无效。
2.表头需要重绘,产生的是DrawColumnHeader事件。
3.空白区域没有任何列,可能不会产生DrawColumnHeader事件。试着处理ListView的Paint事件。
bashilong 2009-08-15
  • 打赏
  • 举报
回复
在Onpaint事件里无法重绘表头
还是使用API函数,但是不太完美
代码:
[DllImport("user32.dll", EntryPoint = "GetWindowDC",
CharSet=CharSet.Auto,ExactSpelling = true)]
private static extern IntPtr GetDC(IntPtr hWnd);

WM_MOUSEHOVER = 0x02A1;
WM_MOUSELEAVE = 0x02A3;
WM_NCMOUSEHOVER = 0x02A0;
WM_NCMOUSELEAVE = 0x02A2;
WM_PAINTICON = 0x0026;

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_PAINTICON | m.Msg == WM_NCMOUSELEAVE | m.Msg == WM_NCMOUSEHOVER
| m.Msg == WM_MOUSELEAVE | m.Msg == WM_MOUSEHOVER) //触发重绘的消息
{
Graphics g = Graphics.FromHdc(GetDC(this.Handle));
}
//画表头背景
g.FillRectangle(Brushes.Black, new Rectangle(0, 2, this.Width, 20));
}

现在的问题是仍然不能完全正确的出发重绘,(鼠标拖动Colum,松开后,不能引发重绘),就是Header上的mouseUp消息没有接受到,该怎么办?
我就是想把多余的空白表头背景换成和自定义的ColumHeader颜色一样.
dancingbit 2009-08-14
  • 打赏
  • 举报
回复
贴出你现在的OnPaint方法。
bashilong 2009-08-14
  • 打赏
  • 举报
回复
未解决中......
dylike 2009-08-14
  • 打赏
  • 举报
回复
这个比较简单.只要在DrawSubItem里绘制就行了,因为是实时绘制,所以可以不考虑是否会拉伸变形的问题.DrawItem只负责绘制第一列,而DrawSubItem也可以从第一列开始绘制,所以不需要在DrawItem中写代码.只需要在DrawSubItem里写.另外,也不需要API.
CCppMfc 2009-08-14
  • 打赏
  • 举报
回复
这样。
你在最后加列空列. 空列的宽度为listview的宽度减去空列前面所有列的宽度.
象前面的列那样重绘空列, 则不会有看着特别扭的背景色了.

ps: 哥就是这么弄的.
dancingbit 2009-08-14
  • 打赏
  • 举报
回复
你在OnPaint中调用基类的OnPaint方法的代码放到最前面,你自己的绘制代码放到后面。
bashilong 2009-08-14
  • 打赏
  • 举报
回复
我试过很多次了
用OnDrawColumnHeader的参数e创建的Graphics对象无法完成
用OnPaint参数也无法覆盖这段背景色
dancingbit 2009-08-14
  • 打赏
  • 举报
回复
OnDrawColumnHeader的参数e也有这个成员。
dancingbit 2009-08-14
  • 打赏
  • 举报
回复
OnPaint的参数e里就有Graphics。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧