/////////////////////////////////////////////////////////////////////////////
-// Name: msw/slider.cpp
+// Name: src/msw/slider.cpp
// Purpose: wxSlider, using the Win95 (and later) trackbar control
// Author: Julian Smart
// Modified by:
// declarations
// ============================================================================
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "slider95.h"
-#endif
-
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#if wxUSE_SLIDER
+#include "wx/slider.h"
+
#ifndef WX_PRECOMP
+ #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
#include "wx/brush.h"
#endif
-#include "wx/slider.h"
#include "wx/msw/subwin.h"
-#if !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__))
- #include <commctrl.h>
-#endif
-
-#define USE_DEFERRED_SIZING 1
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
wxEND_FLAGS( wxSliderStyle )
-IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider, wxControl,"wx/scrolbar.h")
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider, wxControl,"wx/slider.h")
wxBEGIN_PROPERTIES_TABLE(wxSlider)
- wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_ENDSCROLL , wxScrollEvent )
+ wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_CHANGED , wxScrollEvent )
wxEVENT_PROPERTY( Updated , wxEVT_COMMAND_SLIDER_UPDATED , wxCommandEvent )
wxPROPERTY( Value , int , SetValue, GetValue , 0, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
m_rangeMax = 0;
m_rangeMin = 0;
m_tickFreq = 0;
+
+ m_isDragging = false;
}
bool
}
};
- wxASSERT_MSG( !(style & wxSL_VERTICAL) | !(style & wxSL_HORIZONTAL),
+ wxASSERT_MSG( !(style & wxSL_VERTICAL) || !(style & wxSL_HORIZONTAL),
_T("incompatible slider direction and orientation") );
HWND hwndParent = GetHwndOf(parent);
for ( size_t n = 0; n < SliderLabel_Last; n++ )
{
- (*m_labels)[n] = ::CreateWindow
- (
- wxT("STATIC"),
- NULL,
- WS_CHILD | WS_VISIBLE | SS_CENTER,
- 0, 0, 0, 0,
- hwndParent,
- (HMENU)NewControlId(),
- wxGetInstance(),
- NULL
- );
+ wxWindowIDRef lblid = NewControlId();
+
+ HWND wnd = ::CreateWindow
+ (
+ wxT("STATIC"),
+ NULL,
+ WS_CHILD | WS_VISIBLE | SS_CENTER,
+ 0, 0, 0, 0,
+ hwndParent,
+ (HMENU)lblid.GetValue(),
+ wxGetInstance(),
+ NULL
+ );
+
+ m_labels->Set(n, wnd, lblid);
}
m_labels->SetFont(GetFont());
case SB_THUMBTRACK:
scrollEvent = wxEVT_SCROLL_THUMBTRACK;
+ m_isDragging = true;
break;
case SB_THUMBPOSITION:
- scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
+ if ( m_isDragging )
+ {
+ scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
+ m_isDragging = false;
+ }
+ else
+ {
+ // this seems to only happen when the mouse wheel is used: in
+ // this case, as it might be unexpected to get THUMBRELEASE
+ // without preceding THUMBTRACKs, we don't generate it at all
+ // but generate CHANGED event because the control itself does
+ // not send us SB_ENDSCROLL for whatever reason when mouse
+ // wheel is used
+ scrollEvent = wxEVT_SCROLL_CHANGED;
+ }
break;
case SB_ENDSCROLL:
- scrollEvent = wxEVT_SCROLL_ENDSCROLL;
+ scrollEvent = wxEVT_SCROLL_CHANGED;
break;
default:
wxScrollEvent event(scrollEvent, m_windowId);
event.SetPosition(newPos);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
+ HandleWindowEvent(event);
wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() );
cevent.SetInt( newPos );
cevent.SetEventObject( this );
- return GetEventHandler()->ProcessEvent( cevent );
+ return HandleWindowEvent( cevent );
}
void wxSlider::Command (wxCommandEvent & event)
return;
}
- // if our parent had prepared a defer window handle for us, use it (unless
- // we are a top level window)
- wxWindowMSW *parent = GetParent();
-
-#if USE_DEFERRED_SIZING
- HDWP hdwp = parent && !IsTopLevel() ? (HDWP)parent->m_hDWP : NULL;
-#else
- HDWP hdwp = 0;
-#endif
-
// be careful to position the slider itself after moving the labels as
// otherwise our GetBoundingBox(), which is called from WM_SIZE handler,
// would return a wrong result and wrong size would be cached internally
// position all labels: min at the top, value in the middle and max at
// the bottom
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Min],
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
xLabel, y, wLabel, hLabel);
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Value],
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
xLabel, y + (height - hLabel)/2, wLabel, hLabel);
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Max],
- xLabel, y + height - hLabel, wLabel, hLabel);
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max],
+ xLabel, y + height - hLabel, wLabel, hLabel);
// position the slider itself along the left/right edge
- wxMoveWindowDeferred(hdwp, this, GetHwnd(),
- HasFlag(wxSL_LEFT) ? x : x + wLabel + HGAP,
- y + hLabel/2,
- width - wLabel - HGAP,
- height - hLabel);
+ wxSliderBase::DoMoveWindow(HasFlag(wxSL_LEFT) ? x : x + wLabel + HGAP,
+ y + hLabel/2,
+ width - wLabel - HGAP,
+ height - hLabel);
}
else // horizontal
{
// position all labels: min on the left, value in the middle and max to
// the right
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Min],
- x, yLabel, wLabel, hLabel);
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
+ x, yLabel, wLabel, hLabel);
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Value],
- x + (width - wLabel)/2, yLabel, wLabel, hLabel);
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
+ x + (width - wLabel)/2, yLabel, wLabel, hLabel);
- wxMoveWindowDeferred(hdwp, this, (*m_labels)[SliderLabel_Max],
- x + width - wLabel, yLabel, wLabel, hLabel);
+ DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max],
+ x + width - wLabel, yLabel, wLabel, hLabel);
// position the slider itself along the top/bottom edge
- wxMoveWindowDeferred(hdwp, this, GetHwnd(),
- x,
- HasFlag(wxSL_TOP) ? y : y + hLabel,
- width,
- height - hLabel);
+ wxSliderBase::DoMoveWindow(x,
+ HasFlag(wxSL_TOP) ? y : y + hLabel,
+ width,
+ height - hLabel);
}
-
-#if USE_DEFERRED_SIZING
- if ( parent )
- {
- // hdwp must be updated as it may have been changed
- parent->m_hDWP = (WXHANDLE)hdwp;
- }
-#endif
}
wxSize wxSlider::DoGetBestSize() const
if ( m_labels )
{
- ::SetWindowText((*m_labels)[SliderLabel_Value], Format(value));
+ ::SetWindowText((*m_labels)[SliderLabel_Value], Format(value).wx_str());
}
}
if ( m_labels )
{
- ::SetWindowText((*m_labels)[SliderLabel_Min], Format(ValueInvertOrNot(m_rangeMin)));
- ::SetWindowText((*m_labels)[SliderLabel_Max], Format(ValueInvertOrNot(m_rangeMax)));
+ ::SetWindowText((*m_labels)[SliderLabel_Min],
+ Format(ValueInvertOrNot(m_rangeMin)).wx_str());
+ ::SetWindowText((*m_labels)[SliderLabel_Max],
+ Format(ValueInvertOrNot(m_rangeMax)).wx_str());
}
}
int wxSlider::GetSelEnd() const
{
- return (int)::SendMessage(GetHwnd(), TBM_SETSELEND, 0, 0);
+ return (int)::SendMessage(GetHwnd(), TBM_GETSELEND, 0, 0);
}
int wxSlider::GetSelStart() const