【问题标题】:Visual Style for Windows Explorer hover and selectionWindows 资源管理器悬停和选择的视觉样式
【发布时间】:2018-11-09 16:36:57
【问题描述】:

Windows 的最后三个版本都在 Windows Explorer 列表视图中具有半透明的高亮和悬停效果:

使用 a theme explorer 我看到 ListItem 没有与我在 Windows 中看到的状态相匹配的状态:

有没有:

  • 部分
  • 状态

表示Windows中的ListView?

【问题讨论】:

  • 这可能是“主题浏览器”的问题。列表视图必须具有资源管理器样式才能绘制特定外观。它需要SetWindowTheme(hwnd_listview, L"Explorer", NULL)
  • 也许不相关,但我们是否知道资源管理器“列表视图”实际上是否 Windows 7 及更高版本中的常用控件列表视图控件?窗口类现在只是DirectUIHWND(黑魔法)。
  • @Andreas AFAIK 这是一个自定义控件,它只是模仿一些列表视图行为。如第一条评论所示,主题仍然可以应用。

标签: winapi themes visual-styles


【解决方案1】:

出于兼容性原因,ListView 默认仍具有旧样式外观。 DrawThemeBackground(htheme, hdc, LVP_LISTITEM, ...) 将简单地为所有项目状态绘制一个带边框的实心矩形,如上图所示。应该使用GetSysColor 来获得此列表视图的正确颜色。

调用SetWindowTheme(hwnd, L"Explorer", NULL) 将加载新的主题数据并绘制类似于资源管理器的列表项。示例:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_CREATE:
        SetWindowTheme(hwnd, L"Explorer", NULL);
        break;
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        auto hdc = BeginPaint(hwnd, &ps);
        HTHEME ht = OpenThemeData(hwnd, L"LISTVIEW");
        if(ht)
        {
            RECT rc = { 10, 10, 100, 50 };
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_SELECTED, &rc, NULL); OffsetRect(&rc, 0, 55);
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_DISABLED, &rc, NULL); OffsetRect(&rc, 0, 55);
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_SELECTED, &rc, NULL); OffsetRect(&rc, 0, 55);
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_HOT, &rc, NULL); OffsetRect(&rc, 0, 55);
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_HOTSELECTED, &rc, NULL); OffsetRect(&rc, 0, 55);
            DrawThemeBackground(ht, hdc, LVP_LISTITEM, LISS_SELECTEDNOTFOCUS, &rc, NULL);
            CloseThemeData(ht);
        }

        EndPaint(hwnd, &ps);
        return 0;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多