Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我直接在屏幕上绘图时,如何清理_C#_.net_Gdi_Bitblt - Fatal编程技术网

C# 当我直接在屏幕上绘图时,如何清理

C# 当我直接在屏幕上绘图时,如何清理,c#,.net,gdi,bitblt,C#,.net,Gdi,Bitblt,我使用BitBlt和GetDC(IntPtr.Zero)直接绘制到屏幕上。当我完成后,是否有办法在整个屏幕上调用刷新或无效,这样我就不会在任何地方留下大块的油漆(从数字上讲) 更新:当你像我这样直接画到屏幕上时,你画的任何东西都会保留在屏幕上,直到它下面的窗口重新绘制自己(这样做,重新绘制它覆盖的屏幕部分) 问题是windows桌面的某些部分在很长一段时间内不会重新绘制。例如,如果我在任务栏顶部绘制,实际任务会很快地重新绘制自己(以及“开始”按钮等),但任务栏本身会保留我绘制的内容长达几分钟 如

我使用
BitBlt
GetDC(IntPtr.Zero)
直接绘制到屏幕上。当我完成后,是否有办法在整个屏幕上调用刷新或无效,这样我就不会在任何地方留下大块的油漆(从数字上讲)

更新:当你像我这样直接画到屏幕上时,你画的任何东西都会保留在屏幕上,直到它下面的窗口重新绘制自己(这样做,重新绘制它覆盖的屏幕部分)

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

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

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

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

将使所有窗口无效并重新绘制。虽然这将是昂贵的操作

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


如果要使绘制的区域中的窗口无效,也可以尝试在该区域上创建一个透明窗口。请注意,您希望执行alpha混合分层窗口,而不是WS_透明窗口。如果以99%的透明度进行操作,DWM应在销毁后重新绘制其下方的所有窗口。当然,这可能会导致目标区域几乎无法察觉到闪烁,这是由于在销毁窗口之前窗口的字母混合造成的。

您能更具体一点吗?您正在绘制的位置/内容,以及您希望使哪些区域完全无效?(例如,您是否希望某些窗口重新绘制?如果是,哪些窗口?等等)您可能希望执行GetWindowDC(GetDesktopWindow())为了让你的代码更清晰,并确保你不受支持地使用魔法值不会让你的应用程序崩溃。他可能只需要枚举所有窗口并使每个窗口中的清理矩形无效。广播
WM_PAINT
在过去也很管用,但几乎可以肯定,这太过分了。看起来这会管用的。价钱贵不要紧,因为我只打一次电话。我正在做的是渲染一个全屏动画,所以我只需要在动画完成后重新绘制整个屏幕一次。