C# · 12月 22, 2021

c# – 在OwnerDraw模式下ListBox DrawItem HotLight状态?

我在我的WinForms应用程序中使用OwnerDrawFixed作为DrawMode用于自定义List@R_971_2419@控件.

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

DrawItemState.HotLight永远不适用于List@R_971_2419@,所以我想知道如何模拟它,如何解决这个问题.

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

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

public partial class Form1 : Form{ private int _MouseIndex = -1; public Form1() { InitializeComponent(); } private void list@R_971_2419@1_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(list@R_971_2419@1.Items[e.Index].ToString(),e.Font,textBrush,e.Bounds.Left + 2,e.Bounds.Top); } } private void list@R_971_2419@1_MouseMove(object sender,MouseEventArgs e) { int index = list@R_971_2419@1.IndexFromPoint(e.Location); if (index != _MouseIndex) { _MouseIndex = index; list@R_971_2419@1.Invalidate(); } } private void list@R_971_2419@1_MouseLeave(object sender,EventArgs e) { if (_MouseIndex > -1) { _MouseIndex = -1; list@R_971_2419@1.Invalidate(); } }}