X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da87a1ca42a81c7b7b69cb013eb52d09cd5c1b70..a2b0fa12c9cb341acce346c0e7794e099363cd01:/src/msw/slidrmsw.cpp diff --git a/src/msw/slidrmsw.cpp b/src/msw/slidrmsw.cpp index aa01a17495..2ec3e8536e 100644 --- a/src/msw/slidrmsw.cpp +++ b/src/msw/slidrmsw.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__ @@ -24,22 +24,17 @@ #include #endif +#include "wx/utils.h" +#include "wx/brush.h" #include "wx/msw/slidrmsw.h" #include "wx/msw/private.h" #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxSliderMSW, wxControl) - -#if WXWIN_COMPATIBILITY -BEGIN_EVENT_TABLE(wxSliderMSW, wxControl) - EVT_SCROLL(wxSliderMSW::OnScroll) -END_EVENT_TABLE() -#endif - #endif // Slider -wxSliderMSW::wxSliderMSW(void) +wxSliderMSW::wxSliderMSW() { m_staticValue = 0; m_staticMin = 0; @@ -51,10 +46,10 @@ wxSliderMSW::wxSliderMSW(void) m_tickFreq = 0; } -bool wxSliderMSW::Create(wxWindow *parent, const wxWindowID id, - const int value, const int minValue, const int maxValue, +bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, + int value, int minValue, int maxValue, const wxPoint& pos, - const wxSize& size, const long style, + const wxSize& size, long style, const wxValidator& validator, const wxString& name) { @@ -62,8 +57,8 @@ bool wxSliderMSW::Create(wxWindow *parent, const wxWindowID id, SetValidator(validator); if (parent) parent->AddChild(this); - SetBackgroundColour(parent->GetDefaultBackgroundColour()) ; - SetForegroundColour(parent->GetDefaultForegroundColour()) ; + SetBackgroundColour(parent->GetBackgroundColour()) ; + SetForegroundColour(parent->GetForegroundColour()) ; m_staticValue = 0; m_staticMin = 0; @@ -74,9 +69,9 @@ bool wxSliderMSW::Create(wxWindow *parent, const wxWindowID id, m_tickFreq = 0; 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; @@ -136,22 +131,22 @@ bool wxSliderMSW::Create(wxWindow *parent, const wxWindowID id, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), wxGetInstance(), NULL); - SetFont(* parent->GetFont()); + SetFont(parent->GetFont()); - if (GetFont()) + if (GetFont().Ok()) { // GetFont()->RealizeResource(); - if (GetFont()->GetResourceHandle()) + if (GetFont().GetResourceHandle()) { - if ( m_staticMin ) - SendMessage((HWND)m_staticMin,WM_SETFONT, - (WPARAM)GetFont()->GetResourceHandle(),0L); - if ( m_staticMax ) - SendMessage((HWND)m_staticMax,WM_SETFONT, - (WPARAM)GetFont()->GetResourceHandle(),0L); - if (m_staticValue) - SendMessage((HWND)m_staticValue,WM_SETFONT, - (WPARAM)GetFont()->GetResourceHandle(),0L); + if ( m_staticMin ) + SendMessage((HWND)m_staticMin,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); + if ( m_staticMax ) + SendMessage((HWND)m_staticMax,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); + if (m_staticValue) + SendMessage((HWND)m_staticValue,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); } } @@ -161,7 +156,8 @@ bool wxSliderMSW::Create(wxWindow *parent, const wxWindowID id, return TRUE; } -void wxSliderMSW::MSWOnVScroll(const WXWORD wParam, const WXWORD pos, const WXHWND control) +bool wxSliderMSW::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, + WXWORD pos, WXHWND control) { int position = ::GetScrollPos((HWND)control, SB_CTL); @@ -169,74 +165,78 @@ void wxSliderMSW::MSWOnVScroll(const WXWORD wParam, const WXWORD pos, const WXHW wxEventType scrollEvent = wxEVT_NULL; switch ( wParam ) { - case SB_TOP: - nScrollInc = m_rangeMax - position; - scrollEvent = wxEVT_SCROLL_TOP; - break; - - case SB_BOTTOM: - nScrollInc = - position; - scrollEvent = wxEVT_SCROLL_BOTTOM; - break; - - case SB_LINEUP: - nScrollInc = - GetLineSize(); - scrollEvent = wxEVT_SCROLL_LINEUP; - break; - - case SB_LINEDOWN: - nScrollInc = GetLineSize(); - 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: + case SB_TOP: + nScrollInc = m_rangeMax - position; + scrollEvent = wxEVT_SCROLL_TOP; + break; + + case SB_BOTTOM: + nScrollInc = - position; + scrollEvent = wxEVT_SCROLL_BOTTOM; + break; + + case SB_LINEUP: + nScrollInc = - GetLineSize(); + scrollEvent = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + nScrollInc = GetLineSize(); + 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: #ifdef __WIN32__ - nScrollInc = (signed short)pos - position; + nScrollInc = (signed short)pos - position; #else - nScrollInc = pos - position; + nScrollInc = pos - position; #endif - scrollEvent = wxEVT_SCROLL_THUMBTRACK; - break; + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + break; - default: - nScrollInc = 0; - return; + default: + nScrollInc = 0; } - if (nScrollInc != 0) + if (nScrollInc == 0) { + // no event... + return FALSE; + } - int newPos = position + nScrollInc; - - if (!(newPos < GetMin() || newPos > GetMax())) - { - SetValue(newPos); + int newPos = position + nScrollInc; - wxScrollEvent event(scrollEvent, m_windowId); - event.SetPosition(newPos); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); - } + if ( (newPos < GetMin()) || (newPos > GetMax()) ) + { + // out of range - but we did process it + return TRUE; } -} -void wxSliderMSW::MSWOnHScroll(const WXWORD wParam, const WXWORD pos, const WXHWND control) -{ - MSWOnVScroll(wParam, pos, control); + SetValue(newPos); + + wxScrollEvent event(scrollEvent, m_windowId); + event.SetPosition(newPos); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + + wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() ); + cevent.SetEventObject( this ); + + return GetEventHandler()->ProcessEvent( cevent ); } -wxSliderMSW::~wxSliderMSW(void) +wxSliderMSW::~wxSliderMSW() { if (m_staticMin) DestroyWindow((HWND) m_staticMin); @@ -246,12 +246,12 @@ wxSliderMSW::~wxSliderMSW(void) DestroyWindow((HWND) m_staticValue); } -int wxSliderMSW::GetValue(void) const +int wxSliderMSW::GetValue() const { return ::GetScrollPos((HWND) GetHWND(), SB_CTL); } -void wxSliderMSW::SetValue(const int value) +void wxSliderMSW::SetValue(int value) { ::SetScrollPos((HWND) GetHWND(), SB_CTL, value, TRUE); if (m_staticValue) @@ -302,11 +302,20 @@ void wxSliderMSW::GetPosition(int *x, int *y) const if (parent) ::ScreenToClient((HWND) parent->GetHWND(), &point); + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + if (GetParent()) + { + wxPoint pt(GetParent()->GetClientAreaOrigin()); + point.x -= pt.x; + point.y -= pt.y; + } *x = point.x; *y = point.y; } -void wxSliderMSW::SetSize(const int x, const int y, const int width, const int height, const int sizeFlags) +void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int x1 = x; int y1 = y; @@ -320,6 +329,8 @@ void wxSliderMSW::SetSize(const int x, const int y, const int width, const int h if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) y1 = currentY; + AdjustForParentClientOrigin(x1, y1, sizeFlags); + char buf[300]; int x_offset = x; @@ -327,27 +338,27 @@ void wxSliderMSW::SetSize(const int x, const int y, const int width, const int h int cx; // slider,min,max sizes int cy; - float cyf; + int cyf; - wxGetCharSize(GetHWND(), &cx, &cy,GetFont()); + wxGetCharSize(GetHWND(), &cx, &cy,& this->GetFont()); if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL) { - if ( m_windowStyle & wxSL_LABELS ) - { - float min_len = 0.0; + if ( m_windowStyle & wxSL_LABELS ) + { + int min_len = 0; GetWindowText((HWND) m_staticMin, buf, 300); - GetTextExtent(buf, &min_len, &cyf,NULL,NULL, GetFont()); + GetTextExtent(buf, &min_len, &cyf,NULL,NULL, & this->GetFont()); - float max_len = 0.0; + int max_len = 0; GetWindowText((HWND) m_staticMax, buf, 300); - GetTextExtent(buf, &max_len, &cyf,NULL,NULL, GetFont()); + GetTextExtent(buf, &max_len, &cyf,NULL,NULL, & this->GetFont()); if (m_staticValue) { int new_width = (int)(wxMax(min_len, max_len)); - int valueHeight = (int)cyf; + int valueHeight = (int)cyf; #ifdef __WIN32__ // For some reason, under Win95, the text edit control has // a lot of space before the first character @@ -373,32 +384,32 @@ void wxSliderMSW::SetSize(const int x, const int y, const int width, const int h MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); } - else - { - // No labels - if ( w1 < 0 ) - w1 = 200; - if ( h1 < 0 ) - h1 = 20; - MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, TRUE); - } + else + { + // No labels + if ( w1 < 0 ) + w1 = 200; + if ( h1 < 0 ) + h1 = 20; + MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, TRUE); + } } else { - if ( m_windowStyle & wxSL_LABELS ) - { - float min_len; + if ( m_windowStyle & wxSL_LABELS ) + { + int min_len; GetWindowText((HWND) m_staticMin, buf, 300); - GetTextExtent(buf, &min_len, &cyf,NULL,NULL,GetFont()); + GetTextExtent(buf, &min_len, &cyf,NULL,NULL,& this->GetFont()); - float max_len; + int max_len; GetWindowText((HWND) m_staticMax, buf, 300); - GetTextExtent(buf, &max_len, &cyf,NULL,NULL, GetFont()); + GetTextExtent(buf, &max_len, &cyf,NULL,NULL, & this->GetFont()); if (m_staticValue) { int new_width = (int)(wxMax(min_len, max_len)); - int valueHeight = (int)cyf; + int valueHeight = (int)cyf; /*** Suggested change by George Tasker - remove this block... #ifdef __WIN32__ // For some reason, under Win95, the text edit control has @@ -429,19 +440,19 @@ void wxSliderMSW::SetSize(const int x, const int y, const int width, const int h MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); } - else - { - // No labels - if ( w1 < 0 ) - w1 = 20; - if ( h1 < 0 ) - h1 = 200; - MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, TRUE); - } + else + { + // No labels + if ( w1 < 0 ) + w1 = 20; + if ( h1 < 0 ) + h1 = 200; + MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, TRUE); + } } } -void wxSliderMSW::SetRange(const int minValue, const int maxValue) +void wxSliderMSW::SetRange(int minValue, int maxValue) { m_rangeMin = minValue; m_rangeMax = maxValue; @@ -450,8 +461,8 @@ void wxSliderMSW::SetRange(const int minValue, const int maxValue) char buf[40]; if ( m_staticMin ) { - sprintf(buf, "%d", m_rangeMin); - SetWindowText((HWND) m_staticMin, buf); + sprintf(buf, "%d", m_rangeMin); + SetWindowText((HWND) m_staticMin, buf); } if ( m_staticMax ) @@ -461,11 +472,11 @@ void wxSliderMSW::SetRange(const int minValue, const int maxValue) } } -WXHBRUSH wxSliderMSW::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +WXHBRUSH wxSliderMSW::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, + WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { if ( nCtlColor == CTLCOLOR_SCROLLBAR ) - return 0; + return 0; // Otherwise, it's a static if (GetParent()->GetTransparentBackground()) @@ -482,94 +493,79 @@ WXHBRUSH wxSliderMSW::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUIN } // For trackbars only -void wxSliderMSW::SetTickFreq(const int n, const int pos) +void wxSliderMSW::SetTickFreq(int n, int pos) { } -void wxSliderMSW::SetPageSize(const int pageSize) +void wxSliderMSW::SetPageSize(int pageSize) { m_pageSize = pageSize; } -int wxSliderMSW::GetPageSize(void) const +int wxSliderMSW::GetPageSize() const { return m_pageSize; } -void wxSliderMSW::ClearSel(void) +void wxSliderMSW::ClearSel() { } -void wxSliderMSW::ClearTicks(void) +void wxSliderMSW::ClearTicks() { } -void wxSliderMSW::SetLineSize(const int lineSize) +void wxSliderMSW::SetLineSize(int lineSize) { m_lineSize = lineSize; } -int wxSliderMSW::GetLineSize(void) const +int wxSliderMSW::GetLineSize() const { return m_lineSize; } -int wxSliderMSW::GetSelEnd(void) const +int wxSliderMSW::GetSelEnd() const { return 0; } -int wxSliderMSW::GetSelStart(void) const +int wxSliderMSW::GetSelStart() const { return 0; } -void wxSliderMSW::SetSelection(const int minPos, const int maxPos) +void wxSliderMSW::SetSelection(int minPos, int maxPos) { } -void wxSliderMSW::SetThumbLength(const int len) +void wxSliderMSW::SetThumbLength(int len) { } -int wxSliderMSW::GetThumbLength(void) const +int wxSliderMSW::GetThumbLength() const { return 0; } -void wxSliderMSW::SetTick(const int tickPos) +void wxSliderMSW::SetTick(int tickPos) { } bool wxSliderMSW::ContainsHWND(WXHWND hWnd) const { - return ( hWnd == GetStaticMin() || hWnd == GetStaticMax() || hWnd == GetEditValue() ); + return ( hWnd == GetStaticMin() || hWnd == GetStaticMax() || hWnd == GetEditValue() ); } -#if WXWIN_COMPATIBILITY -// Backward compatibility -void wxSliderMSW::OnScroll(wxScrollEvent& event) -{ - wxEventType oldEvent = event.GetEventType(); - event.SetEventType( wxEVT_COMMAND_SLIDER_UPDATED ); - if ( !GetEventHandler()->ProcessEvent(event) ) - { - event.SetEventType( oldEvent ); - if (!GetParent()->GetEventHandler()->ProcessEvent(event)) - event.Skip(); - } -} -#endif - void wxSliderMSW::Command (wxCommandEvent & event) { SetValue (event.GetInt()); ProcessCommand (event); } -bool wxSliderMSW::Show(const bool show) +bool wxSliderMSW::Show(bool show) { - wxWindow::Show(show); + wxWindow::Show(show); int cshow; if (show) @@ -578,11 +574,11 @@ bool wxSliderMSW::Show(const bool show) cshow = SW_HIDE; if(m_staticValue) - ShowWindow((HWND) m_staticValue, (BOOL)cshow); + ShowWindow((HWND) m_staticValue, (BOOL)cshow); if(m_staticMin) - ShowWindow((HWND) m_staticMin, (BOOL)cshow); + ShowWindow((HWND) m_staticMin, (BOOL)cshow); if(m_staticMax) - ShowWindow((HWND) m_staticMax, (BOOL)cshow); + ShowWindow((HWND) m_staticMax, (BOOL)cshow); return TRUE; }