我正在做一个自定义的listbox控件,我的代码大致如下....
public class ListItem
{
public ListItem() { }
public ListItem(string songname, int songlenght)
{
this.songname = songname;
this.songlenght = songlenght;
}
private string songname;
private int songlenght;
private int alpha = 0;
private bool focus;
private EMouseState mouseState; private Rectangle bounds;
public Rectangle Bounds { get { return bounds; } set { bounds = value; } }
public int Alpha { get { return alpha; } set { alpha = value; } }
public EMouseState MouseState { get { return mouseState; } set { mouseState = value; } }
public bool Focus { get { return focus; } set { focus = value; } }
public string SongName { get { return songname; } set { songname = value; } }
public int SongLenght { get { return songlenght; } set { songlenght = value; } }
}
....
private List<ListItem> items = new List<ListItem>();
public List<ListItem> Items
{
get
{
return items;
}
}
...
protected override void OnPaint(PaintEventArgs e)
{
//base.OnPaint(e);
TextFormatFlags SNFlags = TextFormatFlags.VerticalCenter;
TextFormatFlags SLFlags = TextFormatFlags.VerticalCenter | TextFormatFlags.Right;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
//g.TextRenderingHint = TextRenderingHint.AntiAlias;
g.InterpolationMode = InterpolationMode.High;
Rectangle rectItem = new Rectangle(0, 1, Width, itemSize.Height);
if (Items != null && Items.Count() > 0)
foreach (ListItem li in Items)
{
string songname = li.SongName;
int songlenght = li.SongLenght; //画背景
using (SolidBrush sb = new SolidBrush(Color.FromArgb(li.Alpha, this.Parent.BackColor)))
{
g.FillRectangle(sb, rectItem);
}
//画文字
TextRenderer.DrawText(g, songname, Font, rectItem, ForeColor, SNFlags);
TextRenderer.DrawText(g, songlenght.ToString(), Font, rectItem, ForeColor, SLFlags);
li.Bounds = new Rectangle(rectItem.Location, rectItem.Size);
rectItem.Y = rectItem.Bottom + 1;
}
}
...
protected override void OnMouseMove(MouseEventArgs e)
{
//
Point mouse = e.Location;
foreach (ListItem li in Items)
{
if (li.Bounds.Contains(mouse))
{
li.Alpha = 200;
this.Invalidate(li.Bounds);
}
}
base.OnMouseMove(e);
}
...
protected override void OnMouseLeave(EventArgs e)
{
...
}
当鼠标划过和选中的时候重新绘制项的背景。控件外面有个timer,但是鼠标划过的时候那个tiemer就卡住了。界面其他的控件就不绘制了。有黑色背景。我知道要用事件和委托来做,但是不知道具体要怎么做。
求高手为指点迷津,谢谢事件和委托c#重绘listbox
public class ListItem
{
public ListItem() { }
public ListItem(string songname, int songlenght)
{
this.songname = songname;
this.songlenght = songlenght;
}
private string songname;
private int songlenght;
private int alpha = 0;
private bool focus;
private EMouseState mouseState; private Rectangle bounds;
public Rectangle Bounds { get { return bounds; } set { bounds = value; } }
public int Alpha { get { return alpha; } set { alpha = value; } }
public EMouseState MouseState { get { return mouseState; } set { mouseState = value; } }
public bool Focus { get { return focus; } set { focus = value; } }
public string SongName { get { return songname; } set { songname = value; } }
public int SongLenght { get { return songlenght; } set { songlenght = value; } }
}
....
private List<ListItem> items = new List<ListItem>();
public List<ListItem> Items
{
get
{
return items;
}
}
...
protected override void OnPaint(PaintEventArgs e)
{
//base.OnPaint(e);
TextFormatFlags SNFlags = TextFormatFlags.VerticalCenter;
TextFormatFlags SLFlags = TextFormatFlags.VerticalCenter | TextFormatFlags.Right;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
//g.TextRenderingHint = TextRenderingHint.AntiAlias;
g.InterpolationMode = InterpolationMode.High;
Rectangle rectItem = new Rectangle(0, 1, Width, itemSize.Height);
if (Items != null && Items.Count() > 0)
foreach (ListItem li in Items)
{
string songname = li.SongName;
int songlenght = li.SongLenght; //画背景
using (SolidBrush sb = new SolidBrush(Color.FromArgb(li.Alpha, this.Parent.BackColor)))
{
g.FillRectangle(sb, rectItem);
}
//画文字
TextRenderer.DrawText(g, songname, Font, rectItem, ForeColor, SNFlags);
TextRenderer.DrawText(g, songlenght.ToString(), Font, rectItem, ForeColor, SLFlags);
li.Bounds = new Rectangle(rectItem.Location, rectItem.Size);
rectItem.Y = rectItem.Bottom + 1;
}
}
...
protected override void OnMouseMove(MouseEventArgs e)
{
//
Point mouse = e.Location;
foreach (ListItem li in Items)
{
if (li.Bounds.Contains(mouse))
{
li.Alpha = 200;
this.Invalidate(li.Bounds);
}
}
base.OnMouseMove(e);
}
...
protected override void OnMouseLeave(EventArgs e)
{
...
}
当鼠标划过和选中的时候重新绘制项的背景。控件外面有个timer,但是鼠标划过的时候那个tiemer就卡住了。界面其他的控件就不绘制了。有黑色背景。我知道要用事件和委托来做,但是不知道具体要怎么做。
求高手为指点迷津,谢谢事件和委托c#重绘listbox
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货