uxtheme/tests: Add DrawThemeParentBackground() tests.

Test that DrawThemeParentBackground() always send WM_ERASEBKGND and WM_PRINTCLIENT on success, which
can be used to indicate if DrawThemeParentBackground() is called.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2021-12-07 17:12:27 +08:00 committed by Alexandre Julliard
parent 1febcf692f
commit f685eda908
1 changed files with 95 additions and 0 deletions

View File

@ -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();