diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h index 3fadcc113c0..a0047d6183d 100644 --- a/dlls/user32/controls.h +++ b/dlls/user32/controls.h @@ -123,7 +123,6 @@ extern LRESULT NC_HandleNCMouseMove( HWND hwnd, WPARAM wParam, LPARAM lParam ) D extern LRESULT NC_HandleNCMouseLeave( HWND hwnd ) DECLSPEC_HIDDEN; extern LRESULT NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam) DECLSPEC_HIDDEN; extern LRESULT NC_HandleSysCommand( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; -extern LRESULT NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; /* scrollbar */ diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 57e12d8e00b..fd6c44dd29b 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -225,21 +225,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa case WM_CTLCOLOR: return (LRESULT)DEFWND_ControlColor( (HDC)wParam, HIWORD(lParam) ); - case WM_SETCURSOR: - if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_CHILD) - { - /* with the exception of the border around a resizable wnd, - * give the parent first chance to set the cursor */ - if ((LOWORD(lParam) < HTSIZEFIRST) || (LOWORD(lParam) > HTSIZELAST)) - { - HWND parent = GetParent( hwnd ); - if (parent != GetDesktopWindow() && - SendMessageW( parent, WM_SETCURSOR, wParam, lParam )) return TRUE; - } - } - NC_HandleSetCursor( hwnd, wParam, lParam ); - break; - case WM_SYSCOMMAND: return NC_HandleSysCommand( hwnd, wParam, lParam ); diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index 73d5b6449de..cc31e1b2f2f 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -236,58 +236,6 @@ LRESULT NC_HandleNCMouseLeave(HWND hwnd) return 0; } -/*********************************************************************** - * NC_HandleSetCursor - * - * Handle a WM_SETCURSOR message. Called from DefWindowProc(). - */ -LRESULT NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam ) -{ - hwnd = WIN_GetFullHandle( (HWND)wParam ); - - switch((short)LOWORD(lParam)) - { - case HTERROR: - { - WORD msg = HIWORD( lParam ); - if ((msg == WM_LBUTTONDOWN) || (msg == WM_MBUTTONDOWN) || - (msg == WM_RBUTTONDOWN) || (msg == WM_XBUTTONDOWN)) - MessageBeep(0); - } - break; - - case HTCLIENT: - { - HCURSOR hCursor = (HCURSOR)GetClassLongPtrW(hwnd, GCLP_HCURSOR); - if(hCursor) { - NtUserSetCursor(hCursor); - return TRUE; - } - return FALSE; - } - - case HTLEFT: - case HTRIGHT: - return (LRESULT)NtUserSetCursor( LoadCursorA( 0, (LPSTR)IDC_SIZEWE ) ); - - case HTTOP: - case HTBOTTOM: - return (LRESULT)NtUserSetCursor( LoadCursorA( 0, (LPSTR)IDC_SIZENS ) ); - - case HTTOPLEFT: - case HTBOTTOMRIGHT: - return (LRESULT)NtUserSetCursor( LoadCursorA( 0, (LPSTR)IDC_SIZENWSE ) ); - - case HTTOPRIGHT: - case HTBOTTOMLEFT: - return (LRESULT)NtUserSetCursor( LoadCursorA( 0, (LPSTR)IDC_SIZENESW ) ); - } - - /* Default cursor: arrow */ - return (LRESULT)NtUserSetCursor( LoadCursorA( 0, (LPSTR)IDC_ARROW ) ); -} - - /*********************************************************************** * NC_TrackScrollBar diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index df7cc793ee1..ff2b44c0508 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -414,6 +414,55 @@ static HICON set_window_icon( HWND hwnd, WPARAM type, HICON icon ) return ret; } +static LRESULT handle_set_cursor( HWND hwnd, WPARAM wparam, LPARAM lparam ) +{ + UINT cursor_id = IDC_ARROW; + HCURSOR cursor; + + hwnd = get_full_window_handle( (HWND)wparam ); + + switch((short)LOWORD( lparam )) + { + case HTERROR: + { + WORD msg = HIWORD( lparam ); + if (msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN || + msg == WM_RBUTTONDOWN || msg == WM_XBUTTONDOWN) + message_beep( 0 ); + } + break; + + case HTCLIENT: + cursor = (HCURSOR)get_class_long_ptr( hwnd, GCLP_HCURSOR, FALSE ); + if (!cursor) return FALSE; + NtUserSetCursor( cursor ); + return TRUE; + + case HTLEFT: + case HTRIGHT: + cursor_id = IDC_SIZEWE; + break; + + case HTTOP: + case HTBOTTOM: + cursor_id = IDC_SIZENS; + break; + + case HTTOPLEFT: + case HTBOTTOMRIGHT: + cursor_id = IDC_SIZENWSE; + break; + + case HTTOPRIGHT: + case HTBOTTOMLEFT: + cursor_id = IDC_SIZENESW; + } + + cursor = LoadImageW( 0, MAKEINTRESOURCEW( cursor_id ), IMAGE_CURSOR, + 0, 0, LR_SHARED | LR_DEFAULTSIZE ); + return (LRESULT)NtUserSetCursor( cursor ); +} + static LONG handle_window_pos_changing( HWND hwnd, WINDOWPOS *winpos ) { LONG style = get_window_long( hwnd, GWL_STYLE ); @@ -2307,6 +2356,21 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, result = (LRESULT)get_window_icon( hwnd, wparam ); break; + case WM_SETCURSOR: + if (get_window_long( hwnd, GWL_STYLE ) & WS_CHILD) + { + /* with the exception of the border around a resizable window, + * give the parent first chance to set the cursor */ + if ((LOWORD( lparam ) < HTSIZEFIRST) || (LOWORD( lparam ) > HTSIZELAST)) + { + HWND parent = get_parent( hwnd ); + if (parent != get_desktop_window() && + send_message( parent, WM_SETCURSOR, wparam, lparam )) return TRUE; + } + } + handle_set_cursor( hwnd, wparam, lparam ); + break; + case WM_SYSCOMMAND: result = handle_sys_command( hwnd, wparam, lparam ); break;