C# 如何有选择地重新绘制形状以保持其他形状的完整性

C# 如何有选择地重新绘制形状以保持其他形状的完整性,c#,graphics,custom-controls,windows-ce,C#,Graphics,Custom Controls,Windows Ce,我正在使用自定义控件开发WindowCE应用程序 在自定义控件中,我手动绘制三个圆(一个圆填充)、一个箭头、一个文本和一条线。它就像Photoshop中的角度选择器 现在,当我移动光标时,完成控件重画并产生闪烁效果 我曾经尝试过使用e.drawimage()方法先绘制控件位图,然后在最后一次绘制此位图,但同样存在闪烁问题 现在我只有2个形状(箭头+直线)需要重新绘制,其他的是静态行为的 所以,我的问题是,有没有办法选择性地画出形状,保持其他形状不变。第一次画所有形状,但只画箭头和线,然后保持所有

我正在使用自定义控件开发WindowCE应用程序

在自定义控件中,我手动绘制三个圆(一个圆填充)、一个箭头、一个文本和一条线。它就像Photoshop中的角度选择器

现在,当我移动光标时,完成控件重画并产生闪烁效果

我曾经尝试过使用e.drawimage()方法先绘制控件位图,然后在最后一次绘制此位图,但同样存在闪烁问题

现在我只有2个形状(箭头+直线)需要重新绘制,其他的是静态行为的

所以,我的问题是,有没有办法选择性地画出形状,保持其他形状不变。第一次画所有形状,但只画箭头和线,然后保持所有其他形状在那里的位置完好无损

这就是我在做的事情

计划覆盖方法。

using (SolidBrush inLineFill = new SolidBrush(circleColor))
{
  Point[]  polyPoints = ...;                              
  e.Graphics.DrawLine(....);
  e.Graphics.FillPolygon(inLineFill, polyPoints);
  if (firstTime)
  {
    e.Graphics.DrawEllipse(...);
    e.Graphics.DrawEllipse(...);
    e.Graphics.DrawEllipse(...);
    e.Graphics.FillEllipse(...);
    e.Graphics.DrawString(...);
    firstTime = false ;
  }
}

我第一次看到完整的控件,但我只看到后面带线的箭头。

可能有几种方法可以改进行为

  • 覆盖OnPaintBackground并将其保留为空
  • 缓存该SolidBrush,而不是每次调用OnPaint时都创建一个新的SolidBrush
  • 将所有静态形状绘制到缓存的成员级位图。在OnPaint中,绘制该图像的图像,然后绘制箭头和线(变化的内容)
  • 将所有这些图形绘制到位图(缓存,而不是每次都创建),然后将其绘制到屏幕图形
  • 若你们并没有重叠的东西,并且你们有合理的矩形区域,那个么设置一个剪辑区域来包围你们的修改将防止不必要的绘制

您需要在
OnPaint
中进行完全重画,但您可以通过使用
Invalidate(rect)
重新绘制部分屏幕来减少重画。或者在
图形
对象上设置适当的剪辑边界。请您解释一下将OnPaintBackground override保留为空的逻辑。如果您不需要背景(例如,您在OnPaint中绘制的东西非常常见),那么它只会添加一些开销绘制的东西,然后手动绘制。用一个空的实现覆盖它通常会自动消除闪烁。