Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/updown.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c index 3076285e33..d6dbde01aa 100644 --- a/dlls/comctl32/tests/updown.c +++ b/dlls/comctl32/tests/updown.c @@ -293,11 +293,16 @@ static HWND create_updown_control(DWORD style, HWND buddy) RECT rect;
GetClientRect(parent_wnd, &rect); - updown = CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | style, - 0, 0, rect.right, rect.bottom, parent_wnd, 1, GetModuleHandleA(NULL), buddy, - 100, 0, 50); + updown = CreateWindowExA(0, UPDOWN_CLASSA, NULL, WS_CHILD | WS_BORDER | WS_VISIBLE | style, + 0, 0, rect.right, rect.bottom, + parent_wnd, (HMENU)1, GetModuleHandleA(NULL), NULL); + ok(updown != NULL, "Failed to create UpDown control.\n"); if (!updown) return NULL;
+ SendMessageA(updown, UDM_SETBUDDY, (WPARAM)buddy, 0); + SendMessageA(updown, UDM_SETRANGE, 0, MAKELONG(100, 0)); + SendMessageA(updown, UDM_SETPOS, 0, MAKELONG(50, 0)); + oldproc = (WNDPROC)SetWindowLongPtrA(updown, GWLP_WNDPROC, (LONG_PTR)updown_subclass_proc); SetWindowLongPtrA(updown, GWLP_USERDATA, (LONG_PTR)oldproc);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/updown.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c index d6dbde01aa..1c21873d26 100644 --- a/dlls/comctl32/tests/updown.c +++ b/dlls/comctl32/tests/updown.c @@ -800,6 +800,29 @@ static void test_UDS_SETBUDDYINT(void) DestroyWindow(updown); }
+static void test_CreateUpDownControl(void) +{ + HWND updown, buddy; + DWORD range, pos; + RECT rect; + + GetClientRect(parent_wnd, &rect); + updown = CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE, + 0, 0, rect.right, rect.bottom, parent_wnd, 1, GetModuleHandleA(NULL), g_edit, 100, 10, 50); + ok(updown != NULL, "Failed to create control.\n"); + + buddy = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0); + ok(buddy == g_edit, "Unexpected buddy window.\n"); + + range = SendMessageA(updown, UDM_GETRANGE, 0, 0); + ok(range == MAKELONG(100, 10), "Unexpected range.\n"); + + pos = SendMessageA(updown, UDM_GETPOS, 0, 0); + ok(pos == MAKELONG(50, 1), "Unexpected position.\n"); + + DestroyWindow(updown); +} + START_TEST(updown) { HMODULE mod = GetModuleHandleA("comctl32.dll"); @@ -821,6 +844,7 @@ START_TEST(updown) test_updown_base(); test_updown_unicode(); test_UDS_SETBUDDYINT(); + test_CreateUpDownControl();
DestroyWindow(g_edit); DestroyWindow(parent_wnd);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com ---
For https://bugs.winehq.org/show_bug.cgi?id=21849
dlls/comctl32/tests/updown.c | 77 +++++++++++++++++++++++++++++++++++++++++++- dlls/comctl32/updown.c | 11 ++++--- 2 files changed, 82 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c index 1c21873d26..639e7802a9 100644 --- a/dlls/comctl32/tests/updown.c +++ b/dlls/comctl32/tests/updown.c @@ -522,6 +522,7 @@ static void test_updown_pos32(void) static void test_updown_buddy(void) { HWND updown, buddyReturn, buddy; + RECT rect, rect2; WNDPROC proc; DWORD style;
@@ -568,8 +569,82 @@ static void test_updown_buddy(void) }
DestroyWindow(updown); - DestroyWindow(buddy); + + /* Create with buddy and UDS_HORZ, reset buddy. */ + updown = create_updown_control(UDS_HORZ, g_edit); + + buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0); + ok(buddyReturn == g_edit, "Unexpected buddy window.\n"); + + GetClientRect(updown, &rect); + + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0); + ok(buddyReturn == g_edit, "Unexpected buddy window.\n"); + + GetClientRect(updown, &rect2); + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + /* Remove UDS_HORZ, reset buddy again. */ + style = GetWindowLongA(updown, GWL_STYLE); + SetWindowLongA(updown, GWL_STYLE, style & ~UDS_HORZ); + style = GetWindowLongA(updown, GWL_STYLE); + ok(!(style & UDS_HORZ), "Unexpected style.\n"); + + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0); + ok(buddyReturn == NULL, "Unexpected buddy window.\n"); + + GetClientRect(updown, &rect2); + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + DestroyWindow(updown); + + /* Without UDS_HORZ. */ + updown = create_updown_control(0, g_edit); + + buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0); + ok(buddyReturn == g_edit, "Unexpected buddy window.\n"); + + GetClientRect(updown, &rect); + + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0); + ok(buddyReturn == g_edit, "Unexpected buddy window.\n"); + + GetClientRect(updown, &rect2); + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + DestroyWindow(updown); + + /* Create without buddy. */ + GetClientRect(parent_wnd, &rect); + updown = CreateWindowExA(0, UPDOWN_CLASSA, NULL, WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_HORZ, + 0, 0, rect.right, rect.bottom, parent_wnd, (HMENU)1, GetModuleHandleA(NULL), NULL); + ok(updown != NULL, "Failed to create UpDown control.\n"); + + GetClientRect(updown, &rect); + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0); + ok(buddyReturn == NULL, "Unexpected buddy window.\n"); + GetClientRect(updown, &rect2); + + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + style = GetWindowLongA(updown, GWL_STYLE); + SetWindowLongA(updown, GWL_STYLE, style & ~UDS_HORZ); + + GetClientRect(updown, &rect2); + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, (WPARAM)g_edit, 0); + ok(buddyReturn == NULL, "Unexpected buddy window.\n"); + GetClientRect(updown, &rect); + + buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0); + ok(buddyReturn == g_edit, "Unexpected buddy window.\n"); + GetClientRect(updown, &rect2); +todo_wine + ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n"); + + DestroyWindow(updown); }
static void test_updown_base(void) diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c index d18840859c..4f44b9032a 100644 --- a/dlls/comctl32/updown.c +++ b/dlls/comctl32/updown.c @@ -622,11 +622,11 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) RECT budRect; /* new coord for the buddy */ int x, width; /* new x position and width for the up-down */ WCHAR buddyClass[40]; - HWND ret; + HWND old_buddy;
TRACE("(hwnd=%p, bud=%p)\n", infoPtr->Self, bud);
- ret = infoPtr->Buddy; + old_buddy = infoPtr->Buddy;
/* there is already a buddy assigned */ if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc, @@ -663,7 +663,7 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) x = budRect.right+DEFAULT_XSEP; } else { /* nothing to do */ - return ret; + return old_buddy; }
/* first adjust the buddy to accommodate the up/down */ @@ -692,14 +692,15 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) budRect.top - DEFAULT_ADDTOP, width, budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); - } else { + } else if (!(infoPtr->dwStyle & UDS_HORZ) && old_buddy != NULL) { RECT rect; GetWindowRect(infoPtr->Self, &rect); MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Self), (POINT *)&rect, 2); SetWindowPos(infoPtr->Self, 0, rect.left, rect.top, DEFAULT_WIDTH, rect.bottom - rect.top, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } - return ret; + + return old_buddy; }
/***********************************************************************