From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/scroll.c | 81 +----------------------------------- dlls/win32u/ntuser_private.h | 6 +++ dlls/win32u/scroll.c | 62 +++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 79 deletions(-)
diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c index 9cb07af0706..cc847b48ec6 100644 --- a/dlls/user32/scroll.c +++ b/dlls/user32/scroll.c @@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(scroll);
typedef struct scroll_info SCROLLBAR_INFO, *LPSCROLLBAR_INFO; +typedef struct scroll_bar_win_data SCROLLBAR_WNDDATA;
/* data for window that has (one or two) scroll bars */ typedef struct @@ -40,12 +41,6 @@ typedef struct SCROLLBAR_INFO vert; } WINSCROLLBAR_INFO, *LPWINSCROLLBAR_INFO;
-typedef struct -{ - DWORD magic; - SCROLLBAR_INFO info; -} SCROLLBAR_WNDDATA; - #define SCROLLBAR_MAGIC 0x5c6011ba
/* Minimum size of the rectangle between the arrows */ @@ -1127,75 +1122,6 @@ void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt ) }
-/*********************************************************************** - * SCROLL_CreateScrollBar - * - * Create a scroll bar - * - * PARAMS - * hwnd [I] Handle of window with scrollbar(s) - * lpCreate [I] The style and place of the scroll bar - */ -static void SCROLL_CreateScrollBar(HWND hwnd, LPCREATESTRUCTW lpCreate) -{ - LPSCROLLBAR_INFO info = NULL; - WND *win; - - TRACE("hwnd=%p lpCreate=%p\n", hwnd, lpCreate); - - win = WIN_GetPtr(hwnd); - if (win->cbWndExtra >= sizeof(SCROLLBAR_WNDDATA)) - { - SCROLLBAR_WNDDATA *data = (SCROLLBAR_WNDDATA*)win->wExtra; - data->magic = SCROLLBAR_MAGIC; - info = &data->info; - } - else WARN("Not enough extra data\n"); - WIN_ReleasePtr(win); - if (!info) return; - - if (lpCreate->style & WS_DISABLED) - { - info->flags = ESB_DISABLE_BOTH; - TRACE("Created WS_DISABLED scrollbar\n"); - } - - if (lpCreate->style & (SBS_SIZEGRIP | SBS_SIZEBOX)) - { - if (lpCreate->style & SBS_SIZEBOXTOPLEFTALIGN) - NtUserMoveWindow( hwnd, lpCreate->x, lpCreate->y, GetSystemMetrics(SM_CXVSCROLL)+1, - GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); - else if(lpCreate->style & SBS_SIZEBOXBOTTOMRIGHTALIGN) - NtUserMoveWindow( hwnd, lpCreate->x+lpCreate->cx-GetSystemMetrics(SM_CXVSCROLL)-1, - lpCreate->y+lpCreate->cy-GetSystemMetrics(SM_CYHSCROLL)-1, - GetSystemMetrics(SM_CXVSCROLL)+1, - GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); - } - else if (lpCreate->style & SBS_VERT) - { - if (lpCreate->style & SBS_LEFTALIGN) - NtUserMoveWindow( hwnd, lpCreate->x, lpCreate->y, - GetSystemMetrics(SM_CXVSCROLL)+1, lpCreate->cy, FALSE ); - else if (lpCreate->style & SBS_RIGHTALIGN) - NtUserMoveWindow( hwnd, - lpCreate->x+lpCreate->cx-GetSystemMetrics(SM_CXVSCROLL)-1, - lpCreate->y, - GetSystemMetrics(SM_CXVSCROLL)+1, lpCreate->cy, FALSE ); - } - else /* SBS_HORZ */ - { - if (lpCreate->style & SBS_TOPALIGN) - NtUserMoveWindow( hwnd, lpCreate->x, lpCreate->y, - lpCreate->cx, GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); - else if (lpCreate->style & SBS_BOTTOMALIGN) - NtUserMoveWindow( hwnd, - lpCreate->x, - lpCreate->y+lpCreate->cy-GetSystemMetrics(SM_CYHSCROLL)-1, - lpCreate->cx, GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); - } -} - - /************************************************************************* * SCROLL_GetScrollInfo * @@ -1409,10 +1335,6 @@ LRESULT WINAPI USER_ScrollBarProc( HWND hwnd, UINT message, WPARAM wParam, LPARA
switch(message) { - case WM_CREATE: - SCROLL_CreateScrollBar(hwnd, (LPCREATESTRUCTW)lParam); - break; - case WM_ENABLE: { SCROLLBAR_INFO *infoPtr; @@ -1503,6 +1425,7 @@ LRESULT WINAPI USER_ScrollBarProc( HWND hwnd, UINT message, WPARAM wParam, LPARA } break;
+ case WM_CREATE: case WM_ERASEBKGND: case WM_GETDLGCODE: return NtUserMessageCall( hwnd, message, wParam, lParam, 0, NtUserScrollBarWndProc, !unicode ); diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 609f7018b07..36c11a49c4e 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -216,6 +216,12 @@ struct scroll_info BOOL painted; /* Whether the scroll bar is painted by DefWinProc() */ };
+struct scroll_bar_win_data +{ + DWORD magic; + struct scroll_info info; +}; + /* FIXME: make it private to class.c */ typedef struct tagWINDOWPROC { diff --git a/dlls/win32u/scroll.c b/dlls/win32u/scroll.c index d6c21fc6992..a15c8bfd36d 100644 --- a/dlls/win32u/scroll.c +++ b/dlls/win32u/scroll.c @@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(scroll);
+#define SCROLLBAR_MAGIC 0x5c6011ba + static struct scroll_info *get_scroll_info_ptr( HWND hwnd, int bar, BOOL alloc ) { struct scroll_info *ret = NULL; @@ -82,10 +84,70 @@ static BOOL show_scroll_bar( HWND hwnd, int bar, BOOL show_horz, BOOL show_vert return FALSE; /* no frame changes */ }
+static void create_scroll_bar( HWND hwnd, CREATESTRUCTW *create ) +{ + struct scroll_info *info = NULL; + WND *win; + + TRACE( "hwnd=%p create=%p\n", hwnd, create ); + + win = get_win_ptr( hwnd ); + if (win->cbWndExtra >= sizeof(struct scroll_bar_win_data)) + { + struct scroll_bar_win_data *data = (struct scroll_bar_win_data *)win->wExtra; + data->magic = SCROLLBAR_MAGIC; + info = &data->info; + } + else WARN( "Not enough extra data\n" ); + release_win_ptr( win ); + if (!info) return; + + if (create->style & WS_DISABLED) + { + info->flags = ESB_DISABLE_BOTH; + TRACE( "Created WS_DISABLED scrollbar\n" ); + } + + if (create->style & (SBS_SIZEGRIP | SBS_SIZEBOX)) + { + if (create->style & SBS_SIZEBOXTOPLEFTALIGN) + NtUserMoveWindow( hwnd, create->x, create->y, get_system_metrics( SM_CXVSCROLL ) + 1, + get_system_metrics( SM_CYHSCROLL ) + 1, FALSE ); + else if(create->style & SBS_SIZEBOXBOTTOMRIGHTALIGN) + NtUserMoveWindow( hwnd, create->x + create->cx - get_system_metrics( SM_CXVSCROLL ) - 1, + create->y + create->cy-get_system_metrics( SM_CYHSCROLL ) - 1, + get_system_metrics( SM_CXVSCROLL ) + 1, + get_system_metrics( SM_CYHSCROLL ) + 1, FALSE ); + } + else if (create->style & SBS_VERT) + { + if (create->style & SBS_LEFTALIGN) + NtUserMoveWindow( hwnd, create->x, create->y, get_system_metrics( SM_CXVSCROLL ) + 1, + create->cy, FALSE ); + else if (create->style & SBS_RIGHTALIGN) + NtUserMoveWindow( hwnd, create->x + create->cx - get_system_metrics( SM_CXVSCROLL ) - 1, + create->y, get_system_metrics( SM_CXVSCROLL ) + 1, create->cy, FALSE ); + } + else /* SBS_HORZ */ + { + if (create->style & SBS_TOPALIGN) + NtUserMoveWindow( hwnd, create->x, create->y, create->cx, + get_system_metrics( SM_CYHSCROLL ) + 1, FALSE ); + else if (create->style & SBS_BOTTOMALIGN) + NtUserMoveWindow( hwnd, create->x, + create->y + create->cy - get_system_metrics( SM_CYHSCROLL ) - 1, + create->cx, get_system_metrics( SM_CYHSCROLL ) + 1, FALSE ); + } +} + LRESULT scroll_bar_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL ansi ) { switch (msg) { + case WM_CREATE: + create_scroll_bar( hwnd, (CREATESTRUCTW *)lparam ); + return 0; + case WM_ERASEBKGND: return 1;