user32: Allow scrollbar control to store scroll info in subclassed window.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46004
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45966
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2018-11-06 13:31:22 +01:00 committed by Alexandre Julliard
parent a090314c72
commit 8c8701befb
2 changed files with 29 additions and 7 deletions

View File

@ -50,6 +50,14 @@ typedef struct
SCROLLBAR_INFO vert; SCROLLBAR_INFO vert;
} WINSCROLLBAR_INFO, *LPWINSCROLLBAR_INFO; } 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 */ /* Minimum size of the rectangle between the arrows */
#define SCROLL_MIN_RECT 4 #define SCROLL_MIN_RECT 4
@ -118,7 +126,7 @@ const struct builtin_class_descr SCROLL_builtin_class =
scrollbarW, /* name */ scrollbarW, /* name */
CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */
WINPROC_SCROLLBAR, /* proc */ WINPROC_SCROLLBAR, /* proc */
sizeof(SCROLLBAR_INFO), /* extra */ sizeof(SCROLLBAR_WNDDATA), /* extra */
IDC_ARROW, /* cursor */ IDC_ARROW, /* cursor */
0 /* brush */ 0 /* brush */
}; };
@ -159,8 +167,13 @@ static SCROLLBAR_INFO *SCROLL_GetInternalInfo( HWND hwnd, INT nBar, BOOL alloc )
if (wndPtr->pScroll) infoPtr = &((LPWINSCROLLBAR_INFO)wndPtr->pScroll)->vert; if (wndPtr->pScroll) infoPtr = &((LPWINSCROLLBAR_INFO)wndPtr->pScroll)->vert;
break; break;
case SB_CTL: case SB_CTL:
if (get_class_winproc( wndPtr->class ) == BUILTIN_WINPROC( WINPROC_SCROLLBAR )) if (wndPtr->cbWndExtra >= sizeof(SCROLLBAR_WNDDATA))
infoPtr = (SCROLLBAR_INFO *)wndPtr->wExtra; {
SCROLLBAR_WNDDATA *data = (SCROLLBAR_WNDDATA*)wndPtr->wExtra;
if (data->magic == SCROLLBAR_MAGIC)
infoPtr = &data->info;
}
if (!infoPtr) WARN("window is not a scrollbar control\n");
break; break;
case SB_BOTH: case SB_BOTH:
WARN("with SB_BOTH\n"); WARN("with SB_BOTH\n");
@ -1131,18 +1144,28 @@ void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt )
*/ */
static void SCROLL_CreateScrollBar(HWND hwnd, LPCREATESTRUCTW lpCreate) static void SCROLL_CreateScrollBar(HWND hwnd, LPCREATESTRUCTW lpCreate)
{ {
LPSCROLLBAR_INFO info = SCROLL_GetInternalInfo(hwnd, SB_CTL, TRUE); LPSCROLLBAR_INFO info = NULL;
if (!info) return; WND *win;
TRACE("hwnd=%p lpCreate=%p\n", hwnd, lpCreate); 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) if (lpCreate->style & WS_DISABLED)
{ {
info->flags = ESB_DISABLE_BOTH; info->flags = ESB_DISABLE_BOTH;
TRACE("Created WS_DISABLED scrollbar\n"); TRACE("Created WS_DISABLED scrollbar\n");
} }
if (lpCreate->style & (SBS_SIZEGRIP | SBS_SIZEBOX)) if (lpCreate->style & (SBS_SIZEGRIP | SBS_SIZEBOX))
{ {
if (lpCreate->style & SBS_SIZEBOXTOPLEFTALIGN) if (lpCreate->style & SBS_SIZEBOXTOPLEFTALIGN)

View File

@ -640,7 +640,6 @@ static void test_subclass(void)
memset(&scroll_info, 0xcc, sizeof(scroll_info)); memset(&scroll_info, 0xcc, sizeof(scroll_info));
scroll_info.cbSize = sizeof(scroll_info); scroll_info.cbSize = sizeof(scroll_info);
res = SendMessageA(hwnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)&scroll_info); res = SendMessageA(hwnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)&scroll_info);
todo_wine
ok(res == 1, "SBM_GETSCROLLBARINFO returned %lu\n", res); ok(res == 1, "SBM_GETSCROLLBARINFO returned %lu\n", res);
DestroyWindow(hwnd); DestroyWindow(hwnd);