【问题标题】:How to keep the image Drawn in PictureBox如何保持在PictureBox中绘制的图像
【发布时间】:2011-05-14 08:12:27
【问题描述】:

大家好,C#.Net 的新人。

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

问题是这样的。

在pictureBox 中,我在PictureBox 上绘制网格线,之后我正在读取一个.map(A Mapper3 文件)并想在网格线上绘制,但是当我绘制地图时,网格线消失了。

我认为问题是因为在我绘制地图时 PictureBox Image 变为空。我该如何克服这个,有什么技巧吗?

感谢您从现在开始的回复,也很抱歉我的英语不好......

我最诚挚的问候...

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    你使用winforms吗?如果是,您实际上不需要工作区的图片框。我认为更合适的是表单或面板上的Graphics 类。由于表单重绘圆圈,您已经丢失了线条,将您的绘图代码放入表单绘制处理程序中,并且在需要时会重新绘制图片。在某些情况下,您可能需要手动触发重绘圆圈,为此您应该使用表单的Invalidate 方法。

    例如,将此代码添加到绘图处理程序:

        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));
            }
        }
    

    您也可以通过这种方式在按钮单击处理程序中使用图形:

    Graphics g = Graphics.FromHwnd(this.Handle);
    
    g.FillEllipse(Brushes.Beige, new Rectangle(10, 10, 10, 10));
    

    但是在这种情况下,您绘制的所有内容都将在表单的重绘循环期间被删除,您将不得不在表单绘制处理程序中重复它

    [编辑] 好的,例如您的表单上有pictureBox1,您可以通过Bitmap 类以这种方式轻松绘制:

    // 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;
    

    在这种情况下,您无需重新绘制绘画,图片框会为您完成。如果您喜欢从图片框下方显示绘画,请不要忘记将BackColor ot图片框设置为Transparent

    【讨论】:

    • 感谢您的回复,是的,我正在使用 winforms,但老实说,我不明白使用 Canvas 类的想法。你能把你的意思说得更宽泛吗?
    • @Un_NatMenDim:首先,对不起我的错误,我把 Canvas 和 Graphics 搞混了。我已经编辑了我的答案
    • 好的,我明白了,图纸保留了,但矩形与pictureBox重叠。问题是我必须在pictureBox中绘制我需要的任何东西,所以PictureBox中的绘图必须保存在某个地方或那种操作,但它是什么?这是问题:)
    • @Un_NatMenDim:好的,现在我得到了你的问题,我再次更新了我的答案
    • 谢谢帮助,我已经做了和你编辑一样的东西。它工作正常,但是当在图片框(例如椭圆)上绘制其他东西时,尽管我将 BackColor 设置为透明,但 Rectangle 仍然消失:/
    【解决方案2】:

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

    祝你好运。

    【讨论】:

    • 感谢您的回复。问题是我没有在 pictureBox_Draw 事件中绘图。我在 button_Click 的事件中绘制地图和网格,我必须使用这些按钮来完成。有没有办法同时使用pictureBox_Draw 和Button_Click 事件?
    • 对不起,我知道这太晚了,我最近不在 stackoverflow,无论如何,你可以在按钮单击事件中绘制图片框,但图片框可能与其他一些窗口重叠,或者你最小化整个窗口,然后将其最大化,因此 PictureBox 需要重绘其图形并引发 Paint 事件,如果您在此处对 PictureBox 进行一些自定义绘图,您应该完成您的工作。
    猜你喜欢
    • 2020-06-17
    • 2018-03-17
    • 1970-01-01
    • 2018-03-16
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多