如何只清除绘图字符串而不重绘背景图像?
How to clear only drawing strings without redrawing the background image?
我正在绘制所有内容(图像和所有字符串),但是当我绘制图像时,它会加载我的处理器并闪烁图像,这是我不想要的两件事。 ..
为了解决这个问题,我尝试了这个:
- 将主图设置为背景图然后在其上绘制,但是当您尝试"Clear(color.transparent)"时,它变成全黑并且您必须重新绘制
- 在主 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事件使绘制无效,确保您的控件不在无限冗余循环中。每个事件一次又一次地调用另一个事件。如果不是那么:
在另一台机器上尝试您的应用程序,以确保您的主机器没有硬件问题。也许是时候进行新的设置了 :).
我正在绘制所有内容(图像和所有字符串),但是当我绘制图像时,它会加载我的处理器并闪烁图像,这是我不想要的两件事。 ..
为了解决这个问题,我尝试了这个:
- 将主图设置为背景图然后在其上绘制,但是当您尝试"Clear(color.transparent)"时,它变成全黑并且您必须重新绘制
- 在主 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事件使绘制无效,确保您的控件不在无限冗余循环中。每个事件一次又一次地调用另一个事件。如果不是那么:
在另一台机器上尝试您的应用程序,以确保您的主机器没有硬件问题。也许是时候进行新的设置了 :).