MFC で作成した クラシックのドッキング可能ツールバーの描画が崩れる

適用対象: Visual Studio 2012 Premium

現象


Windows 8 にて、クラシックのドッキング可能ツールバー (CToolBar) を利用した MFC アプリケーションを利用すると、ツールバーの位置を変更する時、ツールバーの描画が崩れる場合があります。

原因


Widnows 8 の再描画のタイミングと クラシックのドッキング可能ツールバー の再描画のタイミングがずれることにより発生します。

回避策


OnWindowPosChanged メッセージ ハンドラー を利用して、ツールバーの位置を変更した後に明示的な再描画を行うことにより、ツールバーが崩れず描画を行うことができます。


1) Visual Studio のメニューより「プロジェクト」「クラスの追加」を選択します。

2) 次の項目を選択します。

      カテゴリ: MFC
      テンプレート: MFCクラス


3) [追加]ボタンを押します。

4) MFC クラス ウィザード にて、次の項目を入力します。

      クラス名: CMyToolBar
      基本クラス: CToolBar


5)[完了]ボタンを押し、 MyToolBar.h と  MyToolBar.cpp を作成します。

6) MyToolBar.h に次のコードを追加します。

      public:
           afx_msg void OnWindowPosChanged(WINDOWPOS* lpwndpos);



7) MyToolBar.cpp のメッセージマップに ON_WM_WINDOWPOSCHANGED() を追加します。

      BEGIN_MESSAGE_MAP(MyToolBar, CToolBar)
          ON_WM_WINDOWPOSCHANGED()   // 追加
      END_MESSAGE_MAP()


8) MyToolBar.cpp にCMyToolBar::OnWindowPosChanged のコードを追加します。

      // 以下のコードを追加
       void CMyToolBar::OnWindowPosChanged(WINDOWPOS* lpwndpos)
       {
          CToolBar::OnWindowPosChanged(lpwndpos);

          if (AfxGetMainWnd()->GetSafeHwnd() != NULL)
          {
               Sleep(20);
               AfxGetMainWnd()->RedrawWindow();
           }
     }


9) MainFrm.h に次のコードを追加します。

      #include "MyToolbar.h"


10) MainFrm.h の m_wndToolBar を CToolBar から 作成したクラス CMyToolBar に変更します。

      CMyToolBar        m_wndToolBar;





クラシックのドッキング可能ダイアログバー (CDialogBar) を利用した MFC アプリケーションでダイアログバーの位置を変更した場合でも、Windows 8 で同様に描画が崩れる場合を確認しています。
その場合においては、本技術情報での記載と同様に、ダイアログバーについても回避策を適用する必要があります。

状況


この動作は、Windows 8 の仕様です。