簡體   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