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