C# 如何在windows窗体应用程序上刷新()后重新绘制所有内容

C# 如何在windows窗体应用程序上刷新()后重新绘制所有内容,c#,winforms,C#,Winforms,我有9个矩形,我需要在它们里面画一个文本,我有两个按钮,它们选择我需要画的文本。 当我点击按钮,然后点击矩形,它将采取鼠标的位置,然后检查在哪个矩形我需要画进去。 当我因为Refresh()需要绘制另一个矩形时,它会绘制新的矩形并清除过去的绘制。 我怎样才能保存它 public partial class Form1 : Form { List<Rectangle> rects = new List<Rectangle>(); Re

我有9个矩形,我需要在它们里面画一个文本,我有两个按钮,它们选择我需要画的文本。 当我点击按钮,然后点击矩形,它将采取鼠标的位置,然后检查在哪个矩形我需要画进去。 当我因为Refresh()需要绘制另一个矩形时,它会绘制新的矩形并清除过去的绘制。 我怎样才能保存它

public partial class Form1 : Form
    {
        List<Rectangle> rects = new List<Rectangle>();
        Rectangle rectangle = new Rectangle();
        string str;
        Point start;
        int x = 0;
        Point[] points=new Point[100];
        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    rects.Add( new Rectangle(130 + (j * 130), 130 + (i * 130), 130, 130));

                }
            }
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            foreach(Rectangle rect in rects)
                    e.Graphics.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height);

           
                getRectangle(rectangle);
                if (rectangle.Width != 0 && rectangle.Height != 0)
                {
                    using (SolidBrush solidBrush = new SolidBrush(Color.DarkGreen))
                    {
                        using (FontFamily fontFamily = new FontFamily("Arial"))
                        {
                            using (Font font = new Font(fontFamily, 20))
                            {
                                e.Graphics.DrawString(str, font, solidBrush, rectangle.X + 55, rectangle.Y + 55);
                            }
                        }
                    }
                }
            
            base.OnPaint(e);
        }

        private void Cross_Click(object sender, EventArgs e)
        {
            str = "X";

        }

        private void Circle_Click_1(object sender, EventArgs e)
        {
            str = "O";
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            start = e.Location;
            points[x] = start;
            x++;
            Invalidate();
        }

        public void getRectangle(Rectangle rectan)
        {
            rectangle.Width = 0;
            rectangle.Height = 0;
            if (str == "X")
            {
                foreach(Rectangle rect in rects)
                        if (rect.Contains(start))
                        {
                            rectangle.X = rect.X;
                            rectangle.Y = rect.Y;
                            rectangle.Width = rect.Width;
                            rectangle.Height = rect.Height;
                          
                        }
            }
            else if (str == "O")
            {
                
                    foreach (Rectangle rect in rects)
                        if (rect.Contains(start))
                        {
                            rectangle.X = rect.X;
                            rectangle.Y = rect.Y;
                            rectangle.Width = rect.Width;
                            rectangle.Height = rect.Height;

                        }
                
            }
        }

    }
公共部分类表单1:表单
{
List rects=新列表();
矩形=新矩形();
字符串str;
起点;
int x=0;
点[]点=新点[100];
公共表格1()
{
初始化组件();
对于(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{
添加(新的矩形(130+(j*130),130+(i*130),130130));
}
}
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
foreach(矩形中的矩形)
e、 图形.绘图矩形(钢笔.黑色,矩形X,矩形Y,矩形宽度,矩形高度);
getRectangle(矩形);
if(rectangle.Width!=0&&rectangle.Height!=0)
{
使用(SolidBrush SolidBrush=新的SolidBrush(Color.DarkGreen))
{
使用(FontFamily FontFamily=新FontFamily(“Arial”))
{
使用(字体=新字体(fontFamily,20))
{
e、 Graphics.DrawString(str、font、solidBrush、矩形.X+55、矩形.Y+55);
}
}
}
}
基础漆(e);
}
私有无效交叉单击(对象发送者,事件参数e)
{
str=“X”;
}
私有无效圆\u单击\u 1(对象发送者,事件参数e)
{
str=“O”;
}
私有void Form1\u MouseDown(对象发送方,MouseEventArgs e)
{
开始=e.位置;
点[x]=开始;
x++;
使无效();
}
公共void getRectangle(矩形rectan)
{
矩形,宽度=0;
矩形,高度=0;
如果(str==“X”)
{
foreach(矩形中的矩形)
if(矩形包含(开始))
{
矩形.X=矩形.X;
矩形Y=矩形Y;
矩形宽度=矩形宽度;
矩形高度=矩形高度;
}
}
否则如果(str==“O”)
{
foreach(矩形中的矩形)
if(矩形包含(开始))
{
矩形.X=矩形.X;
矩形Y=矩形Y;
矩形宽度=矩形宽度;
矩形高度=矩形高度;
}
}
}
}

不确定我是否理解正确,但似乎需要创建一个数据库来将对象保存到中。调查和修改。一旦你熟悉了这些,就可以考虑看看我的老帖子如何从数据库中提取数据。

(SeNoTo:在代码中有很多不同的方法来生成数据库实体,其中之一是,一旦您对SQL感到满意,就应该考虑查看这些选项)

如果要临时保存数据(这意味着在应用程序的运行时),请考虑使用<对象>代码> > <代码> >清单>代码>。然后可以创建一个循环并检索这些对象。像这样:

//create new class
public class Drawing
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public Drawing(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

//Initiate new object
public List<Drawing> drawings = new List<Drawing>();

//Add this to your loop
drawings.Items.Add(new Drawing() { X= YourX, Y= YourY });

//And foreach loop through your drawings to draw them.
foreach(Drawing drawing in drawings)
{
   //Draw your item here.
}
//创建新类
公共类绘图
{
公共int X{get;私有集;}
公共整数Y{get;私有集;}
公共绘图(整数x,整数y)
{
这个.X=X;
这个。Y=Y;
}
}
//启动新对象
公共列表图形=新列表();
//将此添加到循环中
添加(新绘图(){X=YourX,Y=YourY});
//然后foreach循环绘制图形。
foreach(图纸中的图纸)
{
//在这里画你的物品。
}

构建一个可以存储矩形及其相关文本的类对象。使用
列表
而不是简单的
列表
。然后,可以将要绘制的文本与包含该文本的矩形形状相关联。您还可以进一步扩展对象描述符(类对象),以包括其他细节:例如,矩形的边框和填充颜色、文本的颜色、笔的大小等。根据新的要求,非常容易扩展。