0

私は WM_PAINT がウィンドウにそれ自体を完全に再描画する必要があることを伝えていることを知っていますが、明らかにそれは部分的に覆われているときに送信されるメッセージではなく、その前にあったウィンドウはもはや邪魔にならず、再描画する必要があります汚れた部分。この場合、どのメッセージが送信されるか知っている人はいますか?

編集:問題が見つかりました:

この問題には、 SDLレンダリング サーフェスを Delphi フォームに埋め込むために作成した Delphi コントロールが関係していました。SDL には、別のウィンドウの HWND でレンダラーを構築するための API があり、それを「外部ウィンドウ」としてマークします。

SDL は通常、WM_PAINT内部で処理するため、SDL の WindowProc にコードを追加して、外部ウィンドウの場合は外部 WindowProc にメッセージを転送する必要がありました。それは時々機能していましたが、ウィンドウのデータ構造から外部ウィンドウフラグを削除する不具合があったことが判明したため、メッセージをアプリに渡す代わりに飲み込んでいました. それを修正したら、WM_PAINT常にメッセージを受け取り始めました。

4

5 に答える 5

1

WM_PAINTウィンドウの一部 (全体を含む) を再描画する必要があることを示すために送信されます。

GetUpdateRect()を呼び出して、更新する領域の境界となる四角形を取得します。この情報は、 BeginPaint()に渡される PAINTSTRUCT (rcPaint フィールドとして) にも含まれます。

于 2009-11-23T03:59:43.883 に答える
1

どうやらそうではないと言えるのはなぜですか?部分的な再描画にはWM_PAINTを呼び出す必要があります (更新された四角形はBeginPaintまたはGetUpdateRectによって返されます)。呼び出されていないように見える場合は、アプリの別の場所にバグがあり、呼び出しを妨げている可能性があります。それが機能していないと信じるように導くものは何ですか?

于 2009-11-23T04:01:43.987 に答える
0

をご覧くださいWM_PRINTCLIENT。が送信されず、代わりにメッセージが送信される場合WM_PAINTがあります。WM_PRINTCLIENTAnimateWindow例えば。)

于 2009-11-24T02:28:33.180 に答える
0

WM_PAINTWin32 API は部分的な再描画にも使用できると確信しています。MSDNから:

このWM_PAINTメッセージは、システムまたは別のアプリケーションがアプリケーションのウィンドウの一部を描画する要求を行ったときに送信されます。[私の斜体]。

そのリンクには完全な詳細WM_PAINTがありますが、あなたが言うように、WM_PAINTメッセージが部分的な再描画のために送信されていない場合、 Spy ++は確実に見つける必要があるツールです.

于 2009-11-23T03:58:45.123 に答える
0

BeginPaint() 関数は、2 番目のパラメーターで検証が必要な rect を返します: http://msdn.microsoft.com/en-us/library/dd183362(VS.85).aspx

case WM_PAINT:
{
PAINTSTRUCT psPaint;
HDC hdc = BeginPaint( hwnd, &psPaint );
// psPaint.rcPaint contains invalidated area
EndPaint (hwnd, &psPaint);
}
return 0;

psPaint.rcPaint を見てください: http://msdn.microsoft.com/en-us/library/dd162768(VS.85).aspx

于 2009-11-23T03:59:40.283 に答える