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

現象
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 の仕様です。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2873297 - 最終更新日: 09/29/2016 15:05:00 - リビジョン: 3.0

Microsoft Visual Studio 2005 Service Pack 1, Microsoft Visual Studio 2008 Service Pack 1, Microsoft Visual Studio 2010 Service Pack 1, Microsoft Visual Studio Premium 2012, Microsoft Visual Studio Professional 2012

  • KB2873297
フィードバック