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

Ian*_*oyd 3 winapi themes visual-styles

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

在此处输入图片说明

使用主题浏览器,我看到 ListItem 没有与我在 Windows 中看到的状态相匹配的状态:

在此处输入图片说明

有没有:

  • 班级
  • 部分
  • 状态

代表Windows中的ListView?

Bar*_*ani 5

出于兼容性原因,默认情况下 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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明