为什么DrawThemeText不能正常工作?

时间:2013-01-06 16:50:03

标签: c++ winapi visual-styles

我正在尝试在窗口上绘制主题文字。然而,取代主题字体,我总是得到像大胆的MS Sans Serif没有抗锯齿的东西。为什么会这样?


修改

应用上述更改后,代码如下所示:

INITCOMMONCONTROLSEX ctrl;
ctrl.dwSize = sizeof(ctrl);
ctrl.dwICC = ICC_TREEVIEW_CLASSES;
InitCommonControlsEx(&ctrl);

(...)

SetWindowTheme(mainWinHWND, L"explorer", nullptr);

(...)

case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps); 

        HTHEME theme = OpenThemeData(hwnd, L"TREEVIEW");
        RECT rect;
        rect.left = 100;
        rect.top = 100;
        rect.right = 200;
        rect.bottom = 200;
        DrawThemeText(theme,
            hdc,
            TVP_TREEITEM,
            TREIS_NORMAL,
            L"Ala ma kota",
            11,
            DT_VCENTER | DT_LEFT,
            0,
            &rect);
        CloseThemeData(theme);

        EndPaint(hwnd, &ps); 
        return 0L; 
    }

效果仍然相同。


整个代码(~100行):http://pastebin.com/ZheZyrWy 请注意,它只是一个概念验证程序,这就是我没有包含任何错误检查的原因。但DrawThemeText返回0(成功)。

1 个答案:

答案 0 :(得分:2)

嗯,你几乎就在那里,你正在获得Explorer主题风格。只是一个错误的假设,树视图的主题确实规定了一种字体。例如,在.NET TreeView类中可以看到,您可以随意分配其Font属性,并获得所需的字体。从逻辑上讲,你没有在任何地方指定字体大小,所以没有合理的方法让主题api猜测正确大小的字体。现在,您只是获取在设备上下文中选择的默认字体。

选择要使用的字体。