Nikolay Sivov : comctl32/listview: Implement LVS_EX_TRANSPARENTBKGND style.

Alexandre Julliard julliard at winehq.org
Tue Sep 8 08:55:28 CDT 2009


Module: wine
Branch: master
Commit: 5e1f5ebf6cac4b38f2c0cb6c93f472e1203e291b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5e1f5ebf6cac4b38f2c0cb6c93f472e1203e291b

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Sat Sep  5 16:48:15 2009 +0400

comctl32/listview: Implement LVS_EX_TRANSPARENTBKGND style.

---

 dlls/comctl32/listview.c       |   16 ++++++++++++-
 dlls/comctl32/tests/listview.c |   50 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index afe7116..dd42104 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -7299,7 +7299,10 @@ static BOOL LISTVIEW_SetBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrBk)
 	if (clrBk == CLR_NONE)
 	    infoPtr->hBkBrush = (HBRUSH)GetClassLongPtrW(infoPtr->hwndSelf, GCLP_HBRBACKGROUND);
 	else
+	{
 	    infoPtr->hBkBrush = CreateSolidBrush(clrBk);
+	    infoPtr->dwLvExStyle &= ~LVS_EX_TRANSPARENTBKGND;
+	}
 	LISTVIEW_InvalidateList(infoPtr);
     }
 
@@ -7785,6 +7788,11 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
         LISTVIEW_UpdateSize(infoPtr);
     }
 
+    if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_TRANSPARENTBKGND)
+    {
+        if (infoPtr->dwLvExStyle & LVS_EX_TRANSPARENTBKGND)
+            LISTVIEW_SetBkColor(infoPtr, CLR_NONE);
+    }
 
     LISTVIEW_InvalidateList(infoPtr);
     return dwOldExStyle;
@@ -8800,7 +8808,13 @@ static inline BOOL LISTVIEW_EraseBkgnd(const LISTVIEW_INFO *infoPtr, HDC hdc)
     if (!GetClipBox(hdc, &rc)) return FALSE;
 
     if (infoPtr->clrBk == CLR_NONE)
-        return SendMessageW(infoPtr->hwndNotify, WM_ERASEBKGND, (WPARAM)hdc, 0);
+    {
+        if (infoPtr->dwLvExStyle & LVS_EX_TRANSPARENTBKGND)
+            return SendMessageW(infoPtr->hwndNotify, WM_PRINTCLIENT,
+                                (WPARAM)hdc, PRF_ERASEBKGND);
+        else
+            return SendMessageW(infoPtr->hwndNotify, WM_ERASEBKGND, (WPARAM)hdc, 0);
+    }
 
     /* for double buffered controls we need to do this during refresh */
     if (infoPtr->dwLvExStyle & LVS_EX_DOUBLEBUFFER) return FALSE;
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 244f3a5..5b39176 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -265,6 +265,11 @@ static const struct message setredraw_seq[] = {
     { 0 }
 };
 
+static const struct message lvs_ex_transparentbkgnd_seq[] = {
+    { WM_PRINTCLIENT, sent|lparam, 0, PRF_ERASEBKGND },
+    { 0 }
+};
+
 struct subclass_info
 {
     WNDPROC oldproc;
@@ -3950,6 +3955,50 @@ static void test_scrollnotify(void)
     DestroyWindow(hwnd);
 }
 
+static void test_LVS_EX_TRANSPARENTBKGND(void)
+{
+    HWND hwnd;
+    DWORD ret;
+    HDC hdc;
+
+    hwnd = create_listview_control(0);
+
+    ret = SendMessage(hwnd, LVM_SETBKCOLOR, 0, RGB(0, 0, 0));
+    expect(TRUE, ret);
+
+    SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_TRANSPARENTBKGND,
+                                                    LVS_EX_TRANSPARENTBKGND);
+
+    ret = SendMessage(hwnd, LVM_GETBKCOLOR, 0, 0);
+    if (ret != CLR_NONE)
+    {
+        win_skip("LVS_EX_TRANSPARENTBKGND unsupported\n");
+        DestroyWindow(hwnd);
+        return;
+    }
+
+    /* try to set some back color and check this style bit */
+    ret = SendMessage(hwnd, LVM_SETBKCOLOR, 0, RGB(0, 0, 0));
+    expect(TRUE, ret);
+    ret = SendMessage(hwnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
+    ok(!(ret & LVS_EX_TRANSPARENTBKGND), "Expected LVS_EX_TRANSPARENTBKGND to unset\n");
+
+    /* now test what this style actually does */
+    SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_TRANSPARENTBKGND,
+                                                    LVS_EX_TRANSPARENTBKGND);
+
+    hdc = GetWindowDC(hwndparent);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0);
+    ok_sequence(sequences, PARENT_SEQ_INDEX, lvs_ex_transparentbkgnd_seq,
+                "LVS_EX_TRANSPARENTBKGND parent", FALSE);
+
+    ReleaseDC(hwndparent, hdc);
+
+    DestroyWindow(hwnd);
+}
+
 START_TEST(listview)
 {
     HMODULE hComctl32;
@@ -4032,6 +4081,7 @@ START_TEST(listview)
     test_canceleditlabel();
     test_mapidindex();
     test_scrollnotify();
+    test_LVS_EX_TRANSPARENTBKGND();
 
     unload_v6_module(ctx_cookie);
 




More information about the wine-cvs mailing list