winapi - Windows 资源管理器悬停和选择的视觉样式

标签 winapi themes visual-styles

Windows 的最后三个版本在 Windows 资源管理器 ListView 中都具有半透明突出显示和悬停效果:

enter image description here

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

enter image description here

是否有:

  • 部分
  • 状态

代表Windows中的ListView?

最佳答案

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

调用 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);
}

输出:

enter image description here

关于winapi - Windows 资源管理器悬停和选择的视觉样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229798/

相关文章:

windows - FAT-32 上的 Unicode 文件名?

javascript - 从 Web 浏览器进行 Win API 调用?

c++ - 更新使用 WS_EX_TRANSPARENT 绘制的 C Win32 API STATIC 控件中的文本

android - 如何更改 AlertDialog 中列表项的文本颜色

c++ - 如何在 WinAPI 中创建具有视觉样式的平面按钮

c++ - 如何在没有 list 的情况下启用视觉样式

c++ - 将函数的声明设置为 0 是什么意思?如何将整数分配给函数?

themes - 根据安装的 Domino 版本使用 OneUI 主题

android - 白色主题不显示文字

c++ - Visual Studio从2005年升级到2015年,C++ GUI保留XP主题而不是系统主题