Add a test case for scroll APIs, fix a few bugs spotted by it.
This commit is contained in:
parent
341523d293
commit
a98beddcce
|
@ -94,7 +94,7 @@ static BOOL SCROLL_MovingThumb = FALSE;
|
|||
static BOOL SCROLL_ShowScrollBar( HWND hwnd, INT nBar,
|
||||
BOOL fShowH, BOOL fShowV );
|
||||
static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
||||
const SCROLLINFO *info, INT *action );
|
||||
const SCROLLINFO *info, BOOL bRedraw );
|
||||
static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar,
|
||||
RECT *rect, INT arrowSize,
|
||||
INT thumbSize, INT thumbPos,
|
||||
|
@ -464,7 +464,7 @@ static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar,
|
|||
*/
|
||||
if (nBar == SB_CTL)
|
||||
{
|
||||
hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
|
||||
hBrush = (HBRUSH)SendMessageW( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
|
||||
(WPARAM)hdc,(LPARAM)hwnd);
|
||||
}
|
||||
else
|
||||
|
@ -560,7 +560,7 @@ static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar,
|
|||
* to correctly setup default scrollbar colors
|
||||
*/
|
||||
if (nBar == SB_CTL) {
|
||||
hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
|
||||
hBrush = (HBRUSH)SendMessageW( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
|
||||
(WPARAM)hdc,(LPARAM)hwnd);
|
||||
} else {
|
||||
hBrush = DEFWND_ControlColor( hdc, CTLCOLOR_SCROLLBAR );
|
||||
|
@ -768,7 +768,7 @@ LPARAM lParam /* [in] Variable input including input point */)
|
|||
default: return;
|
||||
}
|
||||
SendMessageW(GetParent(hwnd),
|
||||
((GetWindowLongA( hwnd, GWL_STYLE ) & SBS_VERT) ?
|
||||
((GetWindowLongW( hwnd, GWL_STYLE ) & SBS_VERT) ?
|
||||
WM_VSCROLL : WM_HSCROLL), wParam, (LPARAM)hwnd);
|
||||
}
|
||||
|
||||
|
@ -845,7 +845,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
lastMousePos = lastClickPos;
|
||||
trackThumbPos = thumbPos;
|
||||
prevPt = pt;
|
||||
if (nBar == SB_CTL && (GetWindowLongA(hwnd, GWL_STYLE) & WS_TABSTOP)) SetFocus( hwnd );
|
||||
if (nBar == SB_CTL && (GetWindowLongW(hwnd, GWL_STYLE) & WS_TABSTOP)) SetFocus( hwnd );
|
||||
SetCapture( hwnd );
|
||||
break;
|
||||
|
||||
|
@ -885,7 +885,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
|
||||
{
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SB_LINEUP, (LPARAM)hwndCtl );
|
||||
}
|
||||
|
||||
|
@ -904,7 +904,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
|
||||
{
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SB_PAGEUP, (LPARAM)hwndCtl );
|
||||
}
|
||||
SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
|
||||
|
@ -955,7 +955,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
SCROLL_TrackingVal = SCROLL_GetThumbVal( infoPtr, &rect,
|
||||
vertical,
|
||||
SCROLL_TrackingPos );
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
MAKEWPARAM( SB_THUMBTRACK, SCROLL_TrackingVal),
|
||||
(LPARAM)hwndCtl );
|
||||
if (!SCROLL_MovingThumb)
|
||||
|
@ -973,7 +973,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
|
||||
{
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SB_PAGEDOWN, (LPARAM)hwndCtl );
|
||||
}
|
||||
SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
|
||||
|
@ -990,7 +990,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
|
||||
{
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SB_LINEDOWN, (LPARAM)hwndCtl );
|
||||
}
|
||||
|
||||
|
@ -1009,7 +1009,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
UINT val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
|
||||
trackThumbPos + lastMousePos - lastClickPos );
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
MAKEWPARAM( SB_THUMBTRACK, val ), (LPARAM)hwndCtl );
|
||||
}
|
||||
}
|
||||
|
@ -1023,10 +1023,10 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
|
|||
{
|
||||
UINT val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
|
||||
trackThumbPos + lastMousePos - lastClickPos );
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
MAKEWPARAM( SB_THUMBPOSITION, val ), (LPARAM)hwndCtl );
|
||||
}
|
||||
SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
|
||||
SB_ENDSCROLL, (LPARAM)hwndCtl );
|
||||
}
|
||||
|
||||
|
@ -1207,7 +1207,7 @@ LPINT lpMax /* [out] Where to store maximum value */)
|
|||
if (lpMin) *lpMin = infoPtr ? infoPtr->minVal : 0;
|
||||
if (lpMax) *lpMax = infoPtr ? infoPtr->maxVal : 0;
|
||||
|
||||
return infoPtr ? TRUE : FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1230,7 +1230,7 @@ static BOOL SCROLL_SetScrollRange(
|
|||
infoPtr->minVal = minVal;
|
||||
infoPtr->maxVal = maxVal;
|
||||
}
|
||||
return infoPtr ? TRUE : FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1393,7 +1393,7 @@ static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT message, WPARAM wParam,
|
|||
return EnableScrollBar( hwnd, SB_CTL, wParam );
|
||||
|
||||
case SBM_SETSCROLLINFO:
|
||||
return SetScrollInfo( hwnd, SB_CTL, (SCROLLINFO *)lParam, wParam );
|
||||
return SCROLL_SetScrollInfo( hwnd, SB_CTL, (SCROLLINFO *)lParam, wParam );
|
||||
|
||||
case SBM_GETSCROLLINFO:
|
||||
return SCROLL_GetScrollInfo(hwnd, SB_CTL, (SCROLLINFO *)lParam);
|
||||
|
@ -1440,27 +1440,16 @@ INT nBar /* [in] One of SB_HORZ, SB_VERT, or SB_CTL */,
|
|||
const SCROLLINFO *info /* [in] Specifies what to change and new values */,
|
||||
BOOL bRedraw /* [in] Should scrollbar be redrawn afterwards ? */)
|
||||
{
|
||||
INT action;
|
||||
INT retVal = SCROLL_SetScrollInfo( hwnd, nBar, info, &action );
|
||||
TRACE("hwnd=%p nBar=%d info=%p, bRedraw=%d\n", hwnd, nBar, info, bRedraw);
|
||||
|
||||
if( action & SA_SSI_HIDE )
|
||||
SCROLL_ShowScrollBar( hwnd, nBar, FALSE, FALSE );
|
||||
/* Refer SB_CTL requests to the window */
|
||||
if (nBar == SB_CTL)
|
||||
return SendMessageW(hwnd, SBM_SETSCROLLINFO, bRedraw, (LPARAM)info);
|
||||
else
|
||||
{
|
||||
if( action & SA_SSI_SHOW )
|
||||
if( SCROLL_ShowScrollBar( hwnd, nBar, TRUE, TRUE ) )
|
||||
return retVal; /* SetWindowPos() already did the painting */
|
||||
|
||||
if( bRedraw )
|
||||
SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE );
|
||||
else if( action & SA_SSI_REPAINT_ARROWS )
|
||||
SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, FALSE );
|
||||
}
|
||||
return retVal;
|
||||
return SCROLL_SetScrollInfo( hwnd, nBar, info, bRedraw );
|
||||
}
|
||||
|
||||
INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
||||
const SCROLLINFO *info, INT *action )
|
||||
static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, const SCROLLINFO *info, BOOL bRedraw )
|
||||
{
|
||||
/* Update the scrollbar state and set action flags according to
|
||||
* what has to be done graphics wise. */
|
||||
|
@ -1468,8 +1457,7 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
SCROLLBAR_INFO *infoPtr;
|
||||
UINT new_flags;
|
||||
BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */
|
||||
|
||||
*action = 0;
|
||||
INT action = 0;
|
||||
|
||||
if (!(infoPtr = SCROLL_GetScrollBarInfo(hwnd, nBar))) return 0;
|
||||
if (info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) return 0;
|
||||
|
@ -1492,7 +1480,7 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
if( infoPtr->page != info->nPage )
|
||||
{
|
||||
infoPtr->page = info->nPage;
|
||||
*action |= SA_SSI_REFRESH;
|
||||
action |= SA_SSI_REFRESH;
|
||||
bChangeParams = TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1504,7 +1492,7 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
if( infoPtr->curVal != info->nPos )
|
||||
{
|
||||
infoPtr->curVal = info->nPos;
|
||||
*action |= SA_SSI_REFRESH;
|
||||
action |= SA_SSI_REFRESH;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1525,7 +1513,7 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
if( infoPtr->minVal != info->nMin ||
|
||||
infoPtr->maxVal != info->nMax )
|
||||
{
|
||||
*action |= SA_SSI_REFRESH;
|
||||
action |= SA_SSI_REFRESH;
|
||||
infoPtr->minVal = info->nMin;
|
||||
infoPtr->maxVal = info->nMax;
|
||||
bChangeParams = TRUE;
|
||||
|
@ -1566,11 +1554,11 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
if (info->fMask & SIF_DISABLENOSCROLL)
|
||||
{
|
||||
new_flags = ESB_DISABLE_BOTH;
|
||||
*action |= SA_SSI_REFRESH;
|
||||
action |= SA_SSI_REFRESH;
|
||||
}
|
||||
else if ((nBar != SB_CTL) && bChangeParams)
|
||||
{
|
||||
*action = SA_SSI_HIDE;
|
||||
action = SA_SSI_HIDE;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
@ -1578,19 +1566,32 @@ INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
|
|||
{
|
||||
new_flags = 0;
|
||||
if ((nBar != SB_CTL) && bChangeParams)
|
||||
*action |= SA_SSI_SHOW;
|
||||
action |= SA_SSI_SHOW;
|
||||
}
|
||||
|
||||
if (infoPtr->flags != new_flags) /* check arrow flags */
|
||||
{
|
||||
infoPtr->flags = new_flags;
|
||||
*action |= SA_SSI_REPAINT_ARROWS;
|
||||
action |= SA_SSI_REPAINT_ARROWS;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
/* Return current position */
|
||||
if( action & SA_SSI_HIDE )
|
||||
SCROLL_ShowScrollBar( hwnd, nBar, FALSE, FALSE );
|
||||
else
|
||||
{
|
||||
if( action & SA_SSI_SHOW )
|
||||
if( SCROLL_ShowScrollBar( hwnd, nBar, TRUE, TRUE ) )
|
||||
return infoPtr->curVal; /* SetWindowPos() already did the painting */
|
||||
|
||||
if( bRedraw )
|
||||
SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE );
|
||||
else if( action & SA_SSI_REPAINT_ARROWS )
|
||||
SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, FALSE );
|
||||
}
|
||||
|
||||
/* Return current position */
|
||||
return infoPtr->curVal;
|
||||
}
|
||||
|
||||
|
@ -1612,9 +1613,11 @@ LPSCROLLINFO info /* [in/out] (fMask specifies which values to retrieve) */)
|
|||
|
||||
/* Refer SB_CTL requests to the window */
|
||||
if (nBar == SB_CTL)
|
||||
return SendMessageA(hwnd, SBM_GETSCROLLINFO, (WPARAM)0, (LPARAM)info);
|
||||
SendMessageW(hwnd, SBM_GETSCROLLINFO, (WPARAM)0, (LPARAM)info);
|
||||
else
|
||||
return SCROLL_GetScrollInfo(hwnd, nBar, info);
|
||||
SCROLL_GetScrollInfo(hwnd, nBar, info);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1668,7 +1671,7 @@ INT nBar /* [in] One of SB_HORZ, SB_VERT, or SB_CTL */)
|
|||
|
||||
/* Refer SB_CTL requests to the window */
|
||||
if (nBar == SB_CTL)
|
||||
return SendMessageA(hwnd, SBM_GETPOS, (WPARAM)0, (LPARAM)0);
|
||||
return SendMessageW(hwnd, SBM_GETPOS, (WPARAM)0, (LPARAM)0);
|
||||
else
|
||||
return SCROLL_GetScrollPos(hwnd, nBar);
|
||||
}
|
||||
|
@ -1686,22 +1689,16 @@ INT minVal, /* [in] New minimum value */
|
|||
INT maxVal, /* [in] New maximum value */
|
||||
BOOL bRedraw /* [in] Should scrollbar be redrawn afterwards ? */)
|
||||
{
|
||||
BOOL ret;
|
||||
|
||||
TRACE("hwnd=%p nBar=%d min=%d max=%d\n", hwnd, nBar, minVal, maxVal);
|
||||
|
||||
/* Refer SB_CTL requests to the window */
|
||||
if (nBar == SB_CTL)
|
||||
ret = SendMessageW(hwnd, SBM_SETRANGE, minVal, maxVal);
|
||||
else
|
||||
{
|
||||
ret = SCROLL_SetScrollRange(hwnd, nBar, minVal, maxVal);
|
||||
ShowScrollBar(hwnd, nBar, minVal != maxVal);
|
||||
}
|
||||
|
||||
if (bRedraw)
|
||||
SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE );
|
||||
return ret;
|
||||
SCROLLINFO info;
|
||||
|
||||
TRACE("hwnd=%p nBar=%d min=%d max=%d, bRedraw=%d\n", hwnd, nBar, minVal, maxVal, bRedraw);
|
||||
|
||||
info.cbSize = sizeof(info);
|
||||
info.fMask = SIF_RANGE;
|
||||
info.nMin = minVal;
|
||||
info.nMax = maxVal;
|
||||
SetScrollInfo( hwnd, nBar, &info, bRedraw );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1713,7 +1710,6 @@ BOOL bRedraw /* [in] Should scrollbar be redrawn afterwards ? */)
|
|||
INT SCROLL_SetNCSbState(HWND hwnd, int vMin, int vMax, int vPos,
|
||||
int hMin, int hMax, int hPos)
|
||||
{
|
||||
INT vA, hA;
|
||||
SCROLLINFO vInfo, hInfo;
|
||||
|
||||
vInfo.cbSize = hInfo.cbSize = sizeof(SCROLLINFO);
|
||||
|
@ -1725,19 +1721,9 @@ INT SCROLL_SetNCSbState(HWND hwnd, int vMin, int vMax, int vPos,
|
|||
hInfo.nPos = hPos;
|
||||
vInfo.fMask = hInfo.fMask = SIF_RANGE | SIF_POS;
|
||||
|
||||
SCROLL_SetScrollInfo( hwnd, SB_VERT, &vInfo, &vA );
|
||||
SCROLL_SetScrollInfo( hwnd, SB_HORZ, &hInfo, &hA );
|
||||
SCROLL_SetScrollInfo( hwnd, SB_VERT, &vInfo, TRUE );
|
||||
SCROLL_SetScrollInfo( hwnd, SB_HORZ, &hInfo, TRUE );
|
||||
|
||||
if( !SCROLL_ShowScrollBar( hwnd, SB_BOTH,
|
||||
(hA & SA_SSI_SHOW),(vA & SA_SSI_SHOW) ) )
|
||||
{
|
||||
/* SetWindowPos() wasn't called, just redraw the scrollbars if needed */
|
||||
if( vA & SA_SSI_REFRESH )
|
||||
SCROLL_RefreshScrollBar( hwnd, SB_VERT, FALSE, TRUE );
|
||||
|
||||
if( hA & SA_SSI_REFRESH )
|
||||
SCROLL_RefreshScrollBar( hwnd, SB_HORZ, FALSE, TRUE );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1757,9 +1743,11 @@ LPINT lpMax /* [out] Where to store maximum value */)
|
|||
|
||||
/* Refer SB_CTL requests to the window */
|
||||
if (nBar == SB_CTL)
|
||||
return SendMessageA(hwnd, SBM_GETRANGE, (WPARAM)lpMin, (LPARAM)lpMax);
|
||||
SendMessageW(hwnd, SBM_GETRANGE, (WPARAM)lpMin, (LPARAM)lpMax);
|
||||
else
|
||||
return SCROLL_GetScrollRange(hwnd, nBar, lpMin, lpMax);
|
||||
SCROLL_GetScrollRange(hwnd, nBar, lpMin, lpMax);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -54,6 +54,11 @@ struct message {
|
|||
LPARAM lParam; /* expected value of lParam */
|
||||
};
|
||||
|
||||
/* Empty message sequence */
|
||||
static const struct message WmEmptySeq[] =
|
||||
{
|
||||
{ 0 }
|
||||
};
|
||||
/* CreateWindow (for overlapped window, not initially visible) (16/32) */
|
||||
static const struct message WmCreateOverlappedSeq[] = {
|
||||
{ HCBT_CREATEWND, hook },
|
||||
|
@ -188,10 +193,6 @@ static const struct message WmCreateInvisiblePopupSeq[] = {
|
|||
{ WM_MOVE, sent },
|
||||
{ 0 }
|
||||
};
|
||||
/* ShowWindow (for a popup window with WS_VISIBLE style set) */
|
||||
static const struct message WmShowVisiblePopupSeq[] = {
|
||||
{ 0 }
|
||||
};
|
||||
/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER)
|
||||
* for a popup window with WS_VISIBLE style set
|
||||
*/
|
||||
|
@ -644,6 +645,48 @@ static const struct message WmEnableWindowSeq[] =
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
static const struct message WmGetScrollRangeSeq[] =
|
||||
{
|
||||
{ SBM_GETRANGE, sent },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmGetScrollInfoSeq[] =
|
||||
{
|
||||
{ SBM_GETSCROLLINFO, sent },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetScrollRangeSeq[] =
|
||||
{
|
||||
/* MSDN claims that Windows sends SBM_SETRANGE message, but win2k SP4
|
||||
sends SBM_SETSCROLLINFO.
|
||||
*/
|
||||
{ SBM_SETSCROLLINFO, sent },
|
||||
{ 0 }
|
||||
};
|
||||
/* SetScrollRange for a window without a non-client area */
|
||||
static const struct message WmSetScrollRangeHVSeq[] =
|
||||
{
|
||||
{ WM_WINDOWPOSCHANGING, sent|wparam, 0 },
|
||||
{ WM_NCCALCSIZE, sent|wparam, 1 },
|
||||
{ WM_GETTEXT, sent|defwinproc|optional },
|
||||
{ WM_ERASEBKGND, sent|optional },
|
||||
{ WM_WINDOWPOSCHANGED, sent|wparam, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
/* SetScrollRange for a window with a non-client area */
|
||||
static const struct message WmSetScrollRangeHV_NC_Seq[] =
|
||||
{
|
||||
{ WM_WINDOWPOSCHANGING, sent|wparam, 0 },
|
||||
{ WM_NCCALCSIZE, sent|wparam, 1 },
|
||||
{ WM_NCPAINT, sent|optional },
|
||||
{ WM_GETTEXT, sent|defwinproc|optional },
|
||||
{ WM_ERASEBKGND, sent|optional },
|
||||
{ WM_CTLCOLORDLG, sent|defwinproc|optional }, /* sent to a parent of the dialog */
|
||||
{ WM_WINDOWPOSCHANGED, sent|wparam, 0 },
|
||||
{ WM_SIZE, sent|defwinproc },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static int after_end_dialog;
|
||||
static int sequence_cnt, sequence_size;
|
||||
static struct message* sequence;
|
||||
|
@ -1173,6 +1216,172 @@ static INT_PTR CALLBACK TestModalDlgProcA(HWND hwnd, UINT message, WPARAM wParam
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void test_hv_scroll_1(HWND hwnd, INT ctl, DWORD clear, DWORD set, INT min, INT max)
|
||||
{
|
||||
DWORD style, exstyle;
|
||||
INT xmin, xmax;
|
||||
|
||||
exstyle = GetWindowLongA(hwnd, GWL_EXSTYLE);
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
/* do not be confused by WS_DLGFRAME set */
|
||||
if ((style & WS_CAPTION) == WS_CAPTION) style &= ~WS_CAPTION;
|
||||
|
||||
if (clear) ok(style & clear, "style %08lx should be set\n", clear);
|
||||
if (set) ok(!(style & set), "style %08lx should not be set\n", set);
|
||||
|
||||
ok(SetScrollRange(hwnd, ctl, min, max, FALSE), "SetScrollRange(%d) error %ld\n", ctl, GetLastError());
|
||||
if ((style & (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME)) || (exstyle & WS_EX_DLGMODALFRAME))
|
||||
ok_sequence(WmSetScrollRangeHV_NC_Seq, "SetScrollRange(SB_HORZ/SB_VERT) NC");
|
||||
else
|
||||
ok_sequence(WmSetScrollRangeHVSeq, "SetScrollRange(SB_HORZ/SB_VERT)");
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
if (set) ok(style & set, "style %08lx should be set\n", set);
|
||||
if (clear) ok(!(style & clear), "style %08lx should not be set\n", clear);
|
||||
|
||||
/* a subsequent call should do nothing */
|
||||
ok(SetScrollRange(hwnd, ctl, min, max, FALSE), "SetScrollRange(%d) error %ld\n", ctl, GetLastError());
|
||||
ok_sequence(WmEmptySeq, "SetScrollRange(SB_HORZ/SB_VERT)");
|
||||
|
||||
xmin = 0xdeadbeef;
|
||||
xmax = 0xdeadbeef;
|
||||
trace("Ignore GetScrollRange error below if you are on Win9x\n");
|
||||
ok(GetScrollRange(hwnd, ctl, &xmin, &xmax), "GetScrollRange(%d) error %ld\n", ctl, GetLastError());
|
||||
ok_sequence(WmEmptySeq, "GetScrollRange(SB_HORZ/SB_VERT)");
|
||||
ok(xmin == min, "unexpected min scroll value %d\n", xmin);
|
||||
ok(xmax == max, "unexpected max scroll value %d\n", xmax);
|
||||
}
|
||||
|
||||
static void test_hv_scroll_2(HWND hwnd, INT ctl, DWORD clear, DWORD set, INT min, INT max)
|
||||
{
|
||||
DWORD style, exstyle;
|
||||
SCROLLINFO si;
|
||||
|
||||
exstyle = GetWindowLongA(hwnd, GWL_EXSTYLE);
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
/* do not be confused by WS_DLGFRAME set */
|
||||
if ((style & WS_CAPTION) == WS_CAPTION) style &= ~WS_CAPTION;
|
||||
|
||||
if (clear) ok(style & clear, "style %08lx should be set\n", clear);
|
||||
if (set) ok(!(style & set), "style %08lx should not be set\n", set);
|
||||
|
||||
si.cbSize = sizeof(si);
|
||||
si.fMask = SIF_RANGE;
|
||||
si.nMin = min;
|
||||
si.nMax = max;
|
||||
SetScrollInfo(hwnd, ctl, &si, TRUE);
|
||||
if ((style & (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME)) || (exstyle & WS_EX_DLGMODALFRAME))
|
||||
ok_sequence(WmSetScrollRangeHV_NC_Seq, "SetScrollInfo(SB_HORZ/SB_VERT) NC");
|
||||
else
|
||||
ok_sequence(WmSetScrollRangeHVSeq, "SetScrollInfo(SB_HORZ/SB_VERT)");
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
if (set) ok(style & set, "style %08lx should be set\n", set);
|
||||
if (clear) ok(!(style & clear), "style %08lx should not be set\n", clear);
|
||||
|
||||
/* a subsequent call should do nothing */
|
||||
SetScrollInfo(hwnd, ctl, &si, TRUE);
|
||||
ok_sequence(WmEmptySeq, "SetScrollInfo(SB_HORZ/SB_VERT)");
|
||||
|
||||
si.fMask = SIF_PAGE;
|
||||
si.nPage = 5;
|
||||
SetScrollInfo(hwnd, ctl, &si, FALSE);
|
||||
ok_sequence(WmEmptySeq, "SetScrollInfo(SB_HORZ/SB_VERT)");
|
||||
|
||||
si.fMask = SIF_POS;
|
||||
si.nPos = max - 1;
|
||||
SetScrollInfo(hwnd, ctl, &si, FALSE);
|
||||
ok_sequence(WmEmptySeq, "SetScrollInfo(SB_HORZ/SB_VERT)");
|
||||
|
||||
si.fMask = SIF_RANGE;
|
||||
si.nMin = 0xdeadbeef;
|
||||
si.nMax = 0xdeadbeef;
|
||||
ok(GetScrollInfo(hwnd, ctl, &si), "GetScrollInfo error %ld\n", GetLastError());
|
||||
ok_sequence(WmEmptySeq, "GetScrollRange(SB_HORZ/SB_VERT)");
|
||||
ok(si.nMin == min, "unexpected min scroll value %d\n", si.nMin);
|
||||
ok(si.nMax == max, "unexpected max scroll value %d\n", si.nMax);
|
||||
}
|
||||
|
||||
/* Win9x sends WM_USER+xxx while and NT versions send SBM_xxx messages */
|
||||
static void test_scroll_messages(HWND hwnd)
|
||||
{
|
||||
SCROLLINFO si;
|
||||
INT min, max;
|
||||
|
||||
min = 0xdeadbeef;
|
||||
max = 0xdeadbeef;
|
||||
ok(GetScrollRange(hwnd, SB_CTL, &min, &max), "GetScrollRange error %ld\n", GetLastError());
|
||||
if (sequence->message != WmGetScrollRangeSeq[0].message)
|
||||
trace("GetScrollRange(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
/* values of min and max are undefined */
|
||||
flush_sequence();
|
||||
|
||||
ok(SetScrollRange(hwnd, SB_CTL, 10, 150, FALSE), "SetScrollRange error %ld\n", GetLastError());
|
||||
if (sequence->message != WmSetScrollRangeSeq[0].message)
|
||||
trace("SetScrollRange(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
flush_sequence();
|
||||
|
||||
min = 0xdeadbeef;
|
||||
max = 0xdeadbeef;
|
||||
ok(GetScrollRange(hwnd, SB_CTL, &min, &max), "GetScrollRange error %ld\n", GetLastError());
|
||||
if (sequence->message != WmGetScrollRangeSeq[0].message)
|
||||
trace("GetScrollRange(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
/* values of min and max are undefined */
|
||||
flush_sequence();
|
||||
|
||||
si.cbSize = sizeof(si);
|
||||
si.fMask = SIF_RANGE;
|
||||
si.nMin = 20;
|
||||
si.nMax = 160;
|
||||
SetScrollInfo(hwnd, SB_CTL, &si, FALSE);
|
||||
if (sequence->message != WmSetScrollRangeSeq[0].message)
|
||||
trace("SetScrollInfo(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
flush_sequence();
|
||||
|
||||
si.fMask = SIF_PAGE;
|
||||
si.nPage = 10;
|
||||
SetScrollInfo(hwnd, SB_CTL, &si, FALSE);
|
||||
if (sequence->message != WmSetScrollRangeSeq[0].message)
|
||||
trace("SetScrollInfo(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
flush_sequence();
|
||||
|
||||
si.fMask = SIF_POS;
|
||||
si.nPos = 20;
|
||||
SetScrollInfo(hwnd, SB_CTL, &si, FALSE);
|
||||
if (sequence->message != WmSetScrollRangeSeq[0].message)
|
||||
trace("SetScrollInfo(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
flush_sequence();
|
||||
|
||||
si.fMask = SIF_RANGE;
|
||||
si.nMin = 0xdeadbeef;
|
||||
si.nMax = 0xdeadbeef;
|
||||
ok(GetScrollInfo(hwnd, SB_CTL, &si), "GetScrollInfo error %ld\n", GetLastError());
|
||||
if (sequence->message != WmGetScrollInfoSeq[0].message)
|
||||
trace("GetScrollInfo(SB_CTL) generated unknown message %04x\n", sequence->message);
|
||||
/* values of min and max are undefined */
|
||||
flush_sequence();
|
||||
|
||||
/* set WS_HSCROLL */
|
||||
test_hv_scroll_1(hwnd, SB_HORZ, 0, WS_HSCROLL, 10, 150);
|
||||
/* clear WS_HSCROLL */
|
||||
test_hv_scroll_1(hwnd, SB_HORZ, WS_HSCROLL, 0, 0, 0);
|
||||
|
||||
/* set WS_HSCROLL */
|
||||
test_hv_scroll_2(hwnd, SB_HORZ, 0, WS_HSCROLL, 10, 150);
|
||||
/* clear WS_HSCROLL */
|
||||
test_hv_scroll_2(hwnd, SB_HORZ, WS_HSCROLL, 0, 0, 0);
|
||||
|
||||
/* set WS_VSCROLL */
|
||||
test_hv_scroll_1(hwnd, SB_VERT, 0, WS_VSCROLL, 10, 150);
|
||||
/* clear WS_VSCROLL */
|
||||
test_hv_scroll_1(hwnd, SB_VERT, WS_VSCROLL, 0, 0, 0);
|
||||
|
||||
/* set WS_VSCROLL */
|
||||
test_hv_scroll_2(hwnd, SB_VERT, 0, WS_VSCROLL, 10, 150);
|
||||
/* clear WS_VSCROLL */
|
||||
test_hv_scroll_2(hwnd, SB_VERT, WS_VSCROLL, 0, 0, 0);
|
||||
}
|
||||
|
||||
/* test if we receive the right sequence of messages */
|
||||
static void test_messages(void)
|
||||
{
|
||||
|
@ -1214,6 +1423,9 @@ static void test_messages(void)
|
|||
ShowWindow(hwnd, SW_SHOW);
|
||||
test_WM_SETREDRAW(hwnd);
|
||||
|
||||
trace("testing scroll APIs on a visible top level window %p\n", hwnd);
|
||||
test_scroll_messages(hwnd);
|
||||
|
||||
DestroyWindow(hwnd);
|
||||
ok_sequence(WmDestroyOverlappedSeq, "DestroyWindow:overlapped");
|
||||
|
||||
|
@ -1233,6 +1445,10 @@ static void test_messages(void)
|
|||
0, 0, 10, 10, hparent, 0, 0, NULL);
|
||||
ok (hchild != 0, "Failed to create child window\n");
|
||||
ok_sequence(WmCreateVisibleChildSeq, "CreateWindow:visible child");
|
||||
|
||||
trace("testing scroll APIs on a visible child window %p\n", hchild);
|
||||
test_scroll_messages(hchild);
|
||||
|
||||
DestroyWindow(hchild);
|
||||
flush_sequence();
|
||||
|
||||
|
@ -1298,7 +1514,7 @@ static void test_messages(void)
|
|||
ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n");
|
||||
flush_sequence();
|
||||
ShowWindow(hchild, SW_SHOW);
|
||||
ok_sequence(WmShowVisiblePopupSeq, "ShowWindow:show_visible_popup");
|
||||
ok_sequence(WmEmptySeq, "ShowWindow:show_visible_popup");
|
||||
flush_sequence();
|
||||
SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
|
||||
ok_sequence(WmShowVisiblePopupSeq_2, "SetWindowPos:show_visible_popup_2");
|
||||
|
@ -1319,7 +1535,7 @@ static void test_messages(void)
|
|||
ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n");
|
||||
flush_sequence();
|
||||
ShowWindow(hchild, SW_SHOW);
|
||||
ok_sequence(WmShowVisiblePopupSeq, "ShowWindow:show_visible_popup");
|
||||
ok_sequence(WmEmptySeq, "ShowWindow:show_visible_popup");
|
||||
flush_sequence();
|
||||
SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
|
||||
ok_sequence(WmShowVisiblePopupSeq_2, "SetWindowPos:show_visible_popup_2");
|
||||
|
@ -1331,6 +1547,9 @@ static void test_messages(void)
|
|||
ok(hwnd != 0, "Failed to create custom dialog window\n");
|
||||
ok_sequence(WmCreateCustomDialogSeq, "CreateCustomDialog");
|
||||
|
||||
trace("testing scroll APIs on a visible dialog %p\n", hwnd);
|
||||
test_scroll_messages(hwnd);
|
||||
|
||||
flush_sequence();
|
||||
after_end_dialog = 1;
|
||||
EndDialog( hwnd, 0 );
|
||||
|
|
Loading…
Reference in New Issue