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:
parent
a090314c72
commit
8c8701befb
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue