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

时间:2012-09-27 14:52:16

标签: c# .net window gdi+

我在C#.net中创建了一个Windows应用程序控件,以图形模式显示一些对象(东西)。 所以我根据列表中的项目数创建了一个矩形,并使用Control OnPaint事件将其绘制在控件上。

现在我想突出显示该矩形,如果鼠标悬停在它上面。

请查看随附的图片以获得更清晰的信息。建议我如何实现它。

enter image description here

1 个答案:

答案 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();
}