2011年7月6日水曜日

Windows7のWM_WINDOWPOSCHANGINGではまる。(2)

 以前はまった記事は、こちら

で、ATLのモードレス・ダイアログを表示している場合、親ウィンドウにて長い時間の描画が行われている時に、またまた、WM_WINDOWPOSCHANGING -> WM_WINDOWPOSCHANGED -> WM_WINDOWPOSCHANGING のサイクルが発生し、イベントの無限ループに陥ってしまった。

よくよく観察していると、ATLのモードレス・ダイアログのタイトルに「(応答なし)」という文字が表示されて、ダイアログの位置が、右下にピョコッと動いて、元の位置にピョコッと戻る。こいつが、親ウィンドウの再描画を促して、延々とイベントの無限ループ・・・。

レイアウト固定のツールバーなんで、もしかして、WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED の通知、無視した方がいいんじゃね?と思い。ハンドラを記述した。


BEGIN_MSG_MAP(CFooToolBar)
...
  MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging)
  MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
...
END_MSG_MAP()
...
  LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  LRESULT OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
...
LRESULT CFooToolBar::OnWindowPosChanging(
  UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
  bHandled = TRUE;
  return 0;
}
LRESULT CFooToolBar::OnWindowPosChanged(
  UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
  bHandled = TRUE;
  return 0;
}


とりあえず、こんな措置で回避できた。

0 件のコメント: