Windows8 上で CMFCColorDialog を使用して、カラーダイアログを表示すると内部のタブの情報が正常に表示されない

 

こんにちは。Visual Studio サポート チームです。
Windows8 上で CMFCColorDialog を使用して、カラーダイアログを表示すると以下のように内部のタブの下の部分の情報が正常に表示されないことがあります。

 

 

 

 

*カスタムタブでは、[明るさ(L)]、[青(B)] が表示されません。

 

原因について

本現象は、Windows 8 のフォントにおける仕様変更の影響で発生しています。
Windows 8 ではフォント自体のデザインなどの変更により、ダイアログの縦横比、および文字列のサイズが Windows 7 以前のバージョンと異なる場合があります。

Windows 8 および Windows Server 2012 では、システム フォントがメイリオ UI に変更されているため、CPropertySheet クラスなどの MFC で用意されているプロパティ シートのように、OS のダイアログ リソースを使用している場合には、使用されていたフォントも、従来の OS のフォントからメイリオ UI へ変更されることとなり、表示の差異の原因となります。

CMFCColorDialog では、ダイアログ内で表示されるタブ ウィンドウを作成する際には、CMFCColorPropertySheet というクラスを使用しており、このクラスは CPropertySheet を継承しているため、CMFCColorDialog を表示した際にはタブ ウィンドウ内の表示が OS のデザインに依存し、実行環境により表示結果が異なります。

なお、Windows 8 および Windows Server 2012 でのフォント変更とその影響について、以下の技術資料 P.34 の[影響]に記述があります。

  Windows 8 と Windows Server 2012 の互換性クックブック
  <https://www.microsoft.com/ja-jp/download/details.aspx?id=27416>

 

対処方法について

CMFCColorDialog クラスを継承したクラスを作成し、ダイアログを表示する際にデフォルトのダイアログ ボックスの縦の長さを変更し、一部表示がされていない部分を表示する方法を紹介します。

 

- 概要について
1. CMFCColorDialog クラスを継承した CMyColorDialog クラスを作成し、OnInitDialog 関数をオーバーライドします。

 

2. OnInitDialog 関数で、ダイアログ、タブのサイズを取得し、指定したサイズ分拡張します。

BOOL CMyColorDialog::OnInitDialog()
{
      CMFCColorDialog::OnInitDialog();

 

   // 縦方向に伸ばすサイズを指定します。
      int nExtraHeight = 40;

 

   // ダイアログボックスのサイズを取得し、ダイアログ ボックス、タブの縦に値を追加しリサイズします。
      CRect rectWindow;
      GetWindowRect(rectWindow);
      SetWindowPos(NULL, -1, -1, rectWindow.Width(), rectWindow.Height() + nExtraHeight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);

      CWnd* pPropSheet = (CWnd*)m_pPropSheet;

      CRect rectTab;
      pPropSheet->GetWindowRect(rectTab);
      pPropSheet->SetWindowPos(NULL, -1, -1, rectTab.Width(), rectTab.Height() + nExtraHeight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);

      return TRUE;
}
--------

 

Windows 8 での動作や表示について、お客様において十分にご確認、ご検証くださいますようお願いします。