透明なウィンドウで 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 に渡されます。ただし、ウィンドウがレイヤー化されると、正しく機能しないようです。