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

Winapi Windows资源管理器悬停和选择的视觉样式,winapi,themes,visual-styles,Winapi,Themes,Visual Styles,最后三个版本的Windows在Windows资源管理器列表视图中都具有半透明的突出显示和悬停效果: 使用我看到ListItem没有与我在Windows中看到的状态匹配的状态: 是否有: 阶级 部分 陈述 表示Windows中的ListView的吗?出于兼容性原因,ListView在默认情况下仍具有旧式外观DrawThemeBackground(htheme、hdc、LVP_LISTITEM等)只需为所有项目状态绘制一个带边框的实心矩形,如上图所示GetSysColor应用于获取此list

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

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

是否有:

  • 阶级
  • 部分
  • 陈述

表示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);
}
输出:


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