【问题标题】:Which class, part and state is used to draw selection?哪个类、部分和状态用于绘制选择?
【发布时间】:2012-12-11 23:25:26
【问题描述】:

我正在尝试在启用 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);

但是,两者都失败并显示当前样式既不支持 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; 
    }

结果如下:

【问题讨论】:

  • 对于树视图,你设置了 FullRowSelect 吗?
  • 我在我自己的控件中从头开始绘制选择。您指的是一些 VisualStyles 选项吗?

标签: c# winforms winapi user-interface visual-styles


【解决方案1】:

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

请参阅此this link (VisualStyleRenderer Class)备注 部分的结尾,以及this link备注 部分。 VisualStyleRenderer.IsSupportedVisualStyleInformation.IsSupportedByOS 也都返回 true,似乎除了 XP 和 Server 2003 之外的任何操作系统都不支持它!

【讨论】:

【解决方案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,但没有正式的参数列表,可以提供给该例程。

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 2015-04-19
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多