C# 哪个类、零件和状态用于绘制选择?

C# 哪个类、零件和状态用于绘制选择?,c#,winforms,winapi,user-interface,visual-styles,C#,Winforms,Winapi,User Interface,Visual Styles,我正在尝试在启用Aero的windows 7上使用视觉样式在自定义windows窗体控件中绘制选择/焦点框。我试过这个: VisualStyleRenderer selectionRenderer = new VisualStyleRenderer(VisualStyleElement.ListView.Item.Selected); selectionRenderer.DrawBackground(g, visual.ItemArea); VisualStyleRenderer select

我正在尝试在启用Aero的windows 7上使用视觉样式在自定义windows窗体控件中绘制选择/焦点框。我试过这个:

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);
还有这个:

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的树视图中绘制选择:

和列表视图:

那么,我应该使用哪个类和部分来绘制系统选择矩形


编辑:我试图用纯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; 
    }
结果如下所示:


MSDN表示,Visaul样式仅在Windows XP Home Edition、Windows XP Professional x64 Edition和Windows Server 2003上受支持


请参阅本节的备注部分的结尾,以及本节的备注部分。而且两者都返回true,似乎除了XP和Server2003之外,任何操作系统都不支持它

我很接近。纯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,但没有正式的参数列表,可以提供给该例程。

对于treeview,您是否设置了FullRowSelect?我在自己的控件中从头开始绘制选择。您是指某些VisualStyles选项吗?本页另有说明:(“Windows XP和更高版本的操作系统支持一种称为“视觉样式”的功能,可根据用户选择的主题更改常用控件的外观。”)。