Визуальный стиль для наведения и выбора проводника Windows

Все последние три версии Windows имели полупрозрачное выделение и эффекты наведения в списке проводника Windows:

введите здесь описание изображения

Используя обозреватель тем, я вижу, что у ListItem нет состояния, соответствующего тому, что я вижу в Windows:

введите здесь описание изображения

Есть ли:

  • класс
  • часть
  • государство

что представляет собой ListView в Windows?


person Ian Boyd    schedule 09.11.2018    source источник
comment
Вероятно, это проблема с обозревателем тем. Представление списка должно иметь стиль проводника, чтобы отобразить этот конкретный вид. Требуется SetWindowTheme(hwnd_listview, L"Explorer", NULL).   -  person Barmak Shemirani    schedule 09.11.2018
comment
Возможно, это не имеет значения, но знаем ли мы вообще, действительно ли представление списка проводника является обычным элементом управления представлением списка элементов управления в Windows 7 и более поздних версиях? В наши дни класс окна просто DirectUIHWND (черная магия).   -  person Andreas Rejbrand    schedule 09.11.2018
comment
@Andreas AFAIK, это настраиваемый элемент управления, который просто имитирует поведение списка. Тема все еще может быть применена, как показано в 1-м комментарии.   -  person zett42    schedule 10.11.2018


Ответы (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);
}

Вывод:

введите описание изображения здесь

person Barmak Shemirani    schedule 10.11.2018