uxtheme: Draw scroll bar parent background only when theme parts are transparent.

Fix hangs in Source Insight 4 Options->Window->Styles.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2021-08-25 14:24:42 +08:00 committed by Alexandre Julliard
parent 96b7a8a317
commit 2fd0e56a9f
1 changed files with 24 additions and 3 deletions

View File

@ -100,9 +100,6 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
thumbstate = SCRBS_PRESSED;
}
if (bar == SB_CTL)
DrawThemeParentBackground(hwnd, dc, NULL);
if (vertical) {
int uparrowstate, downarrowstate;
@ -132,16 +129,22 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
partrect = *rect;
partrect.bottom = partrect.top + arrowsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_ARROWBTN, uparrowstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_ARROWBTN, uparrowstate, &partrect, NULL);
partrect.bottom = rect->bottom;
partrect.top = partrect.bottom - arrowsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_ARROWBTN, downarrowstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_ARROWBTN, downarrowstate, &partrect, NULL);
if (thumbpos > 0) {
partrect.top = rect->top + arrowsize;
partrect.bottom = rect->top + thumbpos;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_UPPERTRACKVERT, uppertrackstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_UPPERTRACKVERT, uppertrackstate, &partrect, NULL);
}
@ -149,6 +152,8 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
partrect.top = rect->top + thumbpos;
partrect.bottom = partrect.top + thumbsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_THUMBBTNVERT, thumbstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_THUMBBTNVERT, thumbstate, &partrect, NULL);
if (SUCCEEDED(GetThemePartSize(theme, dc, SBP_GRIPPERVERT, thumbstate, NULL, TS_DRAW, &grippersize))) {
@ -167,7 +172,11 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
else
partrect.top = rect->top + arrowsize;
if (partrect.bottom > partrect.top)
{
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_LOWERTRACKVERT, lowertrackstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_LOWERTRACKVERT, lowertrackstate, &partrect, NULL);
}
} else {
int leftarrowstate, rightarrowstate;
@ -197,16 +206,22 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
partrect = *rect;
partrect.right = partrect.left + arrowsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_ARROWBTN, leftarrowstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_ARROWBTN, leftarrowstate, &partrect, NULL);
partrect.right = rect->right;
partrect.left = partrect.right - arrowsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_ARROWBTN, rightarrowstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_ARROWBTN, rightarrowstate, &partrect, NULL);
if (thumbpos > 0) {
partrect.left = rect->left + arrowsize;
partrect.right = rect->left + thumbpos;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_UPPERTRACKHORZ, uppertrackstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_UPPERTRACKHORZ, uppertrackstate, &partrect, NULL);
}
@ -214,6 +229,8 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
partrect.left = rect->left + thumbpos;
partrect.right = partrect.left + thumbsize;
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_THUMBBTNHORZ, thumbstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_THUMBBTNHORZ, thumbstate, &partrect, NULL);
if (SUCCEEDED(GetThemePartSize(theme, dc, SBP_GRIPPERHORZ, thumbstate, NULL, TS_DRAW, &grippersize))) {
@ -232,7 +249,11 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
else
partrect.left = rect->left + arrowsize;
if (partrect.right > partrect.left)
{
if (bar == SB_CTL && IsThemeBackgroundPartiallyTransparent(theme, SBP_LOWERTRACKHORZ, lowertrackstate))
DrawThemeParentBackground(hwnd, dc, &partrect);
DrawThemeBackground(theme, dc, SBP_LOWERTRACKHORZ, lowertrackstate, &partrect, NULL);
}
}
}