win32u: Move scroll bar WM_CREATE implementation from user32.

This commit is contained in:
Jacek Caban 2022-06-28 21:10:50 +02:00 committed by Alexandre Julliard
parent a7ff88c9a2
commit 6452e67eba
3 changed files with 70 additions and 79 deletions

View file

@ -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 );

View file

@ -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
{

View file

@ -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;