作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在我的 WinForms 应用程序中使用 OwnerDrawFixed
作为自定义 ListBox 控件的 DrawMode。
我想在用户将鼠标悬停在列表框项上时重新绘制 ListBoxItem 的背景(或执行其他操作),即在 MouseMove...
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();
}
}
}
关于c# - OwnerDraw 模式下的 ListBox DrawItem HotLight 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316027/
我在我的 WinForms 应用程序中使用 OwnerDrawFixed 作为自定义 ListBox 控件的 DrawMode。 我想在用户将鼠标悬停在列表框项上时重新绘制 ListBoxItem 的
我是一名优秀的程序员,十分优秀!