【问题标题】:How to detect and highlight rectangle on mouse hover如何在鼠标悬停时检测和突出显示矩形
【发布时间】:2012-09-19 09:43:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net window gdi+


    【解决方案1】:

    您是否检查过经典的 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多