views:

61

answers:

2

Hi,

I need to be able to draw a polygon using mouse click locations. Here is my current code:

 //the drawshape varible is called when a button is pressed to select use of this tool
             if (DrawShape == 4)
                {
                    Point[] pp = new Point[3];
                    pp[0] = new Point(e.Location.X, e.Location.Y);
                    pp[1] = new Point(e.Location.X, e.Location.Y);
                    pp[2] = new Point(e.Location.X, e.Location.Y);
                    Graphics G = this.CreateGraphics();
                    G.DrawPolygon(Pens.Black, pp);
                }

Thanks

A: 

First, add this code:

List<Point> points = new List<Point>();

On the object you are drawing on, capture the OnClick event. One of the arguments should have the X and Y coordinates of the click. Add them to the points array:

points.Add(new Point(xPos, yPos));

And then finally, where you're drawing the lines, use this code:

 if (DrawShape == 4)
 {
     Graphics G = this.CreateGraphics();
     G.DrawPolygon(Pens.Black, points.ToArray());
 }

EDIT:

Ok, so the above code isn't exactly correct. First of all, its most likely a Click event instead of a OnClick event. Second, To get the mouse position, you need two variables declared up with the points array,

    int x = 0, y = 0;

Then have a mouse move event:

    private void MouseMove(object sender, MouseEventArgs e)
    {
        x = e.X;
        y = e.Y;
    }

Then, in your Click event:

    private void Click(object sender, EventArgs e)
    {
        points.Add(new Point(x, y));
    }
TheAdamGaskins
How should the code for the OnClick event look, because at the moment i don't have anything in that event at all?
Chris Bacon
What are you drawing the polygons on?
TheAdamGaskins
On a picturebox
Chris Bacon
Ah, ok. So I edited the post. This new approach should work.
TheAdamGaskins
Is this all in the picturebox events?
Chris Bacon
Yes, that is correct.
TheAdamGaskins
Well at the moment it doesn't show the polygon on the picturebox, it is shown on the edges behind it
Chris Bacon
On the edges behind it? What do you mean by that?
TheAdamGaskins
Sorry bad English, basically it is not showing on the picturebox itself
Chris Bacon
oh, and it looks like picturebox's have a Mouseclick event, not Click event.
TheAdamGaskins
Yes, and i put it in that, so now i have tried putting all the code you have given me in this except the global variables. It shows an error of parameter is not valid.
Chris Bacon
+1  A: 

Ok here is some sample code:

    private List<Point> polygonPoints = new List<Point>();

    private void TestForm_MouseClick(object sender, MouseEventArgs e)
    {
        switch(e.Button)
        {
            case MouseButtons.Left:
                //draw line
                polygonPoints.Add(new Point(e.X, e.Y));
                if (polygonPoints.Count > 1)
                {
                    //draw line
                    this.DrawLine(polygonPoints[polygonPoints.Count - 2], polygonPoints[polygonPoints.Count - 1]);
                }
                break;

            case MouseButtons.Right:
                //finish polygon
                if (polygonPoints.Count > 2)
                {
                    //draw last line
                    this.DrawLine(polygonPoints[polygonPoints.Count - 1], polygonPoints[0]);
                    polygonPoints.Clear();
                }
                break;
        }
    }

    private void DrawLine(Point p1, Point p2)
    {
        Graphics G = this.CreateGraphics();
        G.DrawLine(Pens.Black, p1, p2);
    }
GôTô