GetThemeColor()でツールバーの背景色を取得するには?


MistyGreen  2010-08-05 01:39:29  No: 71859

開発環境:Visual C++ 2010 Pro + MFC (Windows7)

GetThemeColor()というAPIを使用してツールバーの背景色を
取得したいと思っているのですが、うまくいきません。

Window7の場合ですと、メニューバーと同じような薄い青色のCOLORREF値を
取得したいのです。

http://uploadr.net/file/c294fbfa9f

各ツールボタンについては、TBSTYLE_TRANSPARENTスタイルを指定することにより、
薄い青色で表示することができました。
以下は周囲のボーダーを単色の薄い青色にするためのコードです。

// class CToolBarEx public: CToolBar;

void CToolBarEx::DrawBoders(CDC* pDC, CRect& rect)
{
  // m_hReBarThemeはCControlBarクラスのデータメンバです。

  COLORREF rgb;
  HRESULT hr = GetThemeColor(m_hReBarTheme, RP_BACKGROUND, 0, TMT_FILLCOLOR, &rgb);

  if (hr == S_OK) pDC->SetBkColor(rgb);

  // 既定クラスの動作ではCThemeHelper::DrawThemeBackgroundをコールしますが、
  // それだと各ツールバーの上部の境界線付近に白い影が描画されてしまう。
  // できれば単色の薄い青にしたい...

  HTHEME tmSave = m_hReBarTheme;
  m_hReBarTheme = NULL;
  CToolBar::DrawBorders(pDC, rect);
  m_hReBarTheme = tmSave;
}

問題点がいくつかあるので、箇条書きにしますと、

・RP_BACKGROUNDの定義は「vsstyle.h」にあるらしいので、インクルードした
  のですが、その状態でコンパイルすると、error C2011: 'BUTTONPARTS' : '
  enum' 型の再定義というエラーが表示されます。確かに「tmschema.h」とい
  うヘッダーで定義されているようなのですが、こちらのヘッダーは自分でイ
  ンクルードしたものではなく、おそらく"stdafx.h"の中で自動的に取り込ま
  れているような気がします。かといって「vsstyle.h」をインクルードしな
  いと、RP_BACKGROUNDが未定義だと怒られます。どのようにすればよいので
  しょうか?

・とりあえず、上のエラーを回避するためにRP_BACKGROUNDの代わりに「6」の
  ように値を直接指定してみました。このようにすると、コンパイルはできる
  のですが、実行時にGetThemeColor()が失敗してしまいます。(hr != S_OK)

第2引数と第4引数の組み合わせによってエラーになったりならなかったりし
ます。ただし、私がいろいろ試した限りでは、薄い青色が帰ってきません。Wi
ndows7のツールバーの背景色である薄い青色は、どのような組み合わせをして
いすればよいのでしょうか?


かもねぎ  2010-08-06 04:26:21  No: 71860

コントロールの位置が取得できるなら
GetPixelで色を取得してはどうでしょうか?


MistyGreen  2010-08-06 17:29:50  No: 71861

アドバイスありがとうございました。

説明不足でもうしわけありません。
確かにそのような方法だと薄い青色は取得できるかもしれませんが、
それだとWinXPなどで実行した時に、また色がずれてしまう可能性があります。
WinXPではツールバーの背景は薄いグレーです。

私が希望しているのは、
CThemeHelper::DrawThemeBackground()
の内部処理と同様の方法で背景色を取得したいと思っています。

おそらく、GetThemeColor()などを使用しているのだと推測しているのですが、
もしかしたらまったく違うのかもしれません。

GetThemeSysColor()なども試してみたのですが、なんだか全然テーマに
マッチしていないような気がしています。すべての識別子を指定して
みたのですが、目的の薄い青色が帰ってきたものはありませんでした。

自分のアプリ自体はビジュアルスタイルは適用されているのですが・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加