Из соображений совместимости 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
SetWindowTheme(hwnd_listview, L"Explorer", NULL)
. - person Barmak Shemirani   schedule 09.11.2018DirectUIHWND
(черная магия). - person Andreas Rejbrand   schedule 09.11.2018