我在C#.net中创建了一个Windows应用程序控件,以图形模式显示一些对象(东西)。 所以我根据列表中的项目数创建了一个矩形,并使用Control OnPaint事件将其绘制在控件上。
现在我想突出显示该矩形,如果鼠标悬停在它上面。
请查看随附的图片以获得更清晰的信息。建议我如何实现它。
答案 0 :(得分:2)
您是否检查过古典的DrawCli示例?它显示了基本应用程序应如何管理对象和工具。
简而言之,您应该重新枚举MouseMove
事件中的列表,获取项目的rect并将其IsFocused
属性设置为true,如果鼠标指针位于该矩形内部。如果有变化,则重绘。您甚至可以在OnPaint
内查看(检查当前鼠标位置),但是您必须始终重新绘制MouseMove
内的所有内容(这是一个非常糟糕的主意)。
用于解释我的意思的伪代码:
protected override void OnPaint(PaintEventArgs e)
{
foreach (GraphicalObject obj in Objects)
{
if (!obj.IsVisible)
continue;
Rectangle rect = obj.GetBounds(e.Graphics);
if (!rect.Intersects(e.ClipRectangle))
continue;
obj.Draw(e.Graphics);
}
}
GraphicalObject
是您可以放在屏幕上的所有对象的基本类型。 Objects
是一个包含它们集合的属性(例如GraphicalObjectCollection
)。现在你的代码可能是这样的(注意这远离真正的代码,它只是一般技术的一个例子):
protected override OnMouseMove(MouseMoveEventArgs e)
{
bool needToRedraw = false;
using (Graphics g = CreateGraphics())
{
foreach (GraphicalObject obj in Objects)
{
if (!obj.IsVisible)
continue;
Rectangle rect = obj.GetBounds(e.Graphics);
if (rect.Contains(e.Location))
{
if (!obj.IsFocused)
{
obj.IsFocused = true;
needToRedraw = true;
}
}
else
{
if (obj.IsFocused)
{
obj.IsFocused = false;
needToRedraw = true;
}
}
obj.Draw(e.Graphics);
}
}
if (needToRedraw)
Invalidate();
}