diff --git a/dlls/uxtheme/tests/system.c b/dlls/uxtheme/tests/system.c index 10857115061..b085e639784 100644 --- a/dlls/uxtheme/tests/system.c +++ b/dlls/uxtheme/tests/system.c @@ -1438,6 +1438,100 @@ done: DestroyWindow(hwnd); } +static const struct message DrawThemeParentBackground_seq[] = +{ + {WM_ERASEBKGND, sent}, + {WM_PRINTCLIENT, sent | lparam, 0, PRF_CLIENT}, + {0} +}; + +static LRESULT WINAPI test_DrawThemeParentBackground_proc(HWND hwnd, UINT message, WPARAM wp, + LPARAM lp) +{ + static LONG defwndproc_counter; + struct message msg = {0}; + LRESULT lr; + POINT org; + BOOL ret; + + switch (message) + { + /* Test that DrawThemeParentBackground() doesn't change brush origins */ + case WM_ERASEBKGND: + case WM_PRINTCLIENT: + ret = GetBrushOrgEx((HDC)wp, &org); + ok(ret, "GetBrushOrgEx failed, error %d.\n", GetLastError()); + ok(org.x == 0 && org.y == 0, "Expected (0,0), got %s.\n", wine_dbgstr_point(&org)); + break; + + default: + break; + } + + msg.message = message; + msg.flags = sent | wparam | lparam; + if (defwndproc_counter) + msg.flags |= defwinproc; + msg.wParam = wp; + msg.lParam = lp; + add_message(sequences, PARENT_SEQ_INDEX, &msg); + + InterlockedIncrement(&defwndproc_counter); + lr = DefWindowProcA(hwnd, message, wp, lp); + InterlockedDecrement(&defwndproc_counter); + return lr; +} + +static void test_DrawThemeParentBackground(void) +{ + HWND child, parent; + WNDCLASSA cls; + HRESULT hr; + POINT org; + RECT rect; + BOOL ret; + HDC hdc; + + memset(&cls, 0, sizeof(cls)); + cls.hInstance = GetModuleHandleA(0); + cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); + cls.hbrBackground = GetStockObject(WHITE_BRUSH); + cls.lpfnWndProc = test_DrawThemeParentBackground_proc; + cls.lpszClassName = "TestDrawThemeParentBackgroundClass"; + RegisterClassA(&cls); + + parent = CreateWindowA("TestDrawThemeParentBackgroundClass", "parent", WS_POPUP | WS_VISIBLE, 0, + 0, 100, 100, 0, 0, 0, 0); + ok(parent != NULL, "CreateWindowA failed, error %d.\n", GetLastError()); + child = CreateWindowA(WC_STATICA, "child", WS_CHILD | WS_VISIBLE, 1, 2, 50, 50, parent, 0, 0, + NULL); + ok(child != NULL, "CreateWindowA failed, error %d.\n", GetLastError()); + flush_events(); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + hdc = GetDC(child); + ret = GetBrushOrgEx(hdc, &org); + ok(ret, "GetBrushOrgEx failed, error %d.\n", GetLastError()); + ok(org.x == 0 && org.y == 0, "Expected (0,0), got %s.\n", wine_dbgstr_point(&org)); + + hr = DrawThemeParentBackground(child, hdc, NULL); + ok(SUCCEEDED(hr), "DrawThemeParentBackground failed, hr %#x.\n", hr); + ok_sequence(sequences, PARENT_SEQ_INDEX, DrawThemeParentBackground_seq, + "DrawThemeParentBackground parent", FALSE); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + GetClientRect(child, &rect); + hr = DrawThemeParentBackground(child, hdc, &rect); + ok(SUCCEEDED(hr), "DrawThemeParentBackground failed, hr %#x.\n", hr); + ok_sequence(sequences, PARENT_SEQ_INDEX, DrawThemeParentBackground_seq, + "DrawThemeParentBackground parent", FALSE); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ReleaseDC(child, hdc); + DestroyWindow(parent); + UnregisterClassA("TestDrawThemeParentBackgroundClass", GetModuleHandleA(0)); +} + START_TEST(system) { init_funcs(); @@ -1459,6 +1553,7 @@ START_TEST(system) test_buffered_paint(); test_GetThemeIntList(); test_GetThemeTransitionDuration(); + test_DrawThemeParentBackground(); /* Test EnableTheming() in the end because it may disable theming */ test_EnableTheming();