added hittesting for scrollbars and fixed passing the cursor coordinates to NCL messages

svn path=/trunk/; revision=6011
This commit is contained in:
Thomas Bluemel 2003-09-08 02:14:20 +00:00
parent 61009dcbf6
commit 19c18b7f2c
7 changed files with 184 additions and 39 deletions

View file

@ -4592,6 +4592,22 @@ extern "C" {
/* GetFileCompressedSize */
#define INVALID_FILE_SIZE ((DWORD)-1)
/* system ids */
#define OBJID_WINDOW ((LONG)0x00000000)
#define OBJID_SYSMENU ((LONG)0xFFFFFFFF)
#define OBJID_TITLEBAR ((LONG)0xFFFFFFFE)
#define OBJID_MENU ((LONG)0xFFFFFFFD)
#define OBJID_CLIENT ((LONG)0xFFFFFFFC)
#define OBJID_VSCROLL ((LONG)0xFFFFFFFB)
#define OBJID_HSCROLL ((LONG)0xFFFFFFFA)
#define OBJID_SIZEGRIP ((LONG)0xFFFFFFF9)
#define OBJID_CARET ((LONG)0xFFFFFFF8)
#define OBJID_CURSOR ((LONG)0xFFFFFFF7)
#define OBJID_ALERT ((LONG)0xFFFFFFF6)
#define OBJID_SOUND ((LONG)0xFFFFFFF5)
#define OBJID_QUERYCLASSNAMEIDX ((LONG)0xFFFFFFF4)
#define OBJID_NATIVEOM ((LONG)0xFFFFFFF0)
/* --------------------- old stuff, need to organize! --------------- */
/* BEGINNING of windowsx.h stuff from old headers: */

View file

@ -468,7 +468,7 @@ NtUserInsertMenuItem(
LPCMENUITEMINFOW lpmii);
DWORD
BOOL
STDCALL
NtUserEnableScrollBar(
HWND hWnd,

View file

@ -1,4 +1,4 @@
/* $Id: scrollbar.c,v 1.12 2003/09/07 09:55:52 weiden Exp $
/* $Id: scrollbar.c,v 1.13 2003/09/08 02:14:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -54,12 +54,12 @@ static HBITMAP hRgArrowI;
#define SA_SSI_REPAINT_ARROWS 0x0008
/* Scroll-bar hit testing */
#define SCROLL_NOWHERE 0x01 /* Outside the scroll bar */
#define SCROLL_TOP_ARROW 0x02 /* Top or left arrow */
#define SCROLL_TOP_RECT 0x04 /* Rectangle between the top arrow and the thumb */
#define SCROLL_THUMB 0x08 /* Thumb rectangle */
#define SCROLL_BOTTOM_RECT 0x10 /* Rectangle between the thumb and the bottom arrow */
#define SCROLL_BOTTOM_ARROW 0x20 /* Bottom or right arrow */
#define SCROLL_NOWHERE 0x00 /* Outside the scroll bar */
#define SCROLL_TOP_ARROW 0x01 /* Top or left arrow */
#define SCROLL_TOP_RECT 0x02 /* Rectangle between the top arrow and the thumb */
#define SCROLL_THUMB 0x03 /* Thumb rectangle */
#define SCROLL_BOTTOM_RECT 0x04 /* Rectangle between the thumb and the bottom arrow */
#define SCROLL_BOTTOM_ARROW 0x05 /* Bottom or right arrow */
static BOOL SCROLL_MovingThumb = FALSE; /* Is the moving thumb being displayed? */
@ -75,21 +75,6 @@ static BOOL SCROLL_trackVertical;
HBRUSH DefWndControlColor (HDC hDC, UINT ctlType);
DWORD FASTCALL
SCROLL_HitTest(HWND hwnd, LONG idObject, POINT Point)
{
RECT WindowRect;
GetWindowRect(hwnd, &WindowRect);
if (!PtInRect(&WindowRect, Point))
{
return(SCROLL_NOWHERE);
}
return SCROLL_NOWHERE;
}
/* Ported from WINE20020904 */
/* Draw the scroll bar interior (everything except the arrows). */
static void
@ -101,11 +86,11 @@ arrowSize, PSCROLLBARINFO psbi)
HBRUSH hSaveBrush, hBrush;
BOOLEAN top_selected = FALSE, bottom_selected = FALSE;
DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar);
if(psbi->rgstate[2] & STATE_SYSTEM_PRESSED)
if(psbi->rgstate[SCROLL_TOP_RECT] & STATE_SYSTEM_PRESSED)
{
top_selected = TRUE;
}
if(psbi->rgstate[4] & STATE_SYSTEM_PRESSED)
if(psbi->rgstate[SCROLL_BOTTOM_RECT] & STATE_SYSTEM_PRESSED)
{
bottom_selected = TRUE;
}
@ -274,20 +259,20 @@ SCROLL_DrawScrollBar (HWND hwnd, HDC hdc, INT nBar,
BOOL vertical;
info.cbSize = sizeof(SCROLLBARINFO);
NtUserGetScrollBarInfo (hwnd, nBar, &info);
thumbSize = info.xyThumbBottom - info.xyThumbTop;
switch ( nBar )
{
case SB_HORZ:
vertical = FALSE;
NtUserGetScrollBarInfo (hwnd, OBJID_HSCROLL, &info);
break;
case SB_VERT:
vertical = TRUE;
NtUserGetScrollBarInfo (hwnd, OBJID_VSCROLL, &info);
break;
case SB_CTL:
vertical = (GetWindowLongW(hwnd,GWL_STYLE)&SBS_VERT) != 0;
NtUserGetScrollBarInfo (hwnd, OBJID_CLIENT, &info);
break;
#ifdef DBG
default:
@ -295,6 +280,8 @@ SCROLL_DrawScrollBar (HWND hwnd, HDC hdc, INT nBar,
break;
#endif /* DBG */
}
thumbSize = info.xyThumbBottom - info.xyThumbTop;
if (vertical)
arrowSize = GetSystemMetrics(SM_CXVSCROLL);
@ -348,6 +335,82 @@ END:;
/* WIN_ReleaseWndPtr(wndPtr); */
}
static BOOL
SCROLL_PtInRectEx( LPRECT lpRect, POINT pt, BOOL vertical )
{
RECT rect = *lpRect;
if (vertical)
{
rect.left -= lpRect->right - lpRect->left;
rect.right += lpRect->right - lpRect->left;
}
else
{
rect.top -= lpRect->bottom - lpRect->top;
rect.bottom += lpRect->bottom - lpRect->top;
}
return PtInRect( &rect, pt );
}
/*
DWORD FASTCALL
SCROLL_HitTest(HWND hwnd, LONG idObject, POINT Point)
{
RECT WindowRect;
GetWindowRect(hwnd, &WindowRect);
if (!PtInRect(&WindowRect, Point))
{
return(SCROLL_NOWHERE);
}
return SCROLL_NOWHERE;
}
*/
DWORD
SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging )
{
SCROLLBARINFO sbi;
RECT wndrect;
INT arrowSize, thumbSize, thumbPos;
BOOL vertical = (nBar == SB_VERT); /* FIXME - ((Window->Style & SBS_VERT) != 0) */
NtUserGetWindowRect(hwnd, &wndrect);
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 )) ||
(!PtInRect( &sbi.rcScrollBar, pt )) ) return SCROLL_NOWHERE;
if (vertical)
{
arrowSize = GetSystemMetrics(SM_CYVSCROLL);
if (pt.y < sbi.rcScrollBar.top + arrowSize) return SCROLL_TOP_ARROW;
if (pt.y >= sbi.rcScrollBar.bottom - arrowSize) return SCROLL_BOTTOM_ARROW;
if (!thumbPos) return SCROLL_TOP_RECT;
pt.y -= sbi.rcScrollBar.top;
if (pt.y < thumbPos) return SCROLL_TOP_RECT;
if (pt.y >= thumbPos + thumbSize) return SCROLL_BOTTOM_RECT;
}
else /* horizontal */
{
arrowSize = GetSystemMetrics(SM_CXHSCROLL);
if (pt.x < sbi.rcScrollBar.left + arrowSize) return SCROLL_TOP_ARROW;
if (pt.x >= sbi.rcScrollBar.right - arrowSize) return SCROLL_BOTTOM_ARROW;
if (!thumbPos) return SCROLL_TOP_RECT;
pt.x -= sbi.rcScrollBar.left;
if (pt.x < thumbPos) return SCROLL_TOP_RECT;
if (pt.x >= thumbPos + thumbSize) return SCROLL_BOTTOM_RECT;
}
return SCROLL_THUMB;
}
/* FUNCTIONS ******************************************************************/

View file

@ -19,3 +19,6 @@ ULONG
UserHasDlgFrameStyle(ULONG Style, ULONG ExStyle);
ULONG
UserHasThickFrameStyle(ULONG Style, ULONG ExStyle);
DWORD
SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging );

View file

@ -1,4 +1,4 @@
/* $Id: defwnd.c,v 1.81 2003/09/07 17:35:15 ekohl Exp $
/* $Id: defwnd.c,v 1.82 2003/09/08 02:14:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll
@ -933,9 +933,15 @@ VOID STATIC
DefWndDoScrollBarDown(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
POINT Point;
DWORD hit;
Point.x = SLOWORD(lParam);
Point.y = SHIWORD(lParam);
hit = SCROLL_HitTest(hWnd, (wParam == HTHSCROLL) ? SB_HORZ : SB_VERT, Point, FALSE);
if(hit)
DbgPrint("SCROLL_HitTest() == 0x%x\n", hit);
SendMessageA(hWnd, WM_SYSCOMMAND, Msg + (UINT)wParam, lParam);
}

View file

@ -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: msgqueue.c,v 1.21 2003/08/29 19:17:32 weiden Exp $
/* $Id: msgqueue.c,v 1.22 2003/09/08 02:14:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -208,8 +208,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh,
if (Msg == WM_LBUTTONDBLCLK || Msg == WM_RBUTTONDBLCLK || Msg == WM_MBUTTONDBLCLK)
{
if (!(IntGetClassLong(Window, GCL_STYLE, FALSE) & CS_DBLCLKS) &&
((*HitTest) == HTCLIENT))
if (((*HitTest) != HTCLIENT) || !(IntGetClassLong(Window, GCL_STYLE, FALSE) & CS_DBLCLKS))
{
Msg -= (WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);
/* FIXME set WindowStation's system cursor variables:
@ -224,6 +223,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh,
}
*ScreenPoint = Message->Msg.pt;
Point = Message->Msg.pt;
if ((*HitTest) != HTCLIENT)
{
@ -232,7 +232,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh,
}
else
{
Point = Message->Msg.pt;
Point.x -= Window->ClientRect.left;
Point.y -= Window->ClientRect.top;
}

View file

@ -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.10 2003/09/07 11:52:54 weiden Exp $
/* $Id: scrollbar.c,v 1.11 2003/09/08 02:14:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -187,12 +187,57 @@ IntDestroyScrollBar(PWINDOW_OBJECT Window, LONG idObject)
return FALSE;
}
#define CHANGERGSTATE(item, status) \
if(Info->rgstate[(item)] != (status)) \
Chg = TRUE; \
Info->rgstate[(item)] = (status);
BOOL STDCALL
IntEnableScrollBar(BOOL Horz, PSCROLLBARINFO Info, UINT wArrows)
{
BOOL Chg = FALSE;
switch(wArrows)
{
case ESB_DISABLE_BOTH:
CHANGERGSTATE(SBRG_TOPRIGHTBTN, STATE_SYSTEM_UNAVAILABLE);
CHANGERGSTATE(SBRG_BOTTOMLEFTBTN, STATE_SYSTEM_UNAVAILABLE);
break;
case ESB_DISABLE_RTDN:
if(Horz)
{
CHANGERGSTATE(SBRG_BOTTOMLEFTBTN, STATE_SYSTEM_UNAVAILABLE);
}
else
{
CHANGERGSTATE(SBRG_TOPRIGHTBTN, STATE_SYSTEM_UNAVAILABLE);
}
break;
case ESB_DISABLE_LTUP:
if(Horz)
{
CHANGERGSTATE(SBRG_TOPRIGHTBTN, STATE_SYSTEM_UNAVAILABLE);
}
else
{
CHANGERGSTATE(SBRG_BOTTOMLEFTBTN, STATE_SYSTEM_UNAVAILABLE);
}
break;
case ESB_ENABLE_BOTH:
CHANGERGSTATE(SBRG_TOPRIGHTBTN, 0);
CHANGERGSTATE(SBRG_BOTTOMLEFTBTN, 0);
break;
}
return Chg;
}
BOOL
STDCALL
NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi)
{
PWINDOW_OBJECT Window;
INT Bar;
if(!psbi || (psbi->cbSize != sizeof(SCROLLBARINFO)))
{
@ -210,23 +255,26 @@ NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi)
switch(idObject)
{
case SB_HORZ:
case OBJID_HSCROLL:
if(Window->pHScroll)
{
Bar = SB_HORZ;
memcpy(psbi, Window->pHScroll, sizeof(SCROLLBARINFO));
break;
}
/* fall through */
case SB_VERT:
case OBJID_VSCROLL:
if(Window->pVScroll)
{
Bar = SB_VERT;
memcpy(psbi, Window->pVScroll, sizeof(SCROLLBARINFO));
break;
}
/* fall through */
case SB_CTL:
case OBJID_CLIENT:
if(Window->wExtra)
{
Bar = SB_CTL;
memcpy(psbi, Window->wExtra, sizeof(SCROLLBARINFO));
break;
}
@ -237,7 +285,7 @@ NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi)
return FALSE;
}
IntGetScrollBarRect (Window, idObject, &(psbi->rcScrollBar));
IntGetScrollBarRect (Window, Bar, &(psbi->rcScrollBar));
IntReleaseWindowObject(Window);
return TRUE;
@ -280,7 +328,7 @@ NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
}
DWORD
BOOL
STDCALL
NtUserEnableScrollBar(
HWND hWnd,
@ -289,6 +337,7 @@ NtUserEnableScrollBar(
{
PWINDOW_OBJECT Window;
PSCROLLBARINFO InfoV = NULL, InfoH = NULL;
BOOL Chg = FALSE;
Window = IntGetWindowObject(hWnd);
@ -317,6 +366,15 @@ NtUserEnableScrollBar(
return FALSE;
}
if(InfoV)
Chg = IntEnableScrollBar(FALSE, InfoV, wArrows);
if(InfoH)
Chg = (IntEnableScrollBar(TRUE, InfoH, wArrows) || Chg);
if(Chg)
/* FIXME - repaint scrollbars */
IntReleaseWindowObject(Window);
return TRUE;
}