1

私はCMyHeaderCtrl、MFC クラスから派生したカスタム ヘッダー コントロールに取り組んでおりCHeaderCtrl、メソッドをオーバーライドしてDrawItem、アプリケーションがテーマになっているときにカスタム描画を行います。最初に、ヘッダー項目のテーマ フォントを決定しようとしますが、失敗しGetThemeFontて結果が返されます'element not found' (0x80070490)

このコントロールを使用するアプリケーションは、Common Controls 6 に対してリンクされています。サンプル コードを次に示します。

void MyHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    if(IsThemeActive() && IsAppThemed() && ComCtlVersionOK())
    {
        if(HTHEME hTheme = OpenThemeData(m_hWnd, L"HEADER"))
        {
            LOGFONTW lfw;
            HRESULT hr = GetThemeFont(hTheme, lpDrawItemStruct->hDC, HP_HEADERITEM, HIS_NORMAL, TMT_CAPTIONFONT, &lfw);
            ASSERT(hr == S_OK);

            // ...          

            CloseThemeData(hTheme);
        }
    }
}

TMT_CAPTIONFONTlike以外のプロパティも既に試しTMT_SMALLCAPTIONFONTましTMT_BODYFONTた。ここで何が問題なのですか?

4

1 に答える 1

2

GetThemeFont() が E_PROP_ID_UNSUPPORTED (0x80070490) 以外のものを返すようになったこともありません。MSDN には明示的に記載されていませんが、GetThemeFont() は、他の引数で指定された特定の部分と状態の既定とは異なるフォントをテーマが定義した場合にのみ何かを返すという考え方のようです。少なくとも、MSDN ブログの 1 つが示唆していることは次のとおりです

それを考えると、正しいアプローチは GetThemeFont() を試すことであり、それが失敗した場合は、次のような GetThemeSysFont() を試してください。

HTHEME theme = OpenThemeData(wnd,L"HEADER");
if (theme != 0)
{
  LOGFONTW lf;
  HRESULT hr = GetThemeFont(theme,dc,
    HP_HEADERITEM,HIS_NORMAL,TMT_CAPTIONFONT,&lf);
  if (FAILED(hr))
    hr = GetThemeSysFont(theme,TMT_CAPTIONFONT,&lf);
  ASSERT(SUCCEEDED(hr));
  // Do something with the font ...
  CloseThemeData(theme);
}
于 2012-09-04T09:43:16.220 に答える