【问题标题】:Drawing over picturebox in C# [closed]在 C# 中绘制图片框 [关闭]
【发布时间】:2015-01-02 07:59:42
【问题描述】:

我正在开发 WinForms 应用程序,但不知道如何解决 PictureBox 的问题。在我的程序中,我使用 PictureBox 作为面板的子控件,并使面板可自动调整大小和自动滚动以显示大图像。现在我需要在 PictureBox 中的图片上绘制一个标记,例如圆圈。标记必须始终位于相对于图片可见部分的相同位置。有没有办法做到这一点?提前致谢。

【问题讨论】:

  • 您是否考虑过覆盖图片框的 Paint 事件?
  • Drawing on PictureBox的可能重复
  • 向我们展示你的努力,你是怎么做到的?
  • “在相对于图片可见部分的相同位置”——这是什么意思?相对于图片本身的相同位置?或者相对于包含图片的Panel 的相同位置(即,因为Panel 定义了“图片的可见部分”)。您的问题需要大量阐述,无论是在代码示例方面还是在明确您实际想要实现的目标方面。
  • 不使用面板的 AutoScrollPosition 将是典型的错误。我们看不到它。

标签: c# winforms


【解决方案1】:

使用Graphics类在PictureBox中绘制,可以从多个控件中获取图形类,具体看你如何获取Graphics类并画圆:

Graphics g = pictBox.CreateGraphics();
Pen pen = new Pen(Color.Red);
g.DrawEllipse(pen, 10, 10, 20, 20);

如果您将使用动画绘图,则需要更快的速度,在这种情况下,更好的方法是使用事件绘制并启用双缓冲,请参阅如何启用双缓冲:

private void Form1_Load(object sender, System.EventArgs e)
{
    DoubleBuffered = true;
    this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
}

使用paint事件可以加快绘制速度,paint函数的参数之一是获取控件的图形类,看这个例子:

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    Graphics g = e.Graphics;
    // Clear picture box with blue color
    g.Clear(Color.Blue);
    // Create a pen to draw Ellipse
    Pen pen = new Pen(Color.Red);
    g.DrawEllipse(pen, 10, 10, 20, 20);
}

要每次使用 Paint 事件进行绘制,您需要在某个循环中调用 pict.Invalidate() 以调用 Paint 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多