我正在尝试使用启用了Aero的Windows 7上的视觉样式在我的自定义窗体控件中绘制选择/焦点框架。我试过这个:
VisualStyleRenderer selectionRenderer = new VisualStyleRenderer(VisualStyleElement.ListView.Item.Selected);
selectionRenderer.DrawBackground(g, visual.ItemArea);
这一个:
VisualStyleRenderer selectionRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Item.Selected);
selectionRenderer.DrawBackground(g, visual.ItemArea);
但是,两者都失败了信息,当前样式既不支持TreeView.Item.Selected,也不支持ListView.Item.Selected。但是,嘿,Windows在UI的树视图中绘制选择:
和listviews:
那么我应该使用哪个类和部分来绘制系统选择矩形?
编辑:我试图用纯WinAPI编写代码。这是一段代码片段:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HTHEME theme = OpenThemeData(hwnd, L"TREEVIEW");
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 80;
rect.bottom = 80;
DrawThemeBackground(theme, hdc, TVP_TREEITEM, TREIS_SELECTED, &rect, &rect);
CloseThemeData(theme);
EndPaint(hwnd, &ps);
return 0L;
}
结果如下:
答案 0 :(得分:2)
我非常接近。纯WinAPI的完整解决方案如下所示:
HWND mainWinHWND = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
L"MainWindowClass",
L"WinAPI window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if (!mainWinHWND)
return -1;
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 = 10;
rect.top = 10;
rect.right = 80;
rect.bottom = 80;
DrawThemeBackground(theme, hdc, TVP_TREEITEM, TREIS_SELECTED, &rect, &rect);
CloseThemeData(theme);
EndPaint(hwnd, &ps);
return 0L;
}
结果:
令人遗憾的是,主题操作系统支持的记录很少。例如,L"Explorer"
值来自MSDN的SetWindowTheme,但没有正式的参数列表,可以提供给该例程。
答案 1 :(得分:0)
MSDN表示,只有Windows XP Home Edition,Windows XP Professional x64 Edition和Windows Server 2003支持Visaul样式。
请参阅此this link (VisualStyleRenderer Class)的备注部分的结尾部分以及this link的备注部分。此外VisualStyleRenderer.IsSupported
和VisualStyleInformation.IsSupportedByOS
都返回true,似乎除了XP和Server 2003之外的任何操作系统都不支持它!