mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[0.4.7][COMCTL32][WIN32SS] Fix multiple scrollbar redraw issues
This fixes: - CORE-15911 "Scrollbars do not disappear when Maximizing and not needed" - CORE-10617 "ListView corrupt scrollbar upon resizing the column-header" and fixes regressions: - CORE-15429 "Uninitialized scrollbars in 'My Computer' permanently drawn" - CORE-16466 "Uninitialized scrollbars in 'My Computer' do still flash up for a fraction of a second before getting overpainted" both unhidden by SVN r75735 == git 0.4.7-dev-168-g6af37fd54e
by porting back the commits: 0.4.14-dev-312-gb931f643e3
0.4.13-dev-535-g1158c24194
This commit is contained in:
parent
8a3873f2e2
commit
dd898b990b
2 changed files with 32 additions and 4 deletions
|
@ -1001,7 +1001,7 @@ static BOOL notify_dispinfoT(const LISTVIEW_INFO *infoPtr, UINT code, LPNMLVDISP
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* if dipsinfo holder changed notification code then convert */
|
||||
/* if dispinfo holder changed notification code then convert */
|
||||
if (!isW && (pdi->hdr.code == LVN_GETDISPINFOW) && (pdi->item.mask & LVIF_TEXT))
|
||||
{
|
||||
length = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL, NULL);
|
||||
|
@ -2066,6 +2066,9 @@ static INT LISTVIEW_UpdateHScroll(LISTVIEW_INFO *infoPtr)
|
|||
|
||||
horzInfo.fMask = SIF_RANGE | SIF_PAGE;
|
||||
horzInfo.nMax = max(horzInfo.nMax - 1, 0);
|
||||
#ifdef __REACTOS__ /* CORE-16466 part 1 of 4 */
|
||||
horzInfo.nMax = (horzInfo.nPage == 0 ? 0 : horzInfo.nMax);
|
||||
#endif
|
||||
dx = GetScrollPos(infoPtr->hwndSelf, SB_HORZ);
|
||||
dx -= SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo, TRUE);
|
||||
TRACE("horzInfo=%s\n", debugscrollinfo(&horzInfo));
|
||||
|
@ -2089,10 +2092,27 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
|
|||
|
||||
ZeroMemory(&vertInfo, sizeof(SCROLLINFO));
|
||||
vertInfo.cbSize = sizeof(SCROLLINFO);
|
||||
#ifdef __REACTOS__ /* CORE-16466 part 2 of 4 */
|
||||
vertInfo.nPage = max((infoPtr->rcList.bottom - infoPtr->rcList.top), 0);
|
||||
#else
|
||||
vertInfo.nPage = infoPtr->rcList.bottom - infoPtr->rcList.top;
|
||||
#endif
|
||||
|
||||
if (infoPtr->uView == LV_VIEW_DETAILS)
|
||||
{
|
||||
#ifdef __REACTOS__ /* CORE-16466 part 3 of 4 */
|
||||
if (vertInfo.nPage != 0)
|
||||
{
|
||||
vertInfo.nMax = infoPtr->nItemCount;
|
||||
|
||||
/* scroll by at least one page */
|
||||
if (vertInfo.nPage < infoPtr->nItemHeight)
|
||||
vertInfo.nPage = infoPtr->nItemHeight;
|
||||
|
||||
if (infoPtr->nItemHeight > 0)
|
||||
vertInfo.nPage /= infoPtr->nItemHeight;
|
||||
}
|
||||
#else
|
||||
vertInfo.nMax = infoPtr->nItemCount;
|
||||
|
||||
/* scroll by at least one page */
|
||||
|
@ -2101,6 +2121,7 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
|
|||
|
||||
if (infoPtr->nItemHeight > 0)
|
||||
vertInfo.nPage /= infoPtr->nItemHeight;
|
||||
#endif
|
||||
}
|
||||
else if (infoPtr->uView != LV_VIEW_LIST) /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */
|
||||
{
|
||||
|
@ -2111,6 +2132,9 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
|
|||
|
||||
vertInfo.fMask = SIF_RANGE | SIF_PAGE;
|
||||
vertInfo.nMax = max(vertInfo.nMax - 1, 0);
|
||||
#ifdef __REACTOS__ /* CORE-16466 part 4 of 4 */
|
||||
vertInfo.nMax = (vertInfo.nPage == 0 ? 0 : vertInfo.nMax);
|
||||
#endif
|
||||
dy = GetScrollPos(infoPtr->hwndSelf, SB_VERT);
|
||||
dy -= SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &vertInfo, TRUE);
|
||||
TRACE("vertInfo=%s\n", debugscrollinfo(&vertInfo));
|
||||
|
|
|
@ -1780,7 +1780,7 @@ co_WinPosSetWindowPos(
|
|||
}
|
||||
|
||||
/* Calculate the non client area for resizes, as this is used in the copy region */
|
||||
if (!(WinPos.flags & SWP_NOSIZE))
|
||||
if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
|
||||
{
|
||||
VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
|
||||
(Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
|
||||
|
@ -1918,12 +1918,16 @@ co_WinPosSetWindowPos(
|
|||
*/
|
||||
|
||||
CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
|
||||
if (WinPos.flags & SWP_NOSIZE)
|
||||
if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
|
||||
RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
|
||||
else if (VisBeforeJustClient != NULL)
|
||||
{
|
||||
RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
|
||||
REGION_Delete(VisBeforeJustClient);
|
||||
}
|
||||
|
||||
if (VisBeforeJustClient != NULL)
|
||||
{
|
||||
REGION_Delete(VisBeforeJustClient);
|
||||
}
|
||||
|
||||
/* Now use in copying bits which are in the update region. */
|
||||
|
|
Loading…
Reference in a new issue