2010年9月15日水曜日

windows7 の WM_WINDOWPOSCHANGING ではまる。

 なんかしらんが、アプリケーションが再描画を繰り返して止まらなくなってしまうという変な現象に出くわした。
アプリケーションは、Delphi で記述されている。Windows XP では、このような現象は起こらない。
まず、Spy++ で何が起こっているのか探ってみると、
WM_WINDOWPOSCHANGING
  WM_NCCALCSIZE
  WM_NCPAINT
  WM_ERASEBKGND
  WM_WINDOWPOSCHANGED
  WM_SIZE
  ...
というようなメッセージが送られていた。
元凶は、一番上の WM_WINDOWPOSCHANGING だ。

 どんな時に、この現象が起こるか?というと、Delphi のフォームで StayOnTop なダイアログをモードレスで表示した時であった。アホみたいにウィンドウもあるので、どいつが犯人なのかお手上げに近い。何か手がかりはないか?と探して

たいぶろぐさんの情報を見つけた。

SetParent API をコールすると、WM_WINDOWPOSCHANGING のメッセージがもれなくプレゼントされるようだ。

今回の現象が、このケースに該当するのかどうかは、置いておいて、ウィンドウのZオーダー絡みである事は関係しそうな気がしている。しかし、こんな微妙なメッセージの妙で、破綻するとは…モゲー

2010/09/16 追記:OnSize のイベントで、サイズに変更があったかどうかチェックを行い、変更が無い場合には何もしないように処理をすると、この無限連鎖を回避できた。全くもって謎だ…。ちなみに、この処理を行ったのは COM コンポーネントなので、描画のイベントで誰かが何かしているのかも…。

0 件のコメント: