在OwnerDraw模式下ListBox DrawItem HotLight状态?

我在我的WinForms应用程序中使用OwnerDrawFixed作为DrawMode用于自定义ListBox控件。

当用户将鼠标hover在列表框项目上时,我希望重新绘制ListBoxItem的背景(或执行其他操作),即在MouseMove …

DrawItemState.HotLight永远DrawItemState.HotLight用于ListBox,所以我想知道如何模拟它,如何解决这个问题。

我花了两年时间为你找到答案,但这里是:

DrawItemState.HotLight仅适用于所有者绘制的菜单,而不适用于列表框。 对于ListBox,您必须自己跟踪项目:

 public partial class Form1 : Form { private int _MouseIndex = -1; public Form1() { InitializeComponent(); } private void listBox1_DrawItem(object sender, DrawItemEventArgs e) { Brush textBrush = SystemBrushes.WindowText; if (e.Index > -1) { if (e.Index == _MouseIndex) { e.Graphics.FillRectangle(SystemBrushes.HotTrack, e.Bounds); textBrush = SystemBrushes.HighlightText; } else { if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) { e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds); textBrush = SystemBrushes.HighlightText; } else e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); } e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, textBrush, e.Bounds.Left + 2, e.Bounds.Top); } } private void listBox1_MouseMove(object sender, MouseEventArgs e) { int index = listBox1.IndexFromPoint(e.Location); if (index != _MouseIndex) { _MouseIndex = index; listBox1.Invalidate(); } } private void listBox1_MouseLeave(object sender, EventArgs e) { if (_MouseIndex > -1) { _MouseIndex = -1; listBox1.Invalidate(); } } } 

这个解决方案只会权衡您的代码; 试试这个:

 If e.State And DrawItemState.Selected Then e.Graphics.FillRectangle(SystemBrushes.HotTrack, e.Bounds) e.Graphics.DrawString(drv, Me.Font, SystemBrushes.HighlightText, e.Bounds.X + 18, e.Bounds.Y + 1) Else e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds) e.Graphics.DrawString(drv, Me.Font, SystemBrushes.ControlText, e.Bounds.X + 18, e.Bounds.Y + 1) End If 

此操作: e.State And DrawItemState.Selectedvalidation项目是否hover。 无需放入一整包代码就可以了解哪些项目hover。