X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9eddec696f06d65a80e7339b2fae14fcb55f8383..17d98558b35b75e3cad68d96841b4fa5a0c7e6ee:/src/msw/scrolbar.cpp diff --git a/src/msw/scrolbar.cpp b/src/msw/scrolbar.cpp index ea7ab3a869..f45e294396 100644 --- a/src/msw/scrolbar.cpp +++ b/src/msw/scrolbar.cpp @@ -18,12 +18,13 @@ #if wxUSE_SCROLLBAR +#include "wx/scrolbar.h" + #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/settings.h" #endif -#include "wx/scrolbar.h" #include "wx/msw/private.h" #if wxUSE_EXTENDED_RTTI @@ -105,46 +106,20 @@ wxScrollBar::~wxScrollBar(void) } bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, - WXWORD pos, WXHWND WXUNUSED(control)) + WXWORD WXUNUSED(pos), WXHWND WXUNUSED(control)) { - // current and max positions - int position, - maxPos, trackPos = pos; + // don't use pos parameter because it is limited to 16 bits, get the full + // 32 bit position from the control itself instead + WinStruct scrollInfo; + scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_TRACKPOS; - wxUnusedVar(trackPos); - - // when we're dragging the scrollbar we can't use pos parameter because it - // is limited to 16 bits - // JACS: now always using GetScrollInfo, since there's no reason - // not to -// if ( wParam == SB_THUMBPOSITION || wParam == SB_THUMBTRACK ) - { - SCROLLINFO scrollInfo; - wxZeroMemory(scrollInfo); - scrollInfo.cbSize = sizeof(SCROLLINFO); - - // also get the range if we call GetScrollInfo() anyhow -- this is less - // expensive than call it once here and then call GetScrollRange() - // below - scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_TRACKPOS; - - if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) ) - { - wxLogLastError(_T("GetScrollInfo")); - } - - trackPos = scrollInfo.nTrackPos; - position = scrollInfo.nPos; - maxPos = scrollInfo.nMax; - } -#if 0 - else + if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) ) { - position = ::GetScrollPos((HWND) control, SB_CTL); - int minPos; - ::GetScrollRange((HWND) control, SB_CTL, &minPos, &maxPos); + wxLogLastError(wxT("GetScrollInfo")); + return false; } -#endif + + int maxPos = scrollInfo.nMax; // A page size greater than one has the effect of reducing the effective // range, therefore the range has already been boosted artificially - so @@ -152,64 +127,54 @@ bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, if ( m_pageSize > 1 ) maxPos -= (m_pageSize - 1); + int position = scrollInfo.nPos; wxEventType scrollEvent = wxEVT_NULL; - - int nScrollInc; switch ( wParam ) { case SB_TOP: - nScrollInc = maxPos - position; + position = 0; scrollEvent = wxEVT_SCROLL_TOP; break; case SB_BOTTOM: - nScrollInc = -position; + position = maxPos; scrollEvent = wxEVT_SCROLL_BOTTOM; break; case SB_LINEUP: - nScrollInc = -1; + position--; scrollEvent = wxEVT_SCROLL_LINEUP; break; case SB_LINEDOWN: - nScrollInc = 1; + position++; scrollEvent = wxEVT_SCROLL_LINEDOWN; break; case SB_PAGEUP: - nScrollInc = -GetPageSize(); + position -= GetPageSize(); scrollEvent = wxEVT_SCROLL_PAGEUP; break; case SB_PAGEDOWN: - nScrollInc = GetPageSize(); + position += GetPageSize(); scrollEvent = wxEVT_SCROLL_PAGEDOWN; break; case SB_THUMBPOSITION: - nScrollInc = trackPos - position; - scrollEvent = wxEVT_SCROLL_THUMBRELEASE; - break; - case SB_THUMBTRACK: - nScrollInc = trackPos - position; - scrollEvent = wxEVT_SCROLL_THUMBTRACK; + position = scrollInfo.nTrackPos; + scrollEvent = wParam == SB_THUMBPOSITION ? wxEVT_SCROLL_THUMBRELEASE + : wxEVT_SCROLL_THUMBTRACK; break; case SB_ENDSCROLL: - nScrollInc = 0; scrollEvent = wxEVT_SCROLL_CHANGED; break; - - default: - nScrollInc = 0; } - if ( nScrollInc ) + if ( position != scrollInfo.nPos ) { - position += nScrollInc; - if ( position < 0 ) position = 0; if ( position > maxPos ) @@ -230,7 +195,7 @@ bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, event.SetPosition(position); event.SetEventObject( this ); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } void wxScrollBar::SetThumbPosition(int viewStart) @@ -254,10 +219,9 @@ int wxScrollBar::GetThumbPosition(void) const if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) ) { - wxLogLastError(_T("GetScrollInfo")); + wxLogLastError(wxT("GetScrollInfo")); } return scrollInfo.nPos; -// return ::GetScrollPos((HWND)m_hWnd, SB_CTL); } void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,