Commit 76859b0f authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

comctl32/treeview: Erase background on WM_PAINT if BeginPaint() tells us to do it.

parent a00d2235
......@@ -928,6 +928,17 @@ static void test_itemedit(void)
DestroyWindow(hTree);
}
static void test_treeview_classinfo(void)
{
WNDCLASSA cls;
memset(&cls, 0, sizeof(cls));
GetClassInfo(GetModuleHandleA("comctl32.dll"), WC_TREEVIEWA, &cls);
ok(cls.hbrBackground == NULL, "Expected NULL background brush, got %p\n", cls.hbrBackground);
ok(cls.style == (CS_GLOBALCLASS | CS_DBLCLKS), "Expected got %x\n", cls.style);
expect(0, cls.cbClsExtra);
}
START_TEST(treeview)
{
HMODULE hComctl32;
......@@ -976,6 +987,7 @@ START_TEST(treeview)
test_callback();
test_expandinvisible();
test_itemedit();
test_treeview_classinfo();
PostMessageA(hMainWnd, WM_CLOSE, 0, 0);
while(GetMessageA(&msg,0,0,0)) {
......
......@@ -2788,19 +2788,27 @@ TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr)
infoPtr->uInternalStatus &= ~TV_HSCROLL;
}
/* CtrlSpy doesn't mention this, but CorelDRAW's object manager needs it. */
static LRESULT
TREEVIEW_EraseBackground(const TREEVIEW_INFO *infoPtr, HDC hDC)
static void
TREEVIEW_FillBkgnd(const TREEVIEW_INFO *infoPtr, HDC hdc, const RECT *rc)
{
HBRUSH hBrush;
COLORREF clrBk = infoPtr->clrBk == -1 ? comctl32_color.clrWindow:
infoPtr->clrBk;
hBrush = CreateSolidBrush(clrBk);
FillRect(hdc, rc, hBrush);
DeleteObject(hBrush);
}
/* CtrlSpy doesn't mention this, but CorelDRAW's object manager needs it. */
static LRESULT
TREEVIEW_EraseBackground(const TREEVIEW_INFO *infoPtr, HDC hdc)
{
RECT rect;
hBrush = CreateSolidBrush(clrBk);
TRACE("%p\n", infoPtr);
GetClientRect(infoPtr->hwnd, &rect);
FillRect(hDC, &rect, hBrush);
DeleteObject(hBrush);
TREEVIEW_FillBkgnd(infoPtr, hdc, &rect);
return 1;
}
......@@ -2860,7 +2868,7 @@ TREEVIEW_Invalidate(const TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item)
}
static LRESULT
TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, WPARAM wParam)
TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, HDC hdc_ref)
{
HDC hdc;
PAINTSTRUCT ps;
......@@ -2868,27 +2876,48 @@ TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, WPARAM wParam)
TRACE("\n");
if (wParam)
if (hdc_ref)
{
hdc = (HDC)wParam;
GetClientRect(infoPtr->hwnd, &rc);
TREEVIEW_EraseBackground(infoPtr, hdc);
hdc = hdc_ref;
GetClientRect(infoPtr->hwnd, &rc);
}
else
{
hdc = BeginPaint(infoPtr->hwnd, &ps);
rc = ps.rcPaint;
rc = ps.rcPaint;
if(ps.fErase)
TREEVIEW_FillBkgnd(infoPtr, hdc, &rc);
}
if(infoPtr->bRedraw) /* WM_SETREDRAW sets bRedraw */
TREEVIEW_Refresh(infoPtr, hdc, &rc);
if (!wParam)
if (!hdc_ref)
EndPaint(infoPtr->hwnd, &ps);
return 0;
}
static LRESULT
TREEVIEW_PrintClient(TREEVIEW_INFO *infoPtr, HDC hdc, DWORD options)
{
FIXME("Partial Stub: (hdc=%p options=0x%08x)\n", hdc, options);
if ((options & PRF_CHECKVISIBLE) && !IsWindowVisible(infoPtr->hwnd))
return 0;
if (options & PRF_ERASEBKGND)
TREEVIEW_EraseBackground(infoPtr, hdc);
if (options & PRF_CLIENT)
{
RECT rc;
GetClientRect(infoPtr->hwnd, &rc);
TREEVIEW_Refresh(infoPtr, hdc, &rc);
}
return 0;
}
/* Sorting **************************************************************/
......@@ -5707,8 +5736,10 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_NotifyFormat(infoPtr, (HWND)wParam, (UINT)lParam);
case WM_PRINTCLIENT:
return TREEVIEW_PrintClient(infoPtr, (HDC)wParam, lParam);
case WM_PAINT:
return TREEVIEW_Paint(infoPtr, wParam);
return TREEVIEW_Paint(infoPtr, (HDC)wParam);
case WM_RBUTTONDOWN:
return TREEVIEW_RButtonDown(infoPtr, lParam);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment