From 797f42699e86a0e4e3468b55f88e7b8e6d06f323 Mon Sep 17 00:00:00 2001 From: Huw Davies <huw@codeweavers.com> Date: Tue, 19 May 2015 12:51:56 +0100 Subject: [PATCH] comctl32: Wrap the buttons inside the toolbar's client rect. The toolbar need not be the same width as the parent. --- dlls/comctl32/tests/toolbar.c | 56 +++++++++++++++++++++++++++++++++++ dlls/comctl32/toolbar.c | 17 +---------- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index 4bbffd31a1d..20412162d1e 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -2024,6 +2024,61 @@ static void test_TB_GET_SET_EXTENDEDSTYLE(void) DestroyWindow(hwnd); } +static void test_noresize(void) +{ + HWND wnd; + int i; + TBBUTTON button = {0, 10, TBSTATE_ENABLED, 0, {0, }, 0, -1}; + + wnd = CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE | CCS_NORESIZE | TBSTYLE_WRAPABLE, 0, 0, 100, 20, + hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL); + SendMessageA(wnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + + for (i=0; i<30; i++) + { + button.idCommand = 10 + i; + SendMessageA(wnd, TB_ADDBUTTONSA, 1, (LPARAM)&button); + } + + SendMessageA(wnd, TB_SETSTATE, 10, TBSTATE_WRAP|TBSTATE_ENABLED); + + /* autosize clears the wrap on button 0 */ + SendMessageA(wnd, TB_AUTOSIZE, 0, 0); + for (i=0; i<30; i++) + { + SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button); + if (i % 4 == 3) + ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got %08x\n", i, button.fsState); + else + ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i, button.fsState); + } + + /* changing the parent doesn't do anything */ + MoveWindow(hMainWnd, 0,0, 400, 200, FALSE); + for (i=0; i<30; i++) + { + SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button); + if (i % 4 == 3) + ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got %08x\n", i, button.fsState); + else + ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i, button.fsState); + } + + /* again nothing here */ + SendMessageA(wnd, TB_AUTOSIZE, 0, 0); + for (i=0; i<30; i++) + { + SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button); + if (i % 4 == 3) + ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got %08x\n", i, button.fsState); + else + ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i, button.fsState); + } + + DestroyWindow(wnd); + +} + START_TEST(toolbar) { WNDCLASSA wc; @@ -2066,6 +2121,7 @@ START_TEST(toolbar) test_get_set_style(); test_create(); test_TB_GET_SET_EXTENDEDSTYLE(); + test_noresize(); PostQuitMessage(0); while(GetMessageA(&msg,0,0,0)) { diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index 97d509e8837..9f70063d63f 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -1282,7 +1282,6 @@ TOOLBAR_WrapToolbar(TOOLBAR_INFO *infoPtr) { TBUTTON_INFO *btnPtr; INT x, cx, i, j, width; - RECT rc; BOOL bButtonWrap; /* When the toolbar window style is not TBSTYLE_WRAPABLE, */ @@ -1293,21 +1292,7 @@ TOOLBAR_WrapToolbar(TOOLBAR_INFO *infoPtr) btnPtr = infoPtr->buttons; x = infoPtr->nIndent; - - if (GetParent(infoPtr->hwndSelf)) - { - /* this can get the parents width, to know how far we can extend - * this toolbar. We cannot use its height, as there may be multiple - * toolbars in a rebar control - */ - GetClientRect( GetParent(infoPtr->hwndSelf), &rc ); - width = rc.right - rc.left; - } - else - { - GetWindowRect( infoPtr->hwndSelf, &rc ); - width = rc.right - rc.left; - } + width = infoPtr->client_rect.right - infoPtr->client_rect.left; bButtonWrap = FALSE; -- 2.24.1