重载OnDrawItem,如何改变item的背景色?

codeyell-com 2010-02-04 12:50:22
扩展listbox,重载OnDrawItem.

e.DrawBackground()函数没有参数。如何设置背景色?谢谢
...全文
324 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
codeyell-com 2010-02-05
  • 打赏
  • 举报
回复
知道原因了
我把顺序弄错了。呵呵
LorenLiu 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yangglemu 的回复:]
引用 5 楼 baiyuxiong 的回复:
楼上:
我就是通过继承listbox来画的,
SolidBrush NBrush = new SolidBrush(Obj.BgColor);
e.Graphics.FillRectangle(NBrush, e.Bounds);

但是填充了矩形后,填充颜色把整个item盖住了。就是说填充不是背景色,而变成了前景色。


上面已经说的很清楚了,而且担心你有这个问题,专门作了注释,你有没仔细看懂?
[/Quote]

恩,LZ仔细看看yangglemu的代码,在重绘的时候,我们是需要先自绘背景,然后自绘前景的。系统不会那么智能的去帮你绘制前景
codeyell-com 2010-02-05
  • 打赏
  • 举报
回复
yangglemu:
不好意思,我试过你的做法,还是会盖住的。
你指的是哪句注释?
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baiyuxiong 的回复:]
楼上:
我就是通过继承listbox来画的,
SolidBrush NBrush = new SolidBrush(Obj.BgColor);
e.Graphics.FillRectangle(NBrush, e.Bounds);

但是填充了矩形后,填充颜色把整个item盖住了。就是说填充不是背景色,而变成了前景色。
[/Quote]

上面已经说的很清楚了,而且担心你有这个问题,专门作了注释,你有没仔细看懂?
lzsh0622 2010-02-05
  • 打赏
  • 举报
回复
listbox 没提供这个功能,在这上面下功夫不值得。

可以变通一下,选用其它控件,实现同样的外观效果。 如TreeView , ListView等 可以控制到Items
codeyell-com 2010-02-05
  • 打赏
  • 举报
回复
楼上:
我就是通过继承listbox来画的,
SolidBrush NBrush = new SolidBrush(Obj.BgColor);
e.Graphics.FillRectangle(NBrush, e.Bounds);

但是填充了矩形后,填充颜色把整个item盖住了。就是说填充不是背景色,而变成了前景色。
LorenLiu 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangglemu 的回复:]
设置一下控件的绘制模式属性:
comboBox1.DrawMode = DrawMode.OwnerDrawFixed
上面的意思是控件自己绘制,项固定高度
添加DrawItem事件
comboBox1.DrawItem += new DrawItemEventHandler(this.comboBox1_DrawItem)
事件方法如下:
C# codeprivatevoid comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{//每一个Item间留2像素边,不然会一整块板,不好看 Rectangle rectangle=new Rectangle(2, e.Bounds.Top+2, e.Bounds.Height, e.Bounds.Height-4);//填充每项背景 e.Graphics.FillRectangle(Brushes.Red, rectangle);//你自己添加e.Graphics.DrawString()绘文字吧//绘制焦点框 e.DrawFocusRectangle();
}
[/Quote]

Up

上面说的虽然是ComboBox,但是ListBox也是一样的用的,而且LZ你可以继承一个自己的ListBox如
public class MyListBox : ListBox
{
public MyListBox()
{
this.DrawMode = DrawMode.OwnerDrawFixed;
}

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);

// 这里加入自绘item的代码
}
}

另外可以通过判断e.State来决定画法的不同如e.State == DrawItemState.Selected则可以画一个蓝色背景以区别于其他item
  • 打赏
  • 举报
回复
设置一下控件的绘制模式属性:
comboBox1.DrawMode = DrawMode.OwnerDrawFixed
上面的意思是控件自己绘制,项固定高度
添加DrawItem事件
comboBox1.DrawItem += new DrawItemEventHandler(this.comboBox1_DrawItem)
事件方法如下:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
//每一个Item间留2像素边,不然会一整块板,不好看
Rectangle rectangle = new Rectangle(2, e.Bounds.Top + 2, e.Bounds.Height, e.Bounds.Height - 4);
//填充每项背景
e.Graphics.FillRectangle(Brushes.Red, rectangle);
//你自己添加e.Graphics.DrawString()绘文字吧
//绘制焦点框
e.DrawFocusRectangle();
}
codeyell-com 2010-02-04
  • 打赏
  • 举报
回复
SolidBrush只是写文本的笔刷。
画背景不行吧?
lzsh0622 2010-02-04
  • 打赏
  • 举报
回复

试试这个思路:
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
SolidBrush sb = new SolidBrush(e.ForeColor);
e.Graphics.DrawString("当前行文本", e.Font, sb, e.Bounds.Left + 2, e.Bounds.Top + 2);
sb.Dispose();

}

111,120

社区成员

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

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

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