[英]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.