2012-09-03 105 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