C++ 为什么';你的文字画得不好吗?
我正在尝试在窗口上绘制主题文本。然而,与主题字体不同的是,我总是使用粗体MS Sans Serif,不带抗锯齿。为什么会这样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行): 请注意,这只是一个
编辑: 应用上述更改后,代码如下所示:
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;
}