richedit: Fixed scrollbar visiblility calculation after SetScrollInfo. (Bug 17507)

Dylan Smith dylan.ah.smith at gmail.com
Tue Feb 24 01:38:49 CST 2009


The scrollbar visibility can be changed from SetScrollRange or
SetScrollInfo, but the visiblity that is a result of these calls are not
consistent with the calculation made by richedit controls to decide
whether to show or hide the scrollbars.

The common inconsistency is when the height of the text is equal to the
height of the control.  In this case SetScrollRange will show the
scrollbar, but native richedit controls seem to hide this scrollbars in
this case.
---
 dlls/riched20/paint.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)
-------------- next part --------------
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 35ca097..a79cad1 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -1110,6 +1110,18 @@ void ME_ScrollRight(ME_TextEditor *editor, int cx)
   ME_HScrollAbs(editor, editor->horz_si.nPos + cx);
 }
 
+/* Calculates the visiblity after a call to SetScrollRange or
+ * SetScrollInfo with SIF_RANGE. */
+static BOOL ME_PostSetScrollRangeVisibility(SCROLLINFO *si)
+{
+  if (si->fMask & SIF_DISABLENOSCROLL)
+    return TRUE;
+
+  /* This must match the check in SetScrollInfo to determine whether
+   * to show or hide the scrollbars. */
+  return si->nMin < si->nMax - max(si->nPage - 1, 0);
+}
+
 void ME_UpdateScrollBar(ME_TextEditor *editor)
 {
   /* Note that this is the only function that should ever call
@@ -1157,15 +1169,14 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
         ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, si.nMin, si.nMax, FALSE);
         ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, si.nPos, TRUE);
       }
+      /* SetScrollInfo or SetScrollRange change scrollbar visibility. */
+      bScrollBarWasVisible = ME_PostSetScrollRangeVisibility(&si);
     }
   }
 
   if (si.fMask & SIF_DISABLENOSCROLL) {
     bScrollBarWillBeVisible = TRUE;
   } else if (!(editor->styleFlags & WS_HSCROLL)) {
-    /* SetScrollInfo or SetScrollRange may cause the scrollbar to be
-     * shown, so hide the scrollbar if necessary. */
-    bScrollBarWasVisible = bScrollBarWillBeVisible;
     bScrollBarWillBeVisible = FALSE;
   }
 
@@ -1203,15 +1214,14 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
         ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, si.nMin, si.nMax, FALSE);
         ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, si.nPos, TRUE);
       }
+      /* SetScrollInfo or SetScrollRange change scrollbar visibility. */
+      bScrollBarWasVisible = ME_PostSetScrollRangeVisibility(&si);
     }
   }
 
   if (si.fMask & SIF_DISABLENOSCROLL) {
     bScrollBarWillBeVisible = TRUE;
   } else if (!(editor->styleFlags & WS_VSCROLL)) {
-    /* SetScrollInfo or SetScrollRange may cause the scrollbar to be
-     * shown, so hide the scrollbar if necessary. */
-    bScrollBarWasVisible = bScrollBarWillBeVisible;
     bScrollBarWillBeVisible = FALSE;
   }
 


More information about the wine-patches mailing list