繁体   English   中英

如何在鼠标悬停时检测和突出显示矩形

[英]How to detect and highlight rectangle on mouse hover

我在 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM