如何只清除绘图字符串而不重绘背景图像?

How to clear only drawing strings without redrawing the background image?

我正在绘制所有内容(图像和所有字符串),但是当我绘制图像时,它会加载我的处理器并闪烁图像,这是我不想要的两件事。 ..

为了解决这个问题,我尝试了这个:

  1. 将主图设置为背景图然后在其上绘制,但是当您尝试"Clear(color.transparent)"时,它变成全黑并且您必须重新绘制
  2. 在主 PictureBox 上添加另一个 PictureBox,但是这样做时,前面的图像会隐藏所有内容(如图 2 所示)

注意:背景图像是静态的,永远不会改变,唯一会改变的是拉绳的...

请考虑以下可能会帮助您解决问题的代码片段。

Private ReadOnly backImage As Bitmap = 'The path of your background image.

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    Dim srcRect As New Rectangle(0, 0, backImage.Width, backImage.Height)
    Dim desRect As Rectangle = PictureBox1.ClientRectangle

    Using bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Using G As Graphics = Graphics.FromImage(bmp)
            G.SmoothingMode = SmoothingMode.HighQuality
            G.Clear(Color.Transparent)
            G.DrawImage(backImage, desRect, srcRect, GraphicsUnit.Pixel)
            G.DrawString("0.00", New Font("Arial", 12, FontStyle.Regular), Brushes.Red, desRect.Right - 80, 35)
            'and the other overlay painting ....
        End Using

        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic
        e.Graphics.DrawImageUnscaled(bmp, 0, 0)
    End Using
End Sub

我不知道你是如何更新你的绘画程序的,也不知道你剩下的代码是否对绘画有影响。我认为提到的代码片段绰绰有余。这是一个快速演示,每 100 毫秒 使 (不刷新)绘画无效:

你看到有闪烁吗?这是我的任务管理器的读数,而演示是 运行:

几乎没有。

我建议:

  • 如果通过输入控件的TextChangedand/orValueChanged事件使绘制无效,确保您的控件不在无限冗余循环中。每个事件一次又一次地调用另一个事件。如果不是那么:

  • 在另一台机器上尝试您的应用程序,以确保您的主机器没有硬件问题。也许是时候进行新的设置了 :).