我在 C#.net 中创建了一个 Windows 应用程序控件,以图形模式显示一些对象。
为此,我根据列表中的项目数量创建了一个矩形,并使用 Control OnPaint 事件将其绘制在控件上。
现在,如果鼠标悬停在该矩形上,我想突出显示该矩形。
请检查所附图片以获得更清晰的信息并建议我如何实现它。
您检查过经典的 DrawCli 示例吗?它展示了基本应用程序应如何管理对象和工具。
简而言之,你应该在里面重新枚举你的列表MouseMove
事件,获取项目的矩形并设置其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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)