From: Alex Henrie alexhenrie24@gmail.com
Based on simliar patch for comctl32/treeview: 231199bc46
WM_PRINTCLIENT paints the items of a listview, including the item backgrounds, but never the listview background.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54878 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55005 Co-authored-by: Bernhard Übelacker bernhardu@mailbox.org --- dlls/comctl32/listview.c | 12 +---- dlls/comctl32/tests/listview.c | 81 +++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index 7972be9669d..c82473b6205 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -10832,17 +10832,9 @@ static inline LRESULT LISTVIEW_WMPaint(LISTVIEW_INFO *infoPtr, HDC hdc) */ static LRESULT LISTVIEW_PrintClient(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD options) { - if ((options & PRF_CHECKVISIBLE) && !IsWindowVisible(infoPtr->hwndSelf)) - return 0; - - if (options & ~(PRF_ERASEBKGND|PRF_CLIENT)) - FIXME("(hdc=%p options %#lx) partial stub\n", hdc, options); - - if (options & PRF_ERASEBKGND) - LISTVIEW_EraseBkgnd(infoPtr, hdc); + FIXME("(hdc=%p options=%#lx) partial stub\n", hdc, options);
- if (options & PRF_CLIENT) - LISTVIEW_Paint(infoPtr, hdc); + LISTVIEW_Paint(infoPtr, hdc);
return 0; } diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c index b1cb0ef16c2..0ab5a7d0ce7 100644 --- a/dlls/comctl32/tests/listview.c +++ b/dlls/comctl32/tests/listview.c @@ -24,11 +24,16 @@ #include <windows.h> #include <commctrl.h> #include <objbase.h> +#include <uxtheme.h> +#include <vsstyle.h>
#include "wine/test.h" #include "v6util.h" #include "msg.h"
+static HTHEME (WINAPI *pGetWindowTheme)(HWND); +static BOOL (WINAPI *pIsThemeBackgroundPartiallyTransparent)(HTHEME, int, int); + static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int); static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST); static int (WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP); @@ -90,12 +95,16 @@ static HWND subclass_editbox(HWND hwndListview); static void init_functions(void) { HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + HMODULE hUxtheme = LoadLibraryA("uxtheme.dll"); + +#define X(module, f) p##f = (void*)GetProcAddress(module, #f); + X(hComCtl32, ImageList_Create); + X(hComCtl32, ImageList_Destroy); + X(hComCtl32, ImageList_Add); + X(hComCtl32, _TrackMouseEvent);
-#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); - X(ImageList_Create); - X(ImageList_Destroy); - X(ImageList_Add); - X(_TrackMouseEvent); + X(hUxtheme, GetWindowTheme); + X(hUxtheme, IsThemeBackgroundPartiallyTransparent); #undef X }
@@ -5978,6 +5987,66 @@ static void test_LVM_REDRAWITEMS(void) DestroyWindow(list); }
+static void test_WM_PRINTCLIENT(void) +{ + static const int states[] = {SW_HIDE, SW_SHOW}; + static const LPARAM params[] = {0, PRF_CHECKVISIBLE, PRF_NONCLIENT, PRF_CLIENT, PRF_ERASEBKGND, + PRF_CHILDREN, PRF_OWNED}; + const DWORD list_background = RGB(255, 0, 0); + const DWORD text_background = RGB(0, 0, 255); + BOOL listitem_is_transparent; + HTHEME hTheme; + HWND hList; + COLORREF clr; + LONG ret; + RECT rc; + HDC hdc; + int i, j; + + hList = create_listview_control(LVS_LIST); + insert_item(hList, 0); + + ret = SendMessageA(hList, LVM_SETBKCOLOR, 0, list_background); + ok(ret == TRUE, "got 0x%lx, expected 0x%x\n", ret, TRUE); + + ret = SendMessageA(hList, LVM_SETTEXTBKCOLOR, 0, text_background); + ok(ret == TRUE, "got 0x%lx, expected 0x%x\n", ret, TRUE); + + hdc = GetDC(hwndparent); + GetClientRect(hwndparent, &rc); + + hTheme = pGetWindowTheme(hList); + listitem_is_transparent = hTheme && pIsThemeBackgroundPartiallyTransparent(hTheme, LVP_LISTITEM, 0); + + for (i = 0; i < ARRAY_SIZE(states); i++) + { + ShowWindow(hList, states[i]); + + for (j = 0; j < ARRAY_SIZE(params); j++) + { + winetest_push_context("state=%d lParam=0x%Ix", states[i], params[j]); + + FillRect(hdc, &rc, GetStockObject(BLACK_BRUSH)); + clr = GetPixel(hdc, 1, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + clr = GetPixel(hdc, 50, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + ret = SendMessageA(hList, WM_PRINTCLIENT, (WPARAM)hdc, params[j]); + ok(ret == 0, "got %ld\n", ret); + clr = GetPixel(hdc, 1, 1); + ok(clr == text_background || (listitem_is_transparent && clr == list_background), + "got 0x%lx\n", clr); + clr = GetPixel(hdc, 50, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + + winetest_pop_context(); + } + } + + ReleaseDC(hwndparent, hdc); + DestroyWindow(hList); +} + static void test_imagelists(void) { HWND hwnd, header; @@ -7153,6 +7222,7 @@ START_TEST(listview) test_dispinfo(); test_LVM_SETITEMTEXT(); test_LVM_REDRAWITEMS(); + test_WM_PRINTCLIENT(); test_imagelists(); test_deleteitem(); test_insertitem(); @@ -7205,6 +7275,7 @@ START_TEST(listview) test_dispinfo(); test_LVM_SETITEMTEXT(); test_LVM_REDRAWITEMS(); + test_WM_PRINTCLIENT(); test_oneclickactivate(); test_state_image(); test_LVSCW_AUTOSIZE();