0

ウィンドウに送信された奇妙な発信WM_PAINTメッセージについて質問があります。これはWindows7で発生し、 WindowsXPでは発生しません。

詳細

私のプログラムには、GUIの更新をトリガーするタイマーがあり、タイマーは次のAPI呼び出しに基づいています。

CreateTimerQueueTimer

タイマーの有効期限を処理するためにシステムに提供されたスレッドで、いくつかのGUI更新を行います。つまり、ウィンドウ(0,0)->(57,50)に線を描画します。

HDC hdc = GetDC (hwnd);
MoveToEx (hdc, 0, 0, NULL);
LineTo (hdc, 57, 50);
ReleaseDC(hwnd,hdc);

はWindowsXPで期待どおりに機能しますが、Windows7では、これにより、システムはWM_PAINTメッセージを更新領域(0,0,58,51)でこのウィンドウに送信します。長方形は、線の影響を受ける正方形の領域よりも1ピクセル広いことに注意してください。

この図面のために到着したこのWM_PAINTは、私には理解できません。ウィンドウはタッチ/オーバーラップ/サイズ変更などされていません。どうやら、この線は長方形の無効化としてシステムによって認識されます。

そして、これはWindows 7の場合にのみ発生します(Windows XPではありません)。

質問

W7でのWDMまたはWindowsの処理について何か新しいことはありますか?これを回避する方法はありますか?

プログラムまたは使用しているグラフィックツールキット(あるいはその両方)のバグである可能性があります。しかし、なぜそれがWindows7でのみ現れるのでしょうか。

手がかりをありがとう!

デニーズ

4

1 に答える 1

2

サイキックデバッグ時間(言い換えれば、私は完全に推測しています)...

ウィンドウのコンテンツは、ウィンドウを作成したスレッドからのみ更新できることに注意してください。ウィンドウを作成したスレッド以外のスレッドからGetDC().. ReleaseDC()を呼び出している場合、問題が発生していることに驚いていません。

Vista / Win7のタイマーAPIの実装は、XPのタイマーAPIとはまったく異なります。タイマーが、別のスレッドで実行されている可能性があります。

タイマーを引き込む代わりに、タイマーが作動したことを示すメッセージをウィンドウに投稿してみませんか。次に、メッセージハンドラーで、ウィンドウの領域を無効にします。次に、WM_PAINTハンドラーで線の描画を処理します。

一般に、他のウィンドウメッセージの間にペイントする代わりに、WM_PAINTハンドラーでウィンドウにペイントすると、Windowsの方がはるかに幸せです。

于 2011-04-16T22:01:45.487 に答える