2012-09-03 107 views
0

我正在处理自定义标题控件CMyHeaderCtrl,它从MFC类CHeaderCtrl派生而来,并覆盖DrawItem方法以在应用程序为主题时执行一些自定义绘图。起初,我尝试确定标题项目的主题字体,但它失败并且GetThemeFont返回结果'element not found' (0x80070490)GetThemeFont函数不起作用

它使用该控制应用程序被针对公共控件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_CAPTIONFONTTMT_SMALLCAPTIONFONTTMT_BODYFONT等。这里有什么可能是错的?

回答

1

我从来没有得到GetThemeFont()返回除E_PROP_ID_UNSUPPORTED(0x80070490)以外的任何运气。尽管在MSDN中没有明确说明,但这个想法似乎是GetThemeFont()只会在主题定义的字体与另一个参数指定的特定部分和状态的默认字体不同时返回。至少,这就是一个MSDN博客提示:http://blogs.msdn.com/b/cjacks/archive/2006/06/02/614575.aspx

鉴于这一点,似乎正确的做法是尽量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); 
} 
+0

感谢您的信息。这看起来确实如此。我也尝试过'CWnd :: GetFont()',它为控件返回正确的字体。你更喜欢哪个函数:'GetThemeSysFont'或者'CWnd :: GetFont'? – alexfr

+0

回顾我写的代码,我通常依靠CWnd :: GetFont()来做正确的事情。当一个主题出现,其中有不同的字体,也许我会回去更改代码... – DavidK