单击绘制图形并使其保持不变

时间:2018-03-09 15:17:19

标签: c# windows forms graphics

这个小程序打开一个窗体,绘制70个红色矩形,用户点击表格。

每次用户点击时,矩形都会消失,并在新的点击点上绘制新的矩形。

我希望当用户点击并绘制一组新的矩形时,使矩形停留。

我该怎么做?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace tegnRektangel
{
    public partial class Form1 : Form
    {
        int x;
        int y;
        bool mouseClicked = false;
        Graphics g = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            Invalidate();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (mouseClicked)
            {
                g = panel1.CreateGraphics();
                paintRectangel();
            }


        }
        private void paintRectangel()
        {
            for (int i = 1; i <= 70; i++)
            {
                g.DrawRectangle(Pens.Red, x - 50-i*5, y - 40-i*5, 100, 80);  
            }
            g.Dispose();

        }//end paint

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            mouseClicked = true;
            Point clickPoint = new Point(e.X,e.Y);
            x = clickPoint.X;
            y = clickPoint.Y;
            panel1.Invalidate();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

来自MSDN

  

通过CreateGraphics检索的Graphics对象   在当前Windows之后通常不应保留方法   消息已被处理,因为任何用该对象绘制的内容   将使用下一个WM_PAINT消息擦除。

你可以这样解决:

  • 在点击事件中,将(x,y)坐标添加到坐标列表中。

  • 在paint事件中,迭代所有这些(x,y)坐标并绘制每个矩形。

答案 1 :(得分:1)

以下是一些代码,用于演示为每次单击创建矩形,存储它们以及绘制所有存储的矩形。

public partial class Form1 : Form
{
    private List<Rectangle> Rectangles { get; set; }

    public Form1()
    {
        InitializeComponent();
        Rectangles = new List<Rectangle>();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        if (Rectangles.Count > 0)
            e.Graphics.DrawRectangles(Pens.Red, Rectangles.ToArray());
    }

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        for (int i = 1; i <= 70; i++)
        {
            Rectangles.Add(new Rectangle(e.X - 50 - i * 5, e.Y - 40 - i * 5, 100, 80));
        }
        Invalidate();
    }
}