2

我正在使用BitBltand直接在屏幕上绘图GetDC(IntPtr.Zero)。完成后是否有某种方法可以在整个屏幕上调用 Refresh 或 Invalidate,这样我就不会在各处留下大块油漆(从数字上讲)?

更新: 当您像我正在做的那样直接在屏幕上绘制时,无论您绘制什么都保留在那里,直到它下面的窗口重新绘制自身(并且这样做,重新绘制它所覆盖的屏幕部分)。

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

如果我的应用程序有一个覆盖整个屏幕的窗口,我只会调用Invalidate()该表单,这会导致它重新绘制自身并因此重新绘制整个屏幕。我需要的是某种调用方式InvalidateRefresh整个屏幕本身。

4

2 回答 2

3

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

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

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

于 2010-04-02T06:11:25.147 回答
1

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

请参阅GetDesktopWindow()

或者,创建一个覆盖整个屏幕的表单,并使用透明绘图。完成后只需关闭窗体即可。

于 2010-03-29T21:08:32.570 回答