如何在图片框中绘制圆圈和线条?

Ale*_*xry 14 c# picturebox

如何在图片框中绘制圆圈和线条?

Pau*_*sik 29

要么:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLine(
            new Pen(Color.Red,2f), 
            new Point(0,0), 
            new Point(pictureBox1.Size.Width, pictureBox1.Size.Height ));

        e.Graphics.DrawEllipse(
            new Pen(Color.Red, 2f),
            0,0, pictureBox1.Size.Width, pictureBox1.Size.Height  );
    }
Run Code Online (Sandbox Code Playgroud)

处理图片框的绘画事件并在那里进行自定义绘图.


Chr*_*way 5

最好的方法是不要在画框中画圆和线!它不是为此目的而设计的。

来自鲍勃·鲍威尔(Bob Powell)的GDI +博客:

此问题的根源是Windows编程的基本规则已被破坏。结果,图片盒被指责为实际上不是它的错的东西。为了帮助解释原因,以下四点概述了这种情况下的错误。

  • PictureBox控件用于显示图像。它不是图形表面的方便占位符。

  • Windows是事件驱动的系统,在该系统中,必须在正确的上下文中处理每个事件,并且不得使用旨在处理按钮单击或鼠标移动事件的事件在屏幕上绘画或其他奇怪的东西。

  • PictureBox通过绘制存储在其Image属性中的基于System.Drawing.Image的对象来刷新自身。如果没有图像,它将显示背景色。

  • 窃取和使用任何控件的Graphics对象不是一个好习惯,应极力劝阻并破坏在正确的时间在正确的位置处理事件的规则。基本上,如果这样做,将导致您的痛苦。当您的头撞在墙上时,会导致您疼痛。这表明您应该停止这样做。PictureBox.CreateGraphics调用是相同的。

正确的方法。

遵循事件驱动系统的规则很容易,但是需要一些预见。因此,如果您想绘制一些图形并在窗口向前移动并再次移开或最小化和还原时将其保留在其中,则必须为您想要的任何对象提供Paint事件绘画。PictureBox随身携带了这种应用程序不需要的行李。如果只想在某处绘制某事物,请通过响应Form.Paint事件在表单上绘制它。如果您想要一个方便的占位符用于在设定范围内工作的图形,请使用Panel控件并为其服务Paint事件。如果要一遍又一遍地复制公司形象的图形,请创建一个控件并在OnPaint覆盖中进行绘图。

原始链接(不再有效):http : //bobpowell.net/picturebox.htm

注意:指向鲍勃·鲍威尔博客的原始链接不再起作用。我出于历史目的将其留在这里。截至编辑该帖子之日,仍可以在Internet存档(https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm)上查看页面的内容。

  • -1“ Linkrot” ...并且此答案几乎没有提示问题是什么或该怎么办。“鼓励与外部资源的链接,但是请在链接周围添加上下文,以便您的其他用户可以了解它的含义和原因。请始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。” 来源:http://stackoverflow.com/help/how-to-answer但是我确实找到了保存在“ Wayback Machine”中的水上滑车页面:https://web.archive.org/web/20120216111903/http:// bobpowell.net/picturebox.htm (8认同)
  • +1这确实是正确的答案。感谢您的链接,它描述了根本问题。 (2认同)

Gam*_*nus 1

图片框是一个控件,并且有一个图像作为源 - 因此您必须在图像上绘图并将图像交给控件才能显示它

MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
Run Code Online (Sandbox Code Playgroud)