X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7798a18ec81d3733082bc60a958fac1d4510faca..8e0e4b1b644fd58825f7c4c80775d9507020ffac:/src/msw/scrolbar.cpp diff --git a/src/msw/scrolbar.cpp b/src/msw/scrolbar.cpp index 3514ea2245..de8ae01ae0 100644 --- a/src/msw/scrolbar.cpp +++ b/src/msw/scrolbar.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -28,24 +28,19 @@ #include "wx/scrolbar.h" #include "wx/msw/private.h" -// extern wxList wxScrollBarList; -extern void wxFindMaxSize(HWND hwnd, RECT *rect); - -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl) -#if WXWIN_COMPATIBILITY BEGIN_EVENT_TABLE(wxScrollBar, wxControl) +#if WXWIN_COMPATIBILITY EVT_SCROLL(wxScrollBar::OnScroll) -END_EVENT_TABLE() #endif +END_EVENT_TABLE() -#endif // Scrollbar -bool wxScrollBar::Create(wxWindow *parent, const wxWindowID id, +bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, const long style, + const wxSize& size, long style, const wxValidator& validator, const wxString& name) { @@ -53,16 +48,18 @@ bool wxScrollBar::Create(wxWindow *parent, const wxWindowID id, return FALSE; parent->AddChild(this); SetName(name); - SetValidator(validator); - - SetBackgroundColour(parent->GetDefaultBackgroundColour()) ; - SetForegroundColour(parent->GetDefaultForegroundColour()) ; +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + SetBackgroundColour(parent->GetBackgroundColour()) ; + SetForegroundColour(parent->GetForegroundColour()) ; m_windowStyle = style; if ( id == -1 ) - m_windowId = (int)NewControlId(); + m_windowId = (int)NewControlId(); else - m_windowId = id; + m_windowId = id; int x = pos.x; int y = pos.y; @@ -84,11 +81,16 @@ bool wxScrollBar::Create(wxWindow *parent, const wxWindowID id, height = 14; } + DWORD wstyle = WS_VISIBLE | WS_CHILD; + + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + // Now create scrollbar DWORD _direction = (style & wxHORIZONTAL) ? SBS_HORZ: SBS_VERT; - HWND scroll_bar = CreateWindowEx(MakeExtendedStyle(style), "SCROLLBAR", "scrollbar", - _direction | WS_CHILD | WS_VISIBLE, + HWND scroll_bar = CreateWindowEx(MakeExtendedStyle(style), wxT("SCROLLBAR"), wxT("scrollbar"), + _direction | wstyle, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL); @@ -116,87 +118,93 @@ wxScrollBar::~wxScrollBar(void) { } -void wxScrollBar::MSWOnVScroll(const WXWORD wParam, const WXWORD pos, const WXHWND control) +bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, + WXWORD pos, WXHWND control) { int position = ::GetScrollPos((HWND) control, SB_CTL); int minPos, maxPos; ::GetScrollRange((HWND) control, SB_CTL, &minPos, &maxPos); + #if defined(__WIN95__) - // A page size greater than one has the effect of reducing the - // effective range, therefore the range has already been - // boosted artificially - so reduce it again. - if ( m_pageSize > 1 ) - maxPos -= (m_pageSize - 1); -#endif + // A page size greater than one has the effect of reducing the effective + // range, therefore the range has already been boosted artificially - so + // reduce it again. + if ( m_pageSize > 1 ) + maxPos -= (m_pageSize - 1); +#endif // __WIN95__ wxEventType scrollEvent = wxEVT_NULL; int nScrollInc; switch ( wParam ) { - case SB_TOP: - nScrollInc = maxPos - position; - scrollEvent = wxEVT_SCROLL_TOP; - break; - - case SB_BOTTOM: - nScrollInc = - position; - scrollEvent = wxEVT_SCROLL_BOTTOM; - break; - - case SB_LINEUP: - nScrollInc = -1; - scrollEvent = wxEVT_SCROLL_LINEUP; - break; - - case SB_LINEDOWN: - nScrollInc = 1; - scrollEvent = wxEVT_SCROLL_LINEDOWN; - break; - - case SB_PAGEUP: - nScrollInc = -GetPageSize(); - scrollEvent = wxEVT_SCROLL_PAGEUP; - break; - - case SB_PAGEDOWN: - nScrollInc = GetPageSize(); - scrollEvent = wxEVT_SCROLL_PAGEDOWN; - break; - - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - nScrollInc = pos - position; - scrollEvent = wxEVT_SCROLL_THUMBTRACK; - break; - - default: - nScrollInc = 0; + case SB_TOP: + nScrollInc = maxPos - position; + scrollEvent = wxEVT_SCROLL_TOP; + break; + + case SB_BOTTOM: + nScrollInc = - position; + scrollEvent = wxEVT_SCROLL_BOTTOM; + break; + + case SB_LINEUP: + nScrollInc = -1; + scrollEvent = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + nScrollInc = 1; + scrollEvent = wxEVT_SCROLL_LINEDOWN; + break; + + case SB_PAGEUP: + nScrollInc = -GetPageSize(); + scrollEvent = wxEVT_SCROLL_PAGEUP; + break; + + case SB_PAGEDOWN: + nScrollInc = GetPageSize(); + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + break; + + case SB_THUMBPOSITION: + nScrollInc = pos - position; + scrollEvent = wxEVT_SCROLL_THUMBRELEASE; + break; + + case SB_THUMBTRACK: + nScrollInc = pos - position; + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + break; + + default: + nScrollInc = 0; } - if (nScrollInc != 0) + // don't process the event if there is no displacement, + // unless this is a thumb release event. + if (( nScrollInc == 0 ) && ( scrollEvent != wxEVT_SCROLL_THUMBRELEASE )) { - int new_pos = position + nScrollInc; - - if (new_pos < 0) - new_pos = 0; - if (new_pos > maxPos) - new_pos = maxPos; - - SetValue(new_pos); - wxScrollEvent event(scrollEvent, m_windowId); - event.SetPosition(new_pos); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); + return FALSE; } -} -void wxScrollBar::MSWOnHScroll(const WXWORD wParam, const WXWORD pos, const WXHWND control) -{ - MSWOnVScroll(wParam, pos, control); + int new_pos = position + nScrollInc; + + if (new_pos < 0) + new_pos = 0; + if (new_pos > maxPos) + new_pos = maxPos; + + SetThumbPosition(new_pos); + wxScrollEvent event(scrollEvent, m_windowId); + event.SetPosition(new_pos); + event.SetEventObject( this ); + + return GetEventHandler()->ProcessEvent(event); } -void wxScrollBar::SetPosition(const int viewStart) +void wxScrollBar::SetThumbPosition(int viewStart) { #if defined(__WIN95__) SCROLLINFO info; @@ -212,13 +220,13 @@ void wxScrollBar::SetPosition(const int viewStart) #endif } -int wxScrollBar::GetPosition(void) const +int wxScrollBar::GetThumbPosition(void) const { return ::GetScrollPos((HWND)m_hWnd, SB_CTL); } -void wxScrollBar::SetScrollbar(const int position, const int thumbSize, const int range, const int pageSize, - const bool refresh) +void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize, + bool refresh) { m_viewSize = pageSize; m_pageSize = thumbSize; @@ -233,7 +241,7 @@ void wxScrollBar::SetScrollbar(const int position, const int thumbSize, const in // (see comment for SetPageLength) if ( m_pageSize > 1 ) { - range1 += (m_pageSize - 1); + range1 += (m_pageSize - 1); } SCROLLINFO info; @@ -259,12 +267,12 @@ In version 4.0 or later, the maximum value that a scroll bar can report If the scroll bar has a page size greater than one, the maximum scrolling position is less than the maximum range value. You can use the following formula to calculate the maximum scrolling position: - -MaxScrollPos = MaxRangeValue - (PageSize - 1) + +MaxScrollPos = MaxRangeValue - (PageSize - 1) */ #if WXWIN_COMPATIBILITY -void wxScrollBar::SetPageSize(const int pageLength) +void wxScrollBar::SetPageSize(int pageLength) { m_pageSize = pageLength; @@ -278,7 +286,7 @@ void wxScrollBar::SetPageSize(const int pageLength) #endif } -void wxScrollBar::SetObjectLength(const int objectLength) +void wxScrollBar::SetObjectLength(int objectLength) { m_objectSize = objectLength; @@ -291,7 +299,7 @@ void wxScrollBar::SetObjectLength(const int objectLength) // (see comment for SetPageLength) if ( m_pageSize > 1 ) { - range += (m_pageSize - 1); + range += (m_pageSize - 1); } SCROLLINFO info; @@ -308,7 +316,7 @@ void wxScrollBar::SetObjectLength(const int objectLength) #endif } -void wxScrollBar::SetViewLength(const int viewLength) +void wxScrollBar::SetViewLength(int viewLength) { m_viewSize = viewLength; } @@ -323,15 +331,15 @@ void wxScrollBar::GetValues(int *viewStart, int *viewLength, int *objectLength, } #endif -WXHBRUSH wxScrollBar::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +WXHBRUSH wxScrollBar::OnCtlColor(WXHDC WXUNUSED(pDC), WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor), + WXUINT WXUNUSED(message), WXWPARAM WXUNUSED(wParam), WXLPARAM WXUNUSED(lParam)) { return 0; } void wxScrollBar::Command(wxCommandEvent& event) { - SetValue(event.m_commandInt); + SetThumbPosition(event.m_commandInt); ProcessCommand(event); }