我在我的WinForms应用程序中使用OwnerDrawFixed
作为自定义ListBox控件的DrawMode。
当用户将鼠标悬停在列表框项目上时,我希望重新绘制ListBoxItem的背景(或执行其他操作),即在MouseMove ...
DrawItemState.HotLight
从不适用于ListBox,所以我想知道如何模仿它,如何解决这个问题。
答案 0 :(得分:11)
我花了两年时间才找到答案,但现在是:
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();
}
}
}
答案 1 :(得分:0)
此解决方案只会权衡您的代码;试试这个:
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.Selected
验证项目是否悬停。不需要整理一整堆代码就可以知道哪些项目是悬停的。