برای چند ضلعی میتونی از کلاس زیر استفاده کنی. کلاس رو به پروژه اضافه و پروژه رو بیلد کنید.
یک نمونه از این کنترل به فرم اضافه کنید. نقاط رو به لیست Polygon اضافه کنید و در رویداد PolygonClick کد مورد نظر را بنویسید.
[DefaultEvent("PolygonClick")]
public partial class Canvas : UserControl
{
public delegate void PolygonClickEventHandler(object sender, EventArgs e);
public event PolygonClickEventHandler PolygonClick;
List<PointF> polygon; //to hold points of the polygon
public List<PointF> Polygon
{
get { return polygon; }
set { polygon = value; }
}
public Canvas()
{
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams parms = base.CreateParams;
parms.ExStyle |= 0x20;
return parms;
}
}
private void Canvas_Paint(object sender, PaintEventArgs e)
{
// fetch the graphics object of the canvas
Graphics g = e.Graphics;
//draw polygon only if the number of points in the polygon is greater than two
if (polygon != null && polygon.Count > 2)
{
//Draw the filled polygon
g.FillPolygon(Brushes.Black, polygon.ToArray());
}
}
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
PointF currentPoint = e.Location;//to store the mouse location
if (polygon != null && polygon.Count > 2)
{
//Ray-cast algorithm is here onward
int k, j = polygon.Count - 1;
bool oddNodes = false; //to check whether number of intersections is odd
for (k = 0; k < polygon.Count; k++)
{
//fetch adjucent points of the polygon
PointF polyK = polygon[k];
PointF polyJ = polygon[j];
//check the intersections
if (((polyK.Y > currentPoint.Y) != (polyJ.Y > currentPoint.Y)) &&
(currentPoint.X < (polyJ.X - polyK.X) * (currentPoint.Y - polyK.Y) / (polyJ.Y - polyK.Y) + polyK.X))
oddNodes = !oddNodes; //switch between odd and even
j = k;
}
//if odd number of intersections
if (oddNodes)
{
//mouse point is inside the polygon
OnPolygonClick(e);
}
}
Refresh();
}
virtual public void OnPolygonClick(EventArgs e)
{
if (PolygonClick != null)
{
PolygonClick(this, e);
}
}
}