0

透明なウィンドウで InvalidateRect を呼び出すと、空の更新長方形が表示される理由を理解しようとしています。アイデアは、ウィンドウに何かを描画したことです (描画のアルファが一時的に 1/255 に切り替えられます)。次に、それを完全な透明モード (つまり、アルファが 0) に切り替えて、デスクトップ & デスクトップ上の画面上で図面を移動できるようにします。

描画を移動しようとすると、境界の四角形を取得し、それを使用して InvalidateRect を呼び出します。

InvalidateRect(m_hTarget, &winRect, FALSE);

winRect が実際に正しいこと、m_hTarget が正しいウィンドウであること、およびその四角形が winRect を完全に取り囲んでいることを確認しました。

CWnd から派生した m_hTarget に対応するクラスの OnPaint ハンドラーに入ります。そこで CPaintDC を作成しますが、更新用の四角形 (dcPaint.m_ps.rcPaint) にアクセスしようとすると、常に空になります。この四角形は、画面を更新する必要があるかどうかを判断する関数に渡されます (透明なウィンドウの場合は UpdateLayeredWindow を使用)。

ここで空でない四角形をハードコードすると、残りのコードは正しく機能し、画面上で図面を移動できます。

InvalidateRect で「FALSE」パラメータを「TRUE」に変更しようとしましたが、効果はありませんでした。また、標準の CDC を使用してから、OnPaint ハンドラーで BeginPaint/EndPaint メソッドを使用して、CPaintDC が奇妙なことをしていないことを確認しましたが、同じ結果が得られました。

私が使用しているコードは、もともと不透明なウィンドウ用に設計されたものです。m_hTarget が不透明なウィンドウに対応する場合、同じ関数呼び出しのセットにより、正しい (つまり、空ではない) 四角形が OnPaint に渡されます。ただし、ウィンドウがレイヤー化されると、正しく機能しないようです。

4

1 に答える 1

0

私はそれを理解したと思います-それはWindowsの制限と私が使用している内部フレームワークのいくつかの奇妙なコードの組み合わせです。空の長方形を無視して、代わりに画面全体の長方形を使用する必要があります。正常に機能しているようです。

最初の質問で十分に明確でなかった場合は申し訳ありません。次回はもっと正確にしようと思います。

于 2010-06-09T21:40:52.397 に答える