2

BitBltと を使用して画面に直接描画していますGetDC(IntPtr.Zero)。完了時に画面全体で Refresh または Invalidate を呼び出す方法はありますか?

更新: 私のように画面に直接描画すると、描画したものは、その下のウィンドウが再描画されるまでそこに残ります(そうすることで、それが覆っている画面の部分が再描画されます)。

問題は、Windows デスクトップの一部が長期間再描画されないことです。たとえば、タスク バーの上に描画すると、実際のタスクは ([スタート] ボタンなどと共に) かなりすばやく再描画されますが、タスク バー自体は描画した内容を数分間保持します。

アプリに画面全体をカバーするウィンドウがある場合、Invalidate()そのフォームを呼び出すだけで、それ自体が再描画され、画面全体が再描画されます。私が必要としているのは、何らかの方法で呼び出すInvalidateRefresh、画面全体で行うことです。

4

2 に答える 2

3

InvalidateRect(NULL, NULL, TRUE)すべてのウィンドウを無効にして再描画する必要があります。高価な操作になりますが。

別のアプローチは、描画した場所を覚えて、その長方形内のウィンドウを列挙し、それらのみを無効にすることです。

ペイントした領域のウィンドウを無効にしたい場合は、その領域に透明なウィンドウを作成してみることもできます。WS_TRANSPARENTウィンドウではなく、アルファブレンドされたレイヤードウィンドウを実行することに注意してください。99%の透明度でそれを行う場合、DWMは、破棄されたら、その下のすべてのウィンドウを再描画する必要があります。もちろん、これにより、ウィンドウを破棄する前にウィンドウがアルファブレンドされるため、ターゲット領域でほとんど知覚できないちらつきが発生する可能性があります。

于 2010-04-02T06:11:25.147 に答える
1

「画面」は、デスクトップ ウィンドウを親とする一連のウィンドウで構成されます。単純にデスクトップ ウィンドウを無効にできると思いますが、その子ウィンドウ (最上位のアプリケーション ウィンドウ) を再帰してそれらも無効にする必要があるかもしれません。(複数のモニターでも問題が発生する可能性がありますが、これが出発点になるはずです)

GetDesktopWindow()を参照してください。

または、画面全体を覆うフォームを作成し、透過描画を使用します。完了したら、フォームを閉じます。

于 2010-03-29T21:08:32.570 に答える