1

我正在开发一个 Windows 窗体应用程序,当我使用图片框System.Drawing.Graphics顶部的图形时,图形要么不出现,要么仅在消失前短暂出现。

这是我用来设置图片框的代码(它是一个简化版本,仍然表现出这种行为)

private void showGraphic()
{
    pictureBox1.Invalidate();
    System.Drawing.Graphics graphics = this.pictureBox1.CreateGraphics();
    SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(100,100, 50, 50);

    graphics.FillEllipse(semiTransBrush, rect);
}

private void button1_Click(object sender, EventArgs e)
{
    showGraphic();
}

图片框的设置只是属性窗格中声明的文件中的图片的默认设置。

我可以通过使用一个由按钮启动的计时器来解决这个问题,然后在停止之前执行图形绘制,但这似乎是一个糟糕的解决方案,我想用更好的方法来解决这个问题,如果存在的话可能会导致缺乏对旧计算机的便携性。

提前致谢

4

3 回答 3

2

您需要为 PictureBox 的 Paint 方法注册一个处理程序并在该方法中进行绘图。(注意:使用通过 PaintEventArgs 参数传入的 Graphics 对象。)这将保证无论何时重绘 PictureBox,您的绘图代码都会运行。否则,您只是在绘制由于多种原因而会被刷新的东西。

一旦您注册了 Paint 事件,只要您想重新绘制,请在 PictureBox 上调用 Invalidate(),然后您的绘制代码就会运行。您可以跟踪是否应通过私有布尔成员变量绘制叠加图形。

于 2014-12-15T19:30:17.433 回答
0

当你调用pictureBox1.Invalidate()它时,它会排队一条消息,需要绘制图片框。在处理该消息之前,您将在当前图片上绘制一个椭圆。然后消息循环然后处理来自无效的绘制消息,然后重新绘制自身(这会删除你的图像)

于 2014-12-15T19:30:32.433 回答
0

为了使这个(旧的和已回答的)问题更完整,我添加了一个替代解决方案:有时您不希望每次刷新都重新绘制图片,例如,如果绘图很复杂并且需要时间。对于这些情况,您可以尝试以下方法:

  1. 以图片框的大小创建一个新的位图。
  2. 在位图上绘制。
  3. 将位图设置为图片框图像。

例如:

// create a new bitmap and create graphics from it
var bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
var graphics = System.Drawing.Graphics.FromImage(bitmap);

// draw on bitmap
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(100,100, 50, 50);
graphics.FillEllipse(semiTransBrush, rect);

// set bitmap as the picturebox's image
pictureBox1.Image = bitmap;

使用上面的代码,您可以绘制一次所有内容,并且它将在重绘事件中幸存下来。

于 2019-06-01T14:08:18.707 回答