【问题标题】:how to select drawn shapes like circle or rectangle in panel with mouse in c#如何在c#中用鼠标在面板中选择绘制的形状,如圆形或矩形
【发布时间】:2017-10-30 14:08:34
【问题描述】:

我正在尝试制作一个具有三个按钮(矩形、圆形和线条)的 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 的抽象方法和属性 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;       
    }
 }

我应该如何进行这项工作?

【问题讨论】:

标签: c# winforms mouseevent draw shape


【解决方案1】:

最简单的事情是让形状负责知道它们是否被点击,所以添加一个 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 个线点(对于直线)进行测试

【讨论】:

  • 但我不知道如何找出 e.location 是否在形状内
  • 哪一个 - 矩形、圆形、直线 - 还是全部?
  • 所有这些。任何在面板上绘制的形状。
  • 啊,好吧-我为简单的(矩形)添加了想法-我必须用谷歌搜索其他的,所以我不会这样做
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多