简体   繁体   中英

How can I click on drawn points and make a external window opening?

I want to click on points that I drew.

It would be also cool if a window would popup and I could do something with that. But the general thing i want to do is clicking on a drawn point . I want to make it work, that i can click on the map on points that I drew.

Example image:

在此处输入图片说明

public partial class Form1 : Form
    {
        Graphics g;
        Pen p;
        Point cursor;


        int k = 0;
        Point[] points = new Point[50];
        public Form1()
        {
            InitializeComponent();

            g = pbxkarte.CreateGraphics();
            p = new Pen(Color.DeepSkyBlue, 3);


        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void Pbxkarte_Click(object sender, EventArgs e)
        {

           if (drawmodecbx.Checked == true)
            {

                g.DrawEllipse(p, cursor.X - 10, cursor.Y - 10, 20, 20);
                points[k++] = new Point(cursor.X, cursor.Y);
                lbxDrawnPoints.Items.Add("X:" + cursor.X + "Y:" + cursor.Y);


            }
        }

        private void Pbxkarte_MouseMove(object sender, MouseEventArgs e)
        {
            cursor = this.PointToClient(Cursor.Position);
            xydisplay.Text = "X:" + cursor.X + "Y:" + cursor.Y;
        }
    }
}

Example code:

Two class level variables and a helper function:

List<Point> dots = new List<Point>();
int dotSize = 12;

Rectangle fromPoint(Point pt, int size)
{
    return new Rectangle(pt.X - size/ 2, pt.Y - size / 2, size, size);
}

The mouseclick (as opposed to the click event) contains the location:

private void Pbxkarte_MouseClick(object sender, MouseEventArgs e)
{
    if (!dots.Contains(e.Location))
    {
        dots.Add(e.Location);
        Pbxkarte.Invalidate();  // show the dots
    }
}

You could add code to remove dots or change the properties, esp. if you create a dot class. - If you want to avoid overlapping dots you can to use code like the one in the mousemove to detect this. But. Don't repeat the code! Instead factor out a boolOrPoint IsDotAt(Point) function you can use both times!!

In the mousemove I only show the hit state. You do your thing..

private void Pbxkarte_MouseMove(object sender, MouseEventArgs e)
{
    bool hit = false;
    foreach (var dot in dots)
    {
        using (GraphicsPath gp = new GraphicsPath())
        {
            gp.AddEllipse(fromPoint(dot, dotSize));
            if (gp.IsVisible(e.Location))
            {
                hit = true; break;
            }
        }
    }
    Cursor = hit ? Cursors.Hand : Cursors.Default;

}

All dot in the list must get shown every time anything changes, both in the list or in the system.:

private void Pbxkarte_Paint(object sender, PaintEventArgs e)
{
    foreach (var dot in dots)
    {
        using (GraphicsPath gp = new GraphicsPath())
        {
            gp.AddEllipse(fromPoint(dot, dotSize));
            e.Graphics.FillPath(Brushes.Red, gp);
        }
    }
}

If you want more properties, like texts or colors do create a class dot and use a List<dot> !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM