我正在处理从MFC类CMyHeaderCtrl
派生的自定义标头控件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_CAPTIONFONT
之外的其他属性,例如TMT_SMALLCAPTIONFONT
,TMT_BODYFONT
等等。这可能有什么问题?
答案 0 :(得分: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);
}