我在我的WinForms应用程序中使用OwnerDrawFixed作为DrawMode用于自定义ListBox控件.
当用户将鼠标悬停在列表框项目上时,我希望重新绘制ListBoxItem的背景(或执行其他操作),即在MouseMove …
解决方法
我花了两年时间为你找到答案,但这里是:
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(); } } }