图片框上的图形不会显示,如果是,它们会在消失之前闪烁

本文关键字:如果 闪烁 消失之前 显示 图形 | 更新日期: 2023-09-27 18:34:15

我正在开发一个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();
}
图片

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

我能够通过使用由按钮启动的计时器来解决此问题,然后在停止自身之前执行图形绘图,但是这似乎是一个糟糕的解决方案,我想以更好的方式做到这一点,如果存在的话,因为这可能导致缺乏对旧计算机的可移植性。

提前致谢

图片框上的图形不会显示,如果是,它们会在消失之前闪烁

您需要为 PictureBox 的 Paint 方法注册一个处理程序,并在该方法中执行绘图。 (注意:使用通过 PaintEventArgs 参数传入的图形对象。 这将保证每当重新绘制 PictureBox 时,您的绘图代码也会运行。 否则,您只是在绘制由于多种原因中的任何一种而刷新的内容的顶部。

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

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

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

  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;

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