diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index b93503e03ff..62d8f093b14 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -471,9 +471,9 @@ NtUserInsertMenuItem( DWORD STDCALL NtUserEnableScrollBar( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + HWND hWnd, + UINT wSBflags, + UINT wArrows); DWORD STDCALL @@ -1220,13 +1220,13 @@ NtUserSBGetParms( DWORD STDCALL NtUserScrollDC( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4, - DWORD Unknown5, - DWORD Unknown6); + HDC hDC, + int dx, + int dy, + CONST RECT *lprcScroll, + CONST RECT *lprcClip , + HRGN hrgnUpdate, + LPRECT lprcUpdate); DWORD STDCALL @@ -1441,10 +1441,10 @@ NtUserSetRipFlags( DWORD STDCALL NtUserSetScrollInfo( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3); + HWND hwnd, + int fnBar, + LPCSCROLLINFO lpsi, + WINBOOL fRedraw); DWORD STDCALL diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index a4b6d09d4b8..df7e0e4db77 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -1,4 +1,4 @@ -/* $Id: scrollbar.c,v 1.11 2003/08/07 04:03:23 royce Exp $ +/* $Id: scrollbar.c,v 1.12 2003/09/07 09:55:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -14,6 +14,8 @@ #include #include #include +#include +#include /* GLOBAL VARIABLES **********************************************************/ /* @@ -51,16 +53,13 @@ static HBITMAP hRgArrowI; #define SA_SSI_REFRESH 0x0004 #define SA_SSI_REPAINT_ARROWS 0x0008 - /* Scroll-bar hit testing */ -enum SCROLL_HITTEST -{ - SCROLL_NOWHERE, /* Outside the scroll bar */ - SCROLL_TOP_ARROW, /* Top or left arrow */ - SCROLL_TOP_RECT, /* Rectangle between the top arrow and the thumb */ - SCROLL_THUMB, /* Thumb rectangle */ - SCROLL_BOTTOM_RECT, /* Rectangle between the thumb and the bottom arrow */ - SCROLL_BOTTOM_ARROW /* Bottom or right arrow */ -}; +/* 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 */ static BOOL SCROLL_MovingThumb = FALSE; /* Is the moving thumb being displayed? */ @@ -69,22 +68,26 @@ static HWND SCROLL_TrackingWin = 0; static INT SCROLL_TrackingBar = 0; static INT SCROLL_TrackingPos = 0; /* static INT SCROLL_TrackingVal = 0; */ -static enum SCROLL_HITTEST SCROLL_trackHitTest; /* Hit test code of the last button-down event */ +static DWORD SCROLL_trackHitTest; /* Hit test code of the last button-down event */ static BOOL SCROLL_trackVertical; -/* FUNCTIONS -*****************************************************************/ +/* INTERNAL FUNCTIONS *********************************************************/ HBRUSH DefWndControlColor (HDC hDC, UINT ctlType); - -WINBOOL STDCALL -GetScrollBarInfo (HWND hwnd, LONG idObject, PSCROLLBARINFO psbi) +DWORD FASTCALL +SCROLL_HitTest(HWND hwnd, LONG idObject, POINT Point) { - int ret = NtUserGetScrollBarInfo (hwnd, idObject, psbi); - - return ret; + RECT WindowRect; + + GetWindowRect(hwnd, &WindowRect); + if (!PtInRect(&WindowRect, Point)) + { + return(SCROLL_NOWHERE); + } + + return SCROLL_NOWHERE; } /* Ported from WINE20020904 */ @@ -114,6 +117,8 @@ DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar); if ( nBar == SB_CTL ) { hBrush = (HBRUSH) NtUserSendMessage (GetParent (hwnd), WM_CTLCOLORSCROLLBAR, (WPARAM) hdc, (LPARAM) hwnd); + if(!hBrush) + hBrush = GetSysColorBrush(COLOR_SCROLLBAR); } else { @@ -269,7 +274,7 @@ SCROLL_DrawScrollBar (HWND hwnd, HDC hdc, INT nBar, BOOL vertical; info.cbSize = sizeof(SCROLLBARINFO); - GetScrollBarInfo (hwnd, nBar, &info); + NtUserGetScrollBarInfo (hwnd, nBar, &info); thumbSize = info.xyThumbBottom - info.xyThumbTop; @@ -343,6 +348,48 @@ END:; /* WIN_ReleaseWndPtr(wndPtr); */ } + +/* FUNCTIONS ******************************************************************/ + + +/* + * @unimplemented + */ +WINBOOL STDCALL +EnableScrollBar(HWND hWnd, UINT wSBflags, UINT wArrows) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @implemented + */ +WINBOOL STDCALL +GetScrollBarInfo(HWND hwnd, LONG idObject, PSCROLLBARINFO psbi) +{ + SCROLLBARINFO sbi; + WINBOOL ret; + + if(!psbi) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlCopyMemory(&sbi, psbi, sizeof(SCROLLBARINFO)); + ret = NtUserGetScrollBarInfo (hwnd, idObject, psbi); + if(ret) + RtlCopyMemory(psbi, &sbi, sizeof(SCROLLBARINFO)); + + return ret; +} + + +/* + * @unimplemented + */ WINBOOL STDCALL GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi) { @@ -350,6 +397,10 @@ GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi) return FALSE; } + +/* + * @unimplemented + */ int STDCALL GetScrollPos (HWND hWnd, int nBar) { @@ -357,6 +408,10 @@ GetScrollPos (HWND hWnd, int nBar) return 0; } + +/* + * @unimplemented + */ WINBOOL STDCALL GetScrollRange (HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos) { @@ -364,6 +419,10 @@ GetScrollRange (HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos) return FALSE; } + +/* + * @unimplemented + */ int STDCALL SetScrollInfo (HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, WINBOOL fRedraw) { @@ -371,6 +430,10 @@ SetScrollInfo (HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, WINBOOL fRedraw) return 0; } + +/* + * @unimplemented + */ int STDCALL SetScrollPos (HWND hWnd, int nBar, int nPos, WINBOOL bRedraw) { @@ -378,6 +441,10 @@ SetScrollPos (HWND hWnd, int nBar, int nPos, WINBOOL bRedraw) return 0; } + +/* + * @unimplemented + */ WINBOOL STDCALL SetScrollRange (HWND hWnd, int nBar, int nMinPos, int nMaxPos, WINBOOL bRedraw) @@ -386,10 +453,12 @@ SetScrollRange (HWND hWnd, return FALSE; } -/* Ported from WINE20020904 */ + +/* + * @implemented + */ WINBOOL STDCALL ShowScrollBar (HWND hWnd, int wBar, WINBOOL bShow) { - NtUserShowScrollBar (hWnd, wBar, bShow); - return TRUE; + return (WINBOOL)NtUserShowScrollBar (hWnd, wBar, bShow); } diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 822b1a23408..d76a8a7a5d8 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.40 2003/08/28 19:37:00 gvg Exp $ +/* $Id: stubs.c,v 1.41 2003/09/07 09:55:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -126,23 +126,6 @@ CopyImage( } - - -/* - * @unimplemented - */ -WINBOOL -STDCALL -EnableScrollBar( - HWND hWnd, - UINT wSBflags, - UINT wArrows) -{ - UNIMPLEMENTED; - return FALSE; -} - - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index f4d7fbfc29e..976280d0933 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.78 2003/09/06 16:59:30 weiden Exp $ +/* $Id: defwnd.c,v 1.79 2003/09/07 09:55:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -862,7 +862,7 @@ DefWndHitTestNC(HWND hWnd, POINT Point) } VOID STATIC -DefWndDoButtonHandle(HWND hWnd, WPARAM wParam) +DefWndDoButton(HWND hWnd, WPARAM wParam) { MSG Msg; BOOL InBtn = TRUE, HasBtn = FALSE; @@ -929,6 +929,16 @@ done: return; } +VOID STATIC +DefWndDoScrollBarDown(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + POINT Point; + Point.x = SLOWORD(lParam); + Point.y = SHIWORD(lParam); + + SendMessageA(hWnd, WM_SYSCOMMAND, Msg + (UINT)wParam, lParam); +} + LRESULT DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam) { @@ -965,19 +975,21 @@ DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam) } case HTHSCROLL: { - SendMessageA(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam); + DefWndDoScrollBarDown(hWnd, SC_HSCROLL, HTHSCROLL, lParam); + //SendMessageA(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam); break; } case HTVSCROLL: { - SendMessageA(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam); + DefWndDoScrollBarDown(hWnd, SC_VSCROLL, HTVSCROLL, lParam); + //SendMessageA(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam); break; } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: { - DefWndDoButtonHandle(hWnd, wParam); + DefWndDoButton(hWnd, wParam); break; } case HTLEFT: diff --git a/reactos/subsys/win32k/include/scroll.h b/reactos/subsys/win32k/include/scroll.h index 27d62149a2e..6ae3c8979d1 100644 --- a/reactos/subsys/win32k/include/scroll.h +++ b/reactos/subsys/win32k/include/scroll.h @@ -1,2 +1,2 @@ -DWORD FASTCALL SCROLL_CreateScrollBar(PWINDOW_OBJECT Window, LONG idObject); -DWORD STDCALL SCROLL_GetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi); +DWORD FASTCALL IntCreateScrollBar(PWINDOW_OBJECT Window, LONG idObject); +BOOL FASTCALL IntDestroyScrollBar(PWINDOW_OBJECT Window, LONG idObject); diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index 9094da58e57..698a733d222 100644 --- a/reactos/subsys/win32k/ntuser/scrollbar.c +++ b/reactos/subsys/win32k/ntuser/scrollbar.c @@ -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.8 2003/08/19 11:48:50 weiden Exp $ +/* $Id: scrollbar.c,v 1.9 2003/09/07 09:55:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -53,8 +53,8 @@ * 'thumbSize' returns the size of the thumb, and 'thumbPos' returns the position of the thumb relative to the left or to * the top. Return TRUE if the scrollbar is vertical, FALSE if horizontal. */ -static BOOL STDCALL -SCROLL_GetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect) +BOOL STDCALL +IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect) { BOOL vertical; RECT ClientRect = Window->ClientRect; @@ -105,17 +105,21 @@ SCROLL_GetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect) return vertical; } -DWORD FASTCALL SCROLL_CreateScrollBar(PWINDOW_OBJECT Window, LONG idObject) +DWORD FASTCALL +IntCreateScrollBar(PWINDOW_OBJECT Window, LONG idObject) { PSCROLLBARINFO psbi; LRESULT Result; INT i; + psbi = ExAllocatePool(PagedPool, sizeof(SCROLLBARINFO)); + if(!psbi) + return FALSE; + Result = WinPosGetNonClientSize(Window->Self, &Window->WindowRect, &Window->ClientRect); - psbi = ExAllocatePool(PagedPool, sizeof(SCROLLBARINFO)); psbi->cbSize = sizeof(SCROLLBARINFO); for (i=0; iwExtra = psbi; break; default: + ExFreePool(psbi); return FALSE; } - SCROLL_GetScrollBarRect (Window, idObject, &(psbi->rcScrollBar)); + IntGetScrollBarRect (Window, idObject, &(psbi->rcScrollBar)); return 0; } -DWORD STDCALL SCROLL_GetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) +BOOL FASTCALL +IntDestroyScrollBar(PWINDOW_OBJECT Window, LONG idObject) { switch(idObject) { case SB_HORZ: - memcpy(psbi, Window->pHScroll, psbi->cbSize); - break; + if(Window->pHScroll) + { + ExFreePool(Window->pHScroll); + Window->pHScroll = NULL; + return TRUE; + } + return FALSE; case SB_VERT: - memcpy(psbi, Window->pVScroll, psbi->cbSize); - break; + if(Window->pVScroll) + { + ExFreePool(Window->pVScroll); + Window->pVScroll = NULL; + return TRUE; + } + return FALSE; case SB_CTL: - memcpy(psbi, Window->wExtra, psbi->cbSize); - break; - default: - IntReleaseWindowObject(Window); + if(Window->wExtra) + { + ExFreePool(Window->wExtra); + Window->wExtra = NULL; + return TRUE; + } return FALSE; } - - SCROLL_GetScrollBarRect (Window, idObject, &(psbi->rcScrollBar)); - - return TRUE; + return FALSE; } + DWORD STDCALL NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi) { - PWINDOW_OBJECT Window = IntGetWindowObject(hWnd); + PWINDOW_OBJECT Window; + + if(!psbi || (psbi->cbSize != sizeof(SCROLLBARINFO))) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + Window = IntGetWindowObject(hWnd); - if (!Window) return FALSE; + if(!Window) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } - SCROLL_GetScrollBarInfo(Window, idObject, psbi); + switch(idObject) + { + case SB_HORZ: + memcpy(psbi, Window->pHScroll, sizeof(SCROLLBARINFO)); + break; + case SB_VERT: + memcpy(psbi, Window->pVScroll, sizeof(SCROLLBARINFO)); + break; + case SB_CTL: + memcpy(psbi, Window->wExtra, sizeof(SCROLLBARINFO)); + break; + default: + IntReleaseWindowObject(Window); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + IntGetScrollBarRect (Window, idObject, &(psbi->rcScrollBar)); IntReleaseWindowObject(Window); - return TRUE; } DWORD STDCALL NtUserEnableScrollBar( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) + HWND hWnd, + UINT wSBflags, + UINT wArrows) { return 0; } @@ -192,13 +236,13 @@ NtUserEnableScrollBar( DWORD STDCALL NtUserScrollDC( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4, - DWORD Unknown5, - DWORD Unknown6) + HDC hDC, + int dx, + int dy, + CONST RECT *lprcScroll, + CONST RECT *lprcClip , + HRGN hrgnUpdate, + LPRECT lprcUpdate) { UNIMPLEMENTED @@ -209,10 +253,10 @@ NtUserScrollDC( DWORD STDCALL NtUserSetScrollInfo( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3) + HWND hwnd, + int fnBar, + LPCSCROLLINFO lpsi, + WINBOOL fRedraw) { UNIMPLEMENTED @@ -227,11 +271,16 @@ NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) BOOL fShowV = (wBar == SB_VERT) ? 0 : bShow; BOOL fShowH = (wBar == SB_HORZ) ? 0 : bShow; PWINDOW_OBJECT Window = IntGetWindowObject(hWnd); + if(!Window) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } switch (wBar) { case SB_CTL: - NtUserShowWindow (hWnd, fShowH ? SW_SHOW : SW_HIDE); + WinPosShowWindow (hWnd, fShowH ? SW_SHOW : SW_HIDE); return TRUE; case SB_BOTH: @@ -274,7 +323,7 @@ NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) if (fShowH || fShowV) /* frame has been changed, let the window redraw itself */ { - NtUserSetWindowPos (hWnd, 0, 0, 0, 0, 0, + WinPosSetWindowPos (hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED); return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ab9d9262924..796ed70c472 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -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: window.c,v 1.106 2003/08/29 09:29:11 gvg Exp $ +/* $Id: window.c,v 1.107 2003/09/07 09:55:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -248,6 +248,9 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, ExAcquireFastMutexUnsafe (&ThreadData->WindowListLock); RemoveEntryList(&Window->ThreadListEntry); ExReleaseFastMutexUnsafe (&ThreadData->WindowListLock); + + IntDestroyScrollBar(Window, SB_VERT); + IntDestroyScrollBar(Window, SB_HORZ); Window->Class = NULL; ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self); @@ -1272,9 +1275,9 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* Initialize the window's scrollbars */ if (dwStyle & WS_VSCROLL) - SCROLL_CreateScrollBar(WindowObject, SB_VERT); + IntCreateScrollBar(WindowObject, SB_VERT); if (dwStyle & WS_HSCROLL) - SCROLL_CreateScrollBar(WindowObject, SB_HORZ); + IntCreateScrollBar(WindowObject, SB_HORZ); /* Send a NCCREATE message. */ Cs.lpCreateParams = lpParam;