2016-04-29 4 views
2

すべてのマウス移動イベントで、私はウィンドウを移動しています。ドキュメントから、移動が成功すると、SetWindowPosはゼロ以外の値を返します。SetWindowPosペイントはすぐに行われます

私は、SetWindowPosがゼロ以外の値を返すたびに、その動きはすでに起こっているという私の推論を確認したかったのです。つまり、ウィンドウは実際には新しい位置に再描画され、その後は関数が返されます。関数が返った後で、後で(何らかの種類のメッセージが処理されるときに)少し時間がかかることはありません。

答えて

3

を呼び出した後、私は、毎回SetWindowPosがゼロ以外の値を返すという動きを私の推論を確認したかったですすでに起こっています。つまり、窓は実際に再塗装されました。

これは誤った仮定です。成功した移動と非ゼロ復帰は、ペイントとは関係ありません。

APIが位置を変更し、戻り値がゼロ以外の場合、新しい値が受け入れられたことを確認します。 APIは、実行の一部として完全な再描画サイクルを実行しないと約束していません。さらに、位置の変更、Zオーダーなどは他のウィンドウの可視性に影響を与える可能性が高く、再描画が必要であり、順番にそれぞれのスレッドで発生する必要があります。再塗装は予定されており、返品はSetWindowPosと同期されていません。 MSDNのドキュメントには、再ペイント/アップデートに関する約束はありません。 APIからのゼロリターンは、引数がまったく受け入れられないことを示しています(無効なウィンドウハンドルが原因です)。

Bonus reading

あなたはSetWindowPos関数を呼び出すときは、ウィンドウマネージャは、ウィンドウのサイズ、位置、何を更新し、それが操作の影響を受けたウィンドウを再描画を一周。 デフォルトでは、SetWindowPos関数は返される前にウィンドウのクイックレペントを行います。関数が返った後、通常のWM_PAINTメッセージはウィンドウを描画する実際の作業を行います。クイック再ペイントは、ウィンドウがサイズ、位置などを変更したという即時のフィードバックがあるように行われます。

+0

ボーナスレディングは興味深いものです。私はリンクを介して読んでいたが、私は明確ではなかった。「速い再描写」と「実際の絵画」との違いは何か。 – TheBlueNotebook

+1

重要なのは、実際のペイント(WM_PAINT)は、ここでクイックレペントと呼ばれるものの一部ではないことです。もう一つの明白なことは、「ドラッグ中にウィンドウの内容を表示する」チェックボックスをオフにすると、実際のペイントなしでポジションが変化し、2つのペイントが必ずしも緊密に接続されているとは限りません。 –

2

SetWindowPosは、istジョブが完了した後にimidialtyを返します。

しかし、WM_NCPAINTとWN_PAINTがウィンドウによって受信されるまで、メインペインティングは拒否されます。私の経験から、フレームの変更はSetWindowPosによって直接描画されることが多いと言えます。

あなたは窓を完全に再描画コールUpdateWindowまたはRedrawWindow(適切なフラグ付き)をしたい場合はSetWindowPos

+0

これはなんですか?塗料は延期されているか、直接描かれていますか? – EJP

+0

@EJP:_and_、_or_ではありません。この回答は 'WM_PAINT'は延期されていますが、' WM_NCPAINT'は即時です。 – MSalters

+0

私は、タブ付きのUIがウィンドウを隠していて、後でそれらを再び表示している場合がありました。 SW_SHOW、SetWindowPos、およびInvalidateRectを使用しているにもかかわらず、再度表示することが再描画されないことがありました。 hwnd、NULL、NULL、RDW_INVALIDATEを伴うRedrawWindowの追加| RDW_UPDATENOWはそれを修正しました。奇妙な非再描画問題の可能性のある修正として注目されています。 –

関連する問題