簡體   English   中英

如何在c#中使用鼠標在面板中選擇繪制的形狀,例如圓形或矩形

[英]how to select drawn shapes like circle or rectangle in panel with mouse in c#

我正在嘗試制作一個具有三個按鈕(矩形,圓形和直線形)的minipaint應用程序。 我在選擇和移動鼠標形狀時遇到問題。 例如,我有這個矩形類,它從形狀繼承了顏色,厚度:

class rectangle : shape
{
  public int length { get; set; }
  public int width { get; set; }

  public override void Draw(Graphics g)
  {
    g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width,length));
   }
 }

現在,我希望我的panel1_MouseDown每當單擊矩形的任何部分時都可以在面板中選擇一個矩形。 所有繪制的形狀都添加到名為lstShapsOnForm的列表中,而drawable是一個抽象類,它具有draw和property x y的抽象方法。

abstract class Drawable
{
  public int x { get; set; }
  public int y { get; set; }
  public abstract void draw(Graphics g);
 }

 private void panel1_MouseDown(object sender, MouseEventArgs e)
 {
    foreach (Drawable o in lstShapsOnForm)
    {
       if (e.Location.X >= o.x || e.Location.X < o.x)
        propertyGrid1.SelectedObject = o;       
    }
 }

我應該如何做這項工作?

最簡單的事情是讓形狀負責了解是否已單擊它們,因此添加一個IsInside方法,例如:

abstract class Drawable
{
  public int x { get; set; }
  public int y { get; set; }
  public abstract void draw(Graphics g);
  public abstract bool IsInside(int x, int y);
}

然后測試:

var shapeHit = lstShapsOnForm.FirstOrDefault(s => s.IsInside(e.Location.X, e.Location.Y));    
if (shapeHit != null)
  propertyGrid1.SelectedObject = shapeHit;   

對於矩形,假設您知道寬度和高度(如果您繪制了矩形,則應該知道),並且假設x和y屬性是左上角,則將像這樣:

public override bool IsInside(int mouseX, int mouseY) 
{
    return 
        mouseX >= x && 
        mouseX <= x + width &&
        mouseY >= y &&
        mouseY <= y + height;
}

對於圓和線.....我建議您使用谷歌“如何確定x / y點是否在圓/在線內”。 它將涉及使用半徑(對於圓)和2個線點(對於線)進行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM