Module: wine Branch: master Commit: 5e1f5ebf6cac4b38f2c0cb6c93f472e1203e291b URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e1f5ebf6cac4b38f2c0cb6c93...
Author: Nikolay Sivov bunglehead@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);