none
VC2008でダイアログのタブコントロール背景色の指定について RRS feed

  • 質問

  • VC2003ではダイアログタブコントロール背景色はデフォルトでグレー表示されていました。このプログラムをそのままVC2008に移行したらタブコントロールの背景色が白色で表示されてしまう。
    そこで、OnCtlColorをオーバライトし以下の処理をいれましたが状況は変わりませんでした。背景色をグレーに(VC2003と同様にしたい)したいのですがどなたかご存知の方、ご教示をお願いします。

    HBRUSH DlgLayer::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

     // TODO:  ここで DC の属性を変更してください。
     switch (nCtlColor) {
      case CTLCOLOR_DLG :{
       COLORREF Col = RGB(255,0,0);
       pDC->SetBkColor( Col );
      }break;
      default:{
       COLORREF Col = RGB(255,0,0);
       pDC->SetBkColor( Col );
      }break;
     }
     COLORREF Col = RGB(255,0,0);
     pDC->SetBkColor( Col );
      
     // TODO:  既定値を使用したくない場合は別のブラシを返します。
     return hbr;
    }

    補足.うまく動作しないので全てのMSGに対して赤色設定としています。また、戻り値に生成したCBrushのHBRUSHを指定しても結果は変わりませんでした。

    2009年5月7日 10:31

回答

  • デフォルトでというのは、特に何かをしていなくても...という意味でしょうか?
    であれば、可能性としては2つ。

    一つは、VC2008 に移行したことで、VisualStyleが適用されたというもの。
    もう一つは、今までの環境がVisualStyleが有効にならない環境だったというもの。

    前者は、ボタンの形が今までの角がとがったものから、丸みを帯びたものに変わります。
    後者は、XP以降であればクラッシックだったものがそうではなくなったあるいは、2000からXPに移行したなどですね。

    個人的には、これを機にVisualStyleに対応することをお勧めとおもいますが、まぁ古めかしい感じがいいのであれば、
    ComCtrl32.dll の 6.0 を利用しないように設定を変更すればいいと思いますよ。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月7日 12:11
  • XP ではグレーということは、何かメッセージを受けているなどがあるでしょうか?

    新規に作成したWin32プロジェクトであれば、stdafx.h に
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    というようなものがあるのですが、移行した場合に追加されるかどうかについては確認していません。

    2003当時だとリソースに直接という形が多いので、リソースに RT_MANIFEST がないかをチェックしてみるとよいと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月8日 1:46
  • SetWindowTheme 関数を使ってみるとか。

    Xp以前のOSでの動作も考えるのであれば、uxtheme.dllを動的にリンクするような仕組みが必要ですけど。
    参考:http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200806/08060082.txt
    わんくま同盟[http://blogs.wankuma.com/blue/]
    2009年5月8日 4:01
  • #pragma comment は、stdafx.h にあるとは限りません。ソース(システムを含むすべてのinclude先も含め)のどこかで定義されていればいいので、参照ソース全部をチェックする必要があります。
    ただし、VS2003が上記形式に対応しているかどうかはわかりません。

    さて、どうも見てる限りでは、VisualStyleには対応していないようなのですが、アプリケーションのダイアログのボタンなどのコントロールの見た目はどうなっていますか?

    VisualStyleに対応していれば、OS標準のアプリケーションと同様、丸みを帯びたものとなります(XPも微妙に違いますが同じように丸みを帯びる)。
    VisualStyleに対応していない場合は、真四角のボタンになります。

    VisualStyleに対応していないにもかかわらずタブコントロールがグレーにならないとしたら、それはOS標準のタブコントロールではないものを張り付けているということになると思います。その場合は、コントロールの開発元にどうすればいいかを問い合わせるのが確実ではないかと思います。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月8日 9:49

すべての返信

  • デフォルトでというのは、特に何かをしていなくても...という意味でしょうか?
    であれば、可能性としては2つ。

    一つは、VC2008 に移行したことで、VisualStyleが適用されたというもの。
    もう一つは、今までの環境がVisualStyleが有効にならない環境だったというもの。

    前者は、ボタンの形が今までの角がとがったものから、丸みを帯びたものに変わります。
    後者は、XP以降であればクラッシックだったものがそうではなくなったあるいは、2000からXPに移行したなどですね。

    個人的には、これを機にVisualStyleに対応することをお勧めとおもいますが、まぁ古めかしい感じがいいのであれば、
    ComCtrl32.dll の 6.0 を利用しないように設定を変更すればいいと思いますよ。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月7日 12:11
  • とっちゃんさんへ

    アドバイスありがとうございます。
    説明で不足ですみません。Windows XPではタブコントロール背景色はグレー表示ですが、Vistaでは白になってしまいます。
    この現象がComCtrl32.dll の6.0を利用しないように設定を変更すれば良いとアドバイスをいただいたと思います。
    VC2008のプロジェクト設定をみましたがComCtrl32.dll の6.0を利用しないように設定する方法がわかりません。ご存知でしたら教えてください。
    2009年5月8日 0:41
  • XP ではグレーということは、何かメッセージを受けているなどがあるでしょうか?

    新規に作成したWin32プロジェクトであれば、stdafx.h に
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    というようなものがあるのですが、移行した場合に追加されるかどうかについては確認していません。

    2003当時だとリソースに直接という形が多いので、リソースに RT_MANIFEST がないかをチェックしてみるとよいと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月8日 1:46
  • SetWindowTheme 関数を使ってみるとか。

    Xp以前のOSでの動作も考えるのであれば、uxtheme.dllを動的にリンクするような仕組みが必要ですけど。
    参考:http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200806/08060082.txt
    わんくま同盟[http://blogs.wankuma.com/blue/]
    2009年5月8日 4:01
  • とっちゃんさんへ

    XP ではグレーということは、何かメッセージを受けているなどがあるでしょうか? →特になにもしていません。ダイアログの背景はなにもしないとグレー表示がデフォルトと思っています。

    #pragma comment(linker,"/manifestdependency・・・・・ → stdafx.hにはありませんでした。

    2003当時だとリソースに直接という形が多いので、リソースに RT_MANIFEST がないかをチェックしてみるとよいと思います。 → xxx.rc にはありませんでした。

    VC2003から2008への移行操作は、旧プロジェクトを2008で開き自動変換し、コンパイルエラーを対処したのみです。実行してほとんど問題なく動作していますが細かい部分でこうした問題が発生しています。
    ちなみにタブコントロールの背景色と同様の問題でエディットボックスの背景色もXPでは問題なく背景色が指定色で表示されますがVistaでは背景色が変更できない状況になっています。

    従って、背景色変更はOrnerDraw方式に処理を変更しないとVistaでは動作しないのかとも思っています。
    答えになっていないかも知れませんがよろしくお願いします。

    2009年5月8日 4:22
  • #pragma comment は、stdafx.h にあるとは限りません。ソース(システムを含むすべてのinclude先も含め)のどこかで定義されていればいいので、参照ソース全部をチェックする必要があります。
    ただし、VS2003が上記形式に対応しているかどうかはわかりません。

    さて、どうも見てる限りでは、VisualStyleには対応していないようなのですが、アプリケーションのダイアログのボタンなどのコントロールの見た目はどうなっていますか?

    VisualStyleに対応していれば、OS標準のアプリケーションと同様、丸みを帯びたものとなります(XPも微妙に違いますが同じように丸みを帯びる)。
    VisualStyleに対応していない場合は、真四角のボタンになります。

    VisualStyleに対応していないにもかかわらずタブコントロールがグレーにならないとしたら、それはOS標準のタブコントロールではないものを張り付けているということになると思います。その場合は、コントロールの開発元にどうすればいいかを問い合わせるのが確実ではないかと思います。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2009年5月8日 9:49
  • とっちゃんさんへ

    返信がおくれてすみません。

    さて、どうも見てる限りでは、VisualStyleには対応していないようなのですが、アプリケーションのダイアログのボタンなどのコントロールの見た目はどうなっていますか? → 見た目は丸みをおびていて、VisualStyleになっていると思います。ちなみに、システムのテーマを変更する設定でWindows クラシックにすると旧方式で表示され、Windows Vistaにすると丸みをおびたきれいな画面で表示されます。

    また、特別なタブコントロールをインストールしたり使用するような事をしていないのでOS標準と思っています。
    仕方ないので、OrnerDraw方式にて対応をはじめました。

    色々アドバイスありがとうございました。また、こうした初歩的な質問をするかと思いますがよろしくお願いします。
    2009年5月12日 7:18
  • こんにちは。フォーラムオペレーターの高橋です。

    とっちゃんさん、蒼の洞窟さん、いつもお世話になっております。
    アドバイスありがとうございました。
    いろいろな解決方法があると、より多くの方の参考になります。

    kokkosan2さん、はじめまして。
    MSDNフォーラムのご利用ありがとうございます。

    とっちゃんさん、蒼の洞窟さんから頂いた情報を皆様と共有するために
    回答マークを付けさせて頂きました。
    不適切な場合は、回答マークを外す事も可能です。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    2009年6月2日 9:00