直接绘制到屏幕后如何清理自己

时间:2010-03-27 00:36:55

标签: c# .net gdi bitblt

我正在使用BitBltGetDC(IntPtr.Zero)直接绘制到屏幕上。当我完成时,是否有某种方法可以在整个屏幕上调用Refresh或Invalidate,这样我就不会在任何地方留下大量的油漆(数字化)?

更新:当你直接画到我正在做的屏幕时,无论你绘制什么,它都会保留在那里直到它下面的窗口重新绘制自己(并且这样做,重新绘制屏幕的一部分它是覆盖层)。

问题是Windows桌面的某些部分不会长时间重新绘制自己。例如,如果我绘制任务栏的顶部,实际任务会很快地重新绘制自己(以及“开始”按钮等),但任务栏本身会保留我所绘制的内容长达几分钟。< / p>

如果我的应用程序有一个覆盖整个屏幕的窗口,我只需在该窗体上调用Invalidate(),这将导致它重新绘制自身,从而整个屏幕。我需要的是在整个屏幕上调用InvalidateRefresh的某种方式。

2 个答案:

答案 0 :(得分:3)

InvalidateRect(NULL, NULL, TRUE)应该使所有窗口无效并重绘。虽然这将是昂贵的操作。

另一种方法是记住你绘制的位置并尝试枚举该矩形中的任何窗口并使其无效。

当您想要在那里使窗口无效时,您还可以尝试在您绘制的区域上创建一个透明窗口。请注意,您希望执行alpha混合分层窗口,而不是WS_TRANSPARENT窗口。如果你以99%的透明度进行,DWM应该在它被破坏后重新绘制它下面的所有窗口。当然,这可能会导致在目标区域上几乎没有可察觉的闪烁,因为在你摧毁它之前窗口会混淆。

答案 1 :(得分:1)

“屏幕”由一组窗口组成,这些窗口是桌面窗口的父级。我想你可以简单地使桌面窗口无效,尽管你可能需要通过其子窗口(顶级应用程序窗口)进行递归并使它们无效。 (mutliple监视器也可能存在问题,但这应该给你一个起点)

请参阅GetDesktopWindow()

或者,创建一个覆盖整个屏幕的表单,并使用透明绘图。然后在完成后关闭fom。