mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 05:25:48 +00:00
implemented a couple of scrollbar functions and fixed GetDoubleClickTime()
svn path=/trunk/; revision=6051
This commit is contained in:
parent
fd08241470
commit
a9160ac5fd
6 changed files with 288 additions and 160 deletions
|
@ -156,7 +156,6 @@ NtUserCallNextHookEx(
|
|||
DWORD Unknown2,
|
||||
DWORD Unknown3);
|
||||
|
||||
#define NOPARAM_ROUTINE_GETDOUBLECLICKTIME 0x01
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserCallNoParam(
|
||||
|
@ -675,7 +674,7 @@ NtUserGetDC(HWND hWnd);
|
|||
|
||||
HDC STDCALL NtUserGetDCEx(HWND hWnd, HANDLE hRegion, ULONG Flags);
|
||||
|
||||
DWORD
|
||||
UINT
|
||||
STDCALL
|
||||
NtUserGetDoubleClickTime(VOID);
|
||||
|
||||
|
@ -1453,7 +1452,7 @@ STDCALL
|
|||
NtUserSetScrollInfo(
|
||||
HWND hwnd,
|
||||
int fnBar,
|
||||
LPCSCROLLINFO lpsi,
|
||||
LPSCROLLINFO lpsi,
|
||||
WINBOOL fRedraw);
|
||||
|
||||
DWORD
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/* $Id: scrollbar.c,v 1.14 2003/09/08 15:08:56 weiden Exp $
|
||||
/* $Id: scrollbar.c,v 1.15 2003/09/12 12:54:26 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: Windows
|
||||
* FILE: subsys/win32k/ntuser/window.c
|
||||
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
||||
* Thomas Weidenmueller (w3seek@users.sourceforge.net)
|
||||
* REVISION HISTORY:
|
||||
* 06-06-2001 CSH Created
|
||||
*/
|
||||
|
@ -41,7 +42,6 @@ static HBITMAP hRgArrowI;
|
|||
#define RIGHT_ARROW(flags,pressed) \
|
||||
(((flags)&ESB_DISABLE_RIGHT) ? hRgArrowI : ((pressed) ? hRgArrowD:hRgArrow))
|
||||
|
||||
#define SCROLL_ARROW_THUMB_OVERLAP 0 /* Overlap between arrows and thumb */
|
||||
#define SCROLL_MIN_THUMB 6 /* Minimum size of the thumb in pixels */
|
||||
#define SCROLL_FIRST_DELAY 200 /* Delay (in ms) before first repetition when holding the button down */
|
||||
#define SCROLL_REPEAT_DELAY 50 /* Delay (in ms) between scroll repetitions */
|
||||
|
@ -82,6 +82,7 @@ SCROLL_DrawInterior (HWND hwnd, HDC hdc, INT nBar, BOOL vertical, INT
|
|||
arrowSize, PSCROLLBARINFO psbi)
|
||||
{
|
||||
INT thumbSize = psbi->xyThumbBottom - psbi->xyThumbTop;
|
||||
RECT rc;
|
||||
HPEN hSavePen;
|
||||
HBRUSH hSaveBrush, hBrush;
|
||||
BOOLEAN top_selected = FALSE, bottom_selected = FALSE;
|
||||
|
@ -118,23 +119,27 @@ DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar);
|
|||
/* Calculate the scroll rectangle */
|
||||
if (vertical)
|
||||
{
|
||||
psbi->rcScrollBar.top += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
|
||||
psbi->rcScrollBar.bottom -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
|
||||
rc.top = psbi->rcScrollBar.top + arrowSize;
|
||||
rc.bottom = psbi->rcScrollBar.bottom - arrowSize;
|
||||
rc.left = psbi->rcScrollBar.left;
|
||||
rc.right = psbi->rcScrollBar.right;
|
||||
}
|
||||
else
|
||||
{
|
||||
psbi->rcScrollBar.left += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
|
||||
psbi->rcScrollBar.right -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
|
||||
rc.top = psbi->rcScrollBar.top;
|
||||
rc.bottom = psbi->rcScrollBar.bottom;
|
||||
rc.left = psbi->rcScrollBar.left + arrowSize;
|
||||
rc.right = psbi->rcScrollBar.right - arrowSize;
|
||||
}
|
||||
|
||||
/* Draw the scroll rectangles and thumb */
|
||||
if (!psbi->dxyLineButton) /* No thumb to draw */
|
||||
if (!psbi->xyThumbBottom) /* No thumb to draw */
|
||||
{
|
||||
PatBlt (hdc,
|
||||
psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.top,
|
||||
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
|
||||
rc.left,
|
||||
rc.top,
|
||||
rc.right - rc.left,
|
||||
rc.bottom - rc.top,
|
||||
PATCOPY);
|
||||
|
||||
/* cleanup and return */
|
||||
|
@ -142,44 +147,46 @@ DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar);
|
|||
SelectObject (hdc, hSaveBrush);
|
||||
return;
|
||||
}
|
||||
|
||||
psbi->xyThumbTop -= arrowSize;
|
||||
|
||||
if (vertical)
|
||||
{
|
||||
PatBlt (hdc,
|
||||
psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.top,
|
||||
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
|
||||
psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
|
||||
rc.left,
|
||||
rc.top,
|
||||
rc.right - rc.left,
|
||||
psbi->dxyLineButton,
|
||||
top_selected ? 0x0f0000 : PATCOPY);
|
||||
psbi->rcScrollBar.top += psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
|
||||
rc.top += psbi->xyThumbTop;
|
||||
PatBlt (hdc,
|
||||
psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.top + thumbSize,
|
||||
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top - thumbSize,
|
||||
rc.left,
|
||||
rc.top + thumbSize,
|
||||
rc.right - rc.left,
|
||||
rc.bottom - rc.top - thumbSize,
|
||||
bottom_selected ? 0x0f0000 : PATCOPY);
|
||||
psbi->rcScrollBar.bottom = psbi->rcScrollBar.top + thumbSize;
|
||||
rc.bottom = rc.top + thumbSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
PatBlt (hdc,
|
||||
psbi->rcScrollBar.left,
|
||||
psbi->rcScrollBar.top,
|
||||
psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
|
||||
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
|
||||
rc.left,
|
||||
rc.top,
|
||||
psbi->xyThumbTop,
|
||||
rc.bottom - rc.top,
|
||||
top_selected ? 0x0f0000 : PATCOPY);
|
||||
psbi->rcScrollBar.left += psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
|
||||
rc.left += psbi->xyThumbTop;
|
||||
PatBlt (hdc,
|
||||
psbi->rcScrollBar.left + thumbSize,
|
||||
psbi->rcScrollBar.top,
|
||||
psbi->rcScrollBar.right - psbi->rcScrollBar.left - thumbSize,
|
||||
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
|
||||
rc.left + thumbSize,
|
||||
rc.top,
|
||||
rc.right - rc.left - thumbSize,
|
||||
rc.bottom - rc.top,
|
||||
bottom_selected ? 0x0f0000 : PATCOPY);
|
||||
psbi->rcScrollBar.right = psbi->rcScrollBar.left + thumbSize;
|
||||
rc.right = rc.left + thumbSize;
|
||||
}
|
||||
|
||||
/* Draw the thumb */
|
||||
DrawEdge (hdc, &psbi->rcScrollBar, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
||||
DrawEdge (hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
||||
|
||||
/* cleanup */
|
||||
SelectObject (hdc, hSavePen);
|
||||
|
@ -198,10 +205,10 @@ SCROLL_DrawMovingThumb (HDC hdc, RECT * rect, BOOL vertical, int arrowSize, int
|
|||
else
|
||||
max_size = psbi->rcScrollBar.right - psbi->rcScrollBar.left;
|
||||
|
||||
max_size -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) + thumbSize;
|
||||
max_size -= arrowSize + thumbSize;
|
||||
|
||||
if (pos < (arrowSize - SCROLL_ARROW_THUMB_OVERLAP))
|
||||
pos = (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
|
||||
if (pos < arrowSize)
|
||||
pos = arrowSize;
|
||||
else if (pos > max_size)
|
||||
pos = max_size;
|
||||
|
||||
|
@ -365,7 +372,7 @@ SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging )
|
|||
|
||||
sbi.cbSize = sizeof(SCROLLBARINFO);
|
||||
NtUserGetScrollBarInfo(hwnd, vertical ? OBJID_VSCROLL : OBJID_HSCROLL, &sbi);
|
||||
|
||||
|
||||
OffsetRect(&sbi.rcScrollBar, wndrect.left, wndrect.top);
|
||||
|
||||
if ( (bDragging && !SCROLL_PtInRectEx( &sbi.rcScrollBar, pt, vertical )) ||
|
||||
|
@ -437,35 +444,80 @@ GetScrollBarInfo(HWND hwnd, LONG idObject, PSCROLLBARINFO psbi)
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
WINBOOL STDCALL
|
||||
GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
WINBOOL res;
|
||||
SCROLLINFO si;
|
||||
|
||||
if(!lpsi ||
|
||||
((lpsi->cbSize != sizeof(SCROLLINFO)) && (lpsi->cbSize != sizeof(SCROLLINFO))))
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
RtlZeroMemory(&si, sizeof(SCROLLINFO));
|
||||
si.cbSize = lpsi->cbSize;
|
||||
si.fMask = lpsi->fMask;
|
||||
|
||||
res = (WINBOOL)NtUserGetScrollInfo(hwnd, fnBar, &si);
|
||||
|
||||
if(res)
|
||||
{
|
||||
RtlCopyMemory(lpsi, &si, lpsi->cbSize);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int STDCALL
|
||||
GetScrollPos (HWND hWnd, int nBar)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
SCROLLINFO si;
|
||||
BOOL ret;
|
||||
int res = 0;
|
||||
|
||||
si.cbSize = sizeof(SCROLLINFO);
|
||||
si.fMask = SIF_POS;
|
||||
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
|
||||
if(ret)
|
||||
res = si.nPos;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
WINBOOL STDCALL
|
||||
GetScrollRange (HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
WINBOOL ret;
|
||||
SCROLLINFO si;
|
||||
|
||||
if(!lpMinPos || !lpMaxPos)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
si.cbSize = sizeof(SCROLLINFO);
|
||||
si.fMask = SIF_RANGE;
|
||||
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
|
||||
if(ret)
|
||||
{
|
||||
*lpMinPos = si.nMin;
|
||||
*lpMaxPos = si.nMax;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -488,25 +540,55 @@ SetScrollInfo (HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, WINBOOL fRedraw)
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int STDCALL
|
||||
SetScrollPos (HWND hWnd, int nBar, int nPos, WINBOOL bRedraw)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
int Res = 0;
|
||||
BOOL ret;
|
||||
SCROLLINFO si;
|
||||
|
||||
si.cbSize = sizeof(SCROLLINFO);
|
||||
si.fMask = SIF_POS;
|
||||
|
||||
/* call NtUserGetScrollInfo() because we need to return the previous position */
|
||||
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
|
||||
|
||||
if(ret)
|
||||
{
|
||||
Res = si.nPos;
|
||||
|
||||
if(Res != nPos)
|
||||
{
|
||||
si.nPos = nPos;
|
||||
/* finally set the new position */
|
||||
NtUserSetScrollInfo(hWnd, nBar, &si, bRedraw);
|
||||
}
|
||||
}
|
||||
|
||||
return Res;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
WINBOOL STDCALL
|
||||
SetScrollRange (HWND hWnd,
|
||||
int nBar, int nMinPos, int nMaxPos, WINBOOL bRedraw)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
SCROLLINFO si;
|
||||
|
||||
si.cbSize = sizeof(SCROLLINFO);
|
||||
si.fMask = SIF_RANGE;
|
||||
si.nMin = nMinPos;
|
||||
si.nMax = nMaxPos;
|
||||
|
||||
NtUserSetScrollInfo(hWnd, nBar, &si, bRedraw);
|
||||
/* FIXME - check if called successfully */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: input.c,v 1.17 2003/08/28 18:04:59 weiden Exp $
|
||||
/* $Id: input.c,v 1.18 2003/09/12 12:54:26 weiden Exp $
|
||||
*
|
||||
* PROJECT: ReactOS user32.dll
|
||||
* FILE: lib/user32/windows/input.c
|
||||
|
@ -107,7 +107,7 @@ UINT
|
|||
STDCALL
|
||||
GetDoubleClickTime(VOID)
|
||||
{
|
||||
return (UINT)NtUserCallNoParam(NOPARAM_ROUTINE_GETDOUBLECLICKTIME);
|
||||
return NtUserGetDoubleClickTime();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: misc.c,v 1.15 2003/08/29 09:29:11 gvg Exp $
|
||||
/* $Id: misc.c,v 1.16 2003/09/12 12:54:26 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -24,32 +24,20 @@
|
|||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
* @unimplemented
|
||||
*/
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserCallNoParam(
|
||||
DWORD Routine)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
DWORD Result = 0;
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
|
||||
/*
|
||||
switch(Routine)
|
||||
{
|
||||
case NOPARAM_ROUTINE_GETDOUBLECLICKTIME:
|
||||
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
||||
KernelMode,
|
||||
0,
|
||||
&WinStaObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return (DWORD)FALSE;
|
||||
|
||||
Result = WinStaObject->SystemCursor.DblClickSpeed;
|
||||
|
||||
ObDereferenceObject(WinStaObject);
|
||||
return Result;
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam()\n", Routine);
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
|
@ -328,3 +316,25 @@ NtUserSystemParametersInfo(
|
|||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
UINT
|
||||
STDCALL
|
||||
NtUserGetDoubleClickTime(VOID)
|
||||
{
|
||||
UINT Result;
|
||||
NTSTATUS Status;
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
|
||||
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
||||
KernelMode,
|
||||
0,
|
||||
&WinStaObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return (DWORD)FALSE;
|
||||
|
||||
Result = WinStaObject->SystemCursor.DblClickSpeed;
|
||||
|
||||
ObDereferenceObject(WinStaObject);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: scrollbar.c,v 1.13 2003/09/08 18:50:00 weiden Exp $
|
||||
/* $Id: scrollbar.c,v 1.14 2003/09/12 12:54:26 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -120,17 +120,15 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect)
|
|||
switch (nBar)
|
||||
{
|
||||
case SB_HORZ:
|
||||
lprect->left = ClientRect.left - WindowRect.left;
|
||||
lprect->left = ClientRect.left - WindowRect.left + 1;
|
||||
lprect->top = ClientRect.bottom - WindowRect.top;
|
||||
lprect->right = ClientRect.right - WindowRect.left;
|
||||
lprect->right = ClientRect.right - WindowRect.left - 1;
|
||||
lprect->bottom = lprect->top + NtUserGetSystemMetrics (SM_CYHSCROLL);
|
||||
if (Window->Style & WS_BORDER)
|
||||
{
|
||||
lprect->left--;
|
||||
lprect->right++;
|
||||
}
|
||||
else if (Window->Style & WS_VSCROLL)
|
||||
lprect->right++;
|
||||
vertical = FALSE;
|
||||
break;
|
||||
|
||||
|
@ -166,76 +164,63 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect)
|
|||
BOOL FASTCALL
|
||||
IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPSCROLLINFO psi)
|
||||
{
|
||||
INT xThumb, yThumb, ThumbBox, cxy;
|
||||
INT Thumb, ThumbBox, ThumbPos, cxy, mx;
|
||||
switch(idObject)
|
||||
{
|
||||
case SB_HORZ:
|
||||
xThumb = NtUserGetSystemMetrics(SM_CXHSCROLL);
|
||||
Thumb = NtUserGetSystemMetrics(SM_CXHSCROLL);
|
||||
cxy = psbi->rcScrollBar.right - psbi->rcScrollBar.left;
|
||||
if(cxy < (2 * xThumb))
|
||||
{
|
||||
xThumb = cxy / 2;
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CXHTHUMB);
|
||||
cxy -= (2 * xThumb);
|
||||
if(cxy >= ThumbBox)
|
||||
{
|
||||
if(psi->nPage)
|
||||
{
|
||||
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
|
||||
}
|
||||
psbi->xyThumbTop = xThumb;
|
||||
psbi->xyThumbBottom = xThumb + ThumbBox;
|
||||
}
|
||||
else
|
||||
{
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
}
|
||||
}
|
||||
psbi->dxyLineButton = xThumb;
|
||||
return TRUE;
|
||||
break;
|
||||
case SB_VERT:
|
||||
yThumb = NtUserGetSystemMetrics(SM_CYVSCROLL);
|
||||
Thumb = NtUserGetSystemMetrics(SM_CYVSCROLL);
|
||||
cxy = psbi->rcScrollBar.bottom - psbi->rcScrollBar.top;
|
||||
if(cxy < (2 * yThumb))
|
||||
{
|
||||
yThumb = cxy / 2;
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CYVTHUMB);
|
||||
cxy -= (2 * yThumb);
|
||||
if(cxy >= ThumbBox)
|
||||
{
|
||||
if(psi->nPage)
|
||||
{
|
||||
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
|
||||
}
|
||||
psbi->xyThumbTop = yThumb;
|
||||
psbi->xyThumbBottom = yThumb + ThumbBox;
|
||||
}
|
||||
else
|
||||
{
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
}
|
||||
}
|
||||
psbi->dxyLineButton = yThumb;
|
||||
return TRUE;
|
||||
break;
|
||||
case SB_CTL:
|
||||
/* FIXME */
|
||||
return FALSE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
ThumbPos = Thumb;
|
||||
/* calculate Thumb */
|
||||
if(cxy <= (2 * Thumb))
|
||||
{
|
||||
Thumb = cxy / 2;
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
ThumbPos = Thumb;
|
||||
}
|
||||
else
|
||||
{
|
||||
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CXHTHUMB);
|
||||
cxy -= (2 * Thumb);
|
||||
if(cxy >= ThumbBox)
|
||||
{
|
||||
if(psi->nPage)
|
||||
{
|
||||
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
|
||||
}
|
||||
|
||||
if(cxy > ThumbBox)
|
||||
{
|
||||
mx = psi->nMax - max(psi->nPage - 1, 0);
|
||||
if(psi->nMin < mx)
|
||||
ThumbPos = Thumb + IntMulDiv(cxy, psi->nPos - psi->nMin, psi->nMax - psi->nMin + 1);
|
||||
}
|
||||
|
||||
psbi->xyThumbTop = ThumbPos;
|
||||
psbi->xyThumbBottom = ThumbPos + ThumbBox;
|
||||
}
|
||||
else
|
||||
{
|
||||
psbi->xyThumbTop = 0;
|
||||
psbi->xyThumbBottom = 0;
|
||||
}
|
||||
}
|
||||
psbi->dxyLineButton = Thumb;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
DWORD FASTCALL
|
||||
|
@ -443,8 +428,17 @@ STDCALL
|
|||
NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
|
||||
{
|
||||
PWINDOW_OBJECT Window;
|
||||
LPSCROLLINFO psi;
|
||||
UINT Mask;
|
||||
PSCROLLBARINFO Info = NULL;
|
||||
|
||||
if(!lpsi || ((lpsi->cbSize != sizeof(SCROLLINFO)) &&
|
||||
(lpsi->cbSize != sizeof(SCROLLINFO) - sizeof(lpsi->nTrackPos))))
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Window = IntGetWindowObject(hwnd);
|
||||
|
||||
if(!Window)
|
||||
|
@ -457,20 +451,49 @@ NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
|
|||
{
|
||||
case SB_HORZ:
|
||||
Info = Window->pHScroll;
|
||||
break;
|
||||
if(Info)
|
||||
break;
|
||||
/* fall through */
|
||||
case SB_VERT:
|
||||
Info = Window->pVScroll;
|
||||
break;
|
||||
if(Info)
|
||||
break;
|
||||
/* fall through */
|
||||
case SB_CTL:
|
||||
Info = Window->wExtra;
|
||||
break;
|
||||
if(Info)
|
||||
break;
|
||||
/* fall through */
|
||||
default:
|
||||
IntReleaseWindowObject(Window);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
psi = (LPSCROLLINFO)((PSCROLLBARINFO)(Info + 1));
|
||||
|
||||
if(lpsi->fMask == SIF_ALL)
|
||||
Mask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
|
||||
else
|
||||
Mask = lpsi->fMask;
|
||||
|
||||
if(Mask & SIF_PAGE)
|
||||
{
|
||||
lpsi->nPage = psi->nPage;
|
||||
}
|
||||
|
||||
if(Mask & SIF_POS)
|
||||
{
|
||||
lpsi->nPos = psi->nPos;
|
||||
}
|
||||
|
||||
if(Mask & SIF_RANGE)
|
||||
{
|
||||
lpsi->nMin = psi->nMin;
|
||||
lpsi->nMax = psi->nMax;
|
||||
}
|
||||
|
||||
IntReleaseWindowObject(Window);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -547,7 +570,7 @@ STDCALL
|
|||
NtUserSetScrollInfo(
|
||||
HWND hwnd,
|
||||
int fnBar,
|
||||
LPCSCROLLINFO lpsi,
|
||||
LPSCROLLINFO lpsi,
|
||||
WINBOOL fRedraw)
|
||||
{
|
||||
PWINDOW_OBJECT Window;
|
||||
|
@ -605,24 +628,47 @@ NtUserSetScrollInfo(
|
|||
{
|
||||
/* FIXME */
|
||||
}
|
||||
|
||||
|
||||
if((Mask & SIF_RANGE) && ((psi->nMin != lpsi->nMin) || (psi->nMax != lpsi->nMax)))
|
||||
{
|
||||
/* Invalid range -> range is set to (0,0) */
|
||||
if((lpsi->nMin > lpsi->nMax) ||
|
||||
((UINT)(lpsi->nMax - lpsi->nMin) >= 0x80000000))
|
||||
{
|
||||
psi->nMin = 0;
|
||||
psi->nMax = 0;
|
||||
Chg = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(psi->nMin != lpsi->nMin ||
|
||||
psi->nMax != lpsi->nMax )
|
||||
{
|
||||
//*action |= SA_SSI_REFRESH;
|
||||
psi->nMin = lpsi->nMin;
|
||||
psi->nMax = lpsi->nMax;
|
||||
Chg = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((Mask & SIF_PAGE) && (psi->nPage != lpsi->nPage))
|
||||
{
|
||||
psi->nPage = lpsi->nPage;
|
||||
Chg = TRUE;
|
||||
if(psi->nPage < 0) psi->nPage = 0;
|
||||
else if(psi->nPage > psi->nMax - psi->nMin + 1)
|
||||
psi->nPage = psi->nMax - psi->nMin + 1;
|
||||
}
|
||||
|
||||
if((Mask & SIF_POS) && (psi->nPos != lpsi->nPos))
|
||||
{
|
||||
psi->nPos = lpsi->nPos;
|
||||
Chg = TRUE;
|
||||
}
|
||||
|
||||
if((Mask & SIF_RANGE) && ((psi->nMin != lpsi->nMin) || (psi->nMax != lpsi->nMax)))
|
||||
{
|
||||
psi->nMin = lpsi->nMin;
|
||||
psi->nMax = lpsi->nMax;
|
||||
Chg = TRUE;
|
||||
if(psi->nPos < psi->nMin)
|
||||
psi->nPos = psi->nMin;
|
||||
else if(psi->nPos > psi->nMax - max(psi->nPage - 1, 0))
|
||||
psi->nPos = psi->nMax - max(psi->nPage - 1, 0);
|
||||
}
|
||||
|
||||
/* FIXME check assigned values */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: stubs.c,v 1.27 2003/08/28 18:04:59 weiden Exp $
|
||||
/* $Id: stubs.c,v 1.28 2003/09/12 12:54:26 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -587,15 +587,6 @@ NtUserGetCPD(
|
|||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserGetDoubleClickTime(VOID)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserGetGuiResources(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue