C# 如何保持在PictureBox中绘制的图像

C# 如何保持在PictureBox中绘制的图像,c#,winforms,C#,Winforms,大家好,C#Net的新成员 我正在尝试制作一个像Ms Paint这样的应用程序,当然要简单得多,我被卡住了 问题是这个 在pictureBox中,我在pictureBox上绘制网格线,然后我读取.map(一个Mapper3文件)并希望绘制网格线,但当我绘制地图时,网格线消失了 我想问题是因为在我绘制地图时,PictureBox图像变为空。我怎样才能克服这个问题,有什么诀窍吗 谢谢你从现在开始的回复,很抱歉我的英语不好 向您问好……您使用winforms吗?如果是,您实际上不需要工作区的图片框。我

大家好,C#Net的新成员

我正在尝试制作一个像Ms Paint这样的应用程序,当然要简单得多,我被卡住了

问题是这个

在pictureBox中,我在pictureBox上绘制网格线,然后我读取.map(一个Mapper3文件)并希望绘制网格线,但当我绘制地图时,网格线消失了

我想问题是因为在我绘制地图时,PictureBox图像变为空。我怎样才能克服这个问题,有什么诀窍吗

谢谢你从现在开始的回复,很抱歉我的英语不好


向您问好……

您使用winforms吗?如果是,您实际上不需要工作区的图片框。我认为更合适的方式是以表格或小组形式上课。由于表单重新绘制循环,您丢失了行,请将绘图代码放入表单绘制处理程序中,并在需要时重新绘制图片。在某些情况下,您可能需要手动触发重新绘制循环,为此,您应该使用表单的方法

例如,将以下代码添加到绘制处理程序:

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        // Drawing vertical lines
        for (int x = 5; x < this.ClientRectangle.Width; x+=5)
        {
            e.Graphics.DrawLine(Pens.Gray, new Point(x, 0), new Point(x, this.ClientRectangle.Height));
        }

        // Drawing horisontal lines
        for (int y = 5; y < this.ClientRectangle.Width; y += 5)
        {
            e.Graphics.DrawLine(Pens.Gray, new Point(0, y), new Point(this.ClientRectangle.Width,y));
        }
    }
但在这种情况下,在窗体的重新绘制循环中,您绘制的所有内容都将被删除,并且您必须在窗体绘制处理程序中重新绘制它

[编辑] 好的,例如,您的表单上有pictureBox1,您可以通过以下方式在类的帮助下轻松绘制:

Graphics g = Graphics.FromHwnd(this.Handle);

g.FillEllipse(Brushes.Beige, new Rectangle(10, 10, 10, 10));
// Draw into bitmap
Bitmap bmp = new Bitmap(150, 150);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.Green, new Rectangle(25, 75, 10, 30));

// Set bitmap into picture box
pictureBox1.Image = bmp;

在这种情况下,您无需重新绘制您的绘画,picture box将为您完成此操作。如果您希望从图片框的下方显示图片,请不要忘记将图片框的背景色设置为透明。

每当出现绘制事件时,您必须绘制包括网格线在内的所有内容,如果您担心性能,您可能会检测到剪切区域并仅绘制该部分


祝你好运。

谢谢你的回复,是的,我正在使用winforms,但老实说,我不明白使用Canvas类的想法。你能把你的意思说得更宽些吗?@Un_NatMenDim:首先,对不起,我弄错了,我把画布和图形弄乱了。我已经编辑了我的答案,我明白了,图纸保留了下来,但矩形与图片盒重叠。问题是我必须在pictureBox中绘制我需要的任何东西,所以pictureBox中的绘图必须保存在某个地方或类似的操作中,但它是什么?问题是:)@Un\u NatMenDim:好的,现在我知道你的问题了,我再次更新了我的答案。为了寻求帮助,我已经做了与你编辑的相同的事情。它工作得很好,但是当在pictureBox上绘制另一个对象(例如椭圆)时,矩形仍然会消失,尽管我将BackColor设置为Transparent:/Thax作为回复。问题是我不是在画框画画活动中画画。我在button_Click的事件中绘制地图和网格,我必须使用这些按钮。有没有办法同时使用pictureBox\u Draw和Button\u Click事件?对不起,我知道这太晚了,我最近不在stackoverflow附近,无论如何,您可以在按钮单击事件中在PictureBox上绘制,但PictureBox可能与其他一些窗口重叠,或者您最小化整个窗口,然后将其最大化,因此PictureBox需要重新绘制其图形,并引发绘制事件,如果您在此处对PictureBox进行自定义绘制你应该做好你的工作。