diff --git a/include/wx/vscroll.h b/include/wx/vscroll.h index 73d3815d13..8ba386cc2f 100644 --- a/include/wx/vscroll.h +++ b/include/wx/vscroll.h @@ -146,8 +146,8 @@ protected: void OnScroll(wxScrollWinEvent& event); // find the index of the line we need to show at the top of the window such - // that the last line shown is the given one - size_t FindFirstFromBottom(size_t lineLast); + // that the last (fully or partially) visible line is the given one + size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false); // get the total height of the lines between lineMin (inclusive) and // lineMax (exclusive) diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp index 5d2ccf0cb6..4a9cc64d7c 100644 --- a/src/generic/vscroll.cpp +++ b/src/generic/vscroll.cpp @@ -74,7 +74,7 @@ wxCoord wxVScrolledWindow::GetLinesHeight(size_t lineMin, size_t lineMax) const return height; } -size_t wxVScrolledWindow::FindFirstFromBottom(size_t lineLast) +size_t wxVScrolledWindow::FindFirstFromBottom(size_t lineLast, bool full) { const wxCoord hWindow = GetClientSize().y; @@ -88,7 +88,13 @@ size_t wxVScrolledWindow::FindFirstFromBottom(size_t lineLast) if ( h > hWindow ) { - lineFirst++; + // for this line to be fully visible we need to go one line + // down, but if it is enough for it to be only partly visible then + // this line will do as well + if ( full ) + { + lineFirst++; + } break; } @@ -230,7 +236,7 @@ bool wxVScrolledWindow::ScrollToLine(size_t line) // determine the real first line to scroll to: we shouldn't scroll beyond // the end - size_t lineFirstLast = FindFirstFromBottom(m_lineMax - 1); + size_t lineFirstLast = FindFirstFromBottom(m_lineMax - 1, true); if ( line > lineFirstLast ) line = lineFirstLast;