C++ 为什么';你的文字画得不好吗?

C++ 为什么';你的文字画得不好吗?,c++,winapi,visual-styles,C++,Winapi,Visual Styles,我正在尝试在窗口上绘制主题文本。然而,与主题字体不同的是,我总是使用粗体MS Sans Serif,不带抗锯齿。为什么会这样 编辑: 应用上述更改后,代码如下所示: INITCOMMONCONTROLSEX ctrl; ctrl.dwSize = sizeof(ctrl); ctrl.dwICC = ICC_TREEVIEW_CLASSES; InitCommonControlsEx(&ctrl); (……) (……) 效果还是一样的 整个代码(约100行): 请注意,这只是一个

我正在尝试在窗口上绘制主题文本。然而,与主题字体不同的是,我总是使用粗体MS Sans Serif,不带抗锯齿。为什么会这样


编辑:

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

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

(……)

效果还是一样的


整个代码(约100行):
请注意,这只是一个概念验证程序,这就是为什么我没有包括任何错误检查。但是DrawThemeText返回0(成功)。

好吧,你就快到了,你得到了Explorer主题样式。只是一个错误的假设,树视图的主题没有规定字体。例如,在.NETTreeView类中非常可见,您可以任意分配其字体属性,然后您将获得请求的字体。逻辑上很明显,您没有在任何地方指定字体大小,因此主题api没有合理的方法来猜测适当大小的字体。现在,您只需要在设备上下文中选择默认字体


您必须选择要使用的字体

DT_VCENTER
按上述方式使用时无效。请参阅:“
DT\u VCENTER
:垂直居中文本。此值仅与
DT\u单线
值一起使用。确定;但在这种情况下,这并不重要-文本仍然使用奇怪的默认字体绘制(我也尝试通过标志传递0),首先使用treeview部件和状态ID,而不是listview。正确初始化公共控件也是一种常见的故障模式,InitCommonControlsEx()以及启用视觉样式所需的清单。否则,您应该只在为现有TreeView实现自定义绘图时才这样做,不知道这是否可以在任意绘制消息处理程序中工作。请注意,展开图示符和选择框都正确绘制。我相信,窗口类和主题类是两个不同的东西,UXTheme.dll负责为treeview加载主题,而不是comctl32.dll。
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; 
    }