diff --git a/dlls/user/tests/win.c b/dlls/user/tests/win.c index cd469f699d58549d4eb1f9960b177202418adc13..ad0c19123ec156023382b85ea1f71d496706ecb9 100644 --- a/dlls/user/tests/win.c +++ b/dlls/user/tests/win.c @@ -2231,6 +2231,58 @@ static void test_validatergn(HWND hwnd) DestroyWindow( child ); } + +void nccalchelper( HWND hwnd, INT x, INT y, RECT *prc) +{ + MoveWindow( hwnd, 0, 0, x, y, 0); + GetWindowRect( hwnd, prc); + trace("window rect is %ld,%ld - %ld,%ld\n", + prc->left,prc->top,prc->right,prc->bottom); + DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)prc); + trace("nccalc rect is %ld,%ld - %ld,%ld\n", + prc->left,prc->top,prc->right,prc->bottom); +} + +void test_nccalcscroll( HWND parent) +{ + RECT rc1; + INT sbheight = GetSystemMetrics( SM_CYHSCROLL); + INT sbwidth = GetSystemMetrics( SM_CXVSCROLL); + HWND hwnd = CreateWindowExA(0, "static", NULL, + WS_CHILD| WS_VISIBLE | WS_VSCROLL | WS_HSCROLL , + 10, 10, 200, 200, parent, 0, 0, NULL); + ShowWindow( parent, SW_SHOW); + UpdateWindow( parent); + + /* test window too low for a horizontal scroll bar */ + nccalchelper( hwnd, 100, sbheight, &rc1); + ok( rc1.bottom - rc1.top == sbheight, "Height should be %d size is %ld,%ld - %ld,%ld\n", + sbheight, rc1.left, rc1.top, rc1.right, rc1.bottom); + + /* test window just high enough for a horizontal scroll bar */ + nccalchelper( hwnd, 100, sbheight + 1, &rc1); + ok( rc1.bottom - rc1.top == 1, "Height should be %d size is %ld,%ld - %ld,%ld\n", + 1, rc1.left, rc1.top, rc1.right, rc1.bottom); + + /* test window too narrow for a vertical scroll bar */ + nccalchelper( hwnd, sbwidth - 1, 100, &rc1); + ok( rc1.right - rc1.left == sbwidth - 1 , "Width should be %d size is %ld,%ld - %ld,%ld\n", + sbwidth - 1, rc1.left, rc1.top, rc1.right, rc1.bottom); + + /* test window just wide enough for a vertical scroll bar */ + nccalchelper( hwnd, sbwidth, 100, &rc1); + ok( rc1.right - rc1.left == 0, "Width should be %d size is %ld,%ld - %ld,%ld\n", + 0, rc1.left, rc1.top, rc1.right, rc1.bottom); + + /* same test, but with client edge: not enough width */ + SetWindowLong( hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE | GetWindowLong( hwnd, GWL_EXSTYLE)); + nccalchelper( hwnd, sbwidth, 100, &rc1); + ok( rc1.right - rc1.left == sbwidth - 2 * GetSystemMetrics(SM_CXEDGE), + "Width should be %d size is %ld,%ld - %ld,%ld\n", + sbwidth - 2 * GetSystemMetrics(SM_CXEDGE), rc1.left, rc1.top, rc1.right, rc1.bottom); + + DestroyWindow( hwnd); +} START_TEST(win) { pGetAncestor = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetAncestor" ); @@ -2287,6 +2339,7 @@ START_TEST(win) test_keyboard_input(hwndMain); test_mouse_input(hwndMain); test_validatergn(hwndMain); + test_nccalcscroll( hwndMain); UnhookWindowsHookEx(hhook); } diff --git a/windows/nonclient.c b/windows/nonclient.c index 6351d3d4a3a402fe81d1ee33456132bc6578d0f3..dfc38189fe486e80d05dbb3e13c8ea86ec4876cf 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -402,12 +402,23 @@ LONG NC_HandleNCCalcSize( HWND hwnd, RECT *winRect ) -tmpRect.left, -tmpRect.top ) + 1; } - SetRect(&tmpRect, 0, 0, 0, 0); - NC_AdjustRectInner (&tmpRect, style, exStyle); - winRect->left -= tmpRect.left; - winRect->top -= tmpRect.top; - winRect->right -= tmpRect.right; - winRect->bottom -= tmpRect.bottom; + if( exStyle & WS_EX_CLIENTEDGE) + if( winRect->right - winRect->left > 2 * GetSystemMetrics(SM_CXEDGE) && + winRect->bottom - winRect->top > 2 * GetSystemMetrics(SM_CYEDGE)) + InflateRect( winRect, - GetSystemMetrics(SM_CXEDGE), + - GetSystemMetrics(SM_CYEDGE)); + + if (style & WS_VSCROLL) + if( winRect->right - winRect->left >= GetSystemMetrics(SM_CXVSCROLL)){ + if((exStyle & WS_EX_LEFTSCROLLBAR) != 0) + winRect->left += GetSystemMetrics(SM_CXVSCROLL); + else + winRect->right -= GetSystemMetrics(SM_CXVSCROLL); + } + + if (style & WS_HSCROLL) + if( winRect->bottom - winRect->top > GetSystemMetrics(SM_CYHSCROLL)) + winRect->bottom -= GetSystemMetrics(SM_CYHSCROLL); if (winRect->top > winRect->bottom) winRect->bottom = winRect->top;