DefWindowProc's WM_NCCALC handler must not subtract space for
scrollbars if there is not enough space for it anyway. With tests to confirm the behavior.
This commit is contained in:
parent
2d133baa3b
commit
dfa4354134
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue