X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bfc6fde4b1dd5bfd8ae22839ff9a69cf24eb9120..b4e0b521e0878a495c570af3d68b40c82b4a92b3:/src/msw/slidrmsw.cpp diff --git a/src/msw/slidrmsw.cpp b/src/msw/slidrmsw.cpp index 26d7488832..09e384bc7a 100644 --- a/src/msw/slidrmsw.cpp +++ b/src/msw/slidrmsw.cpp @@ -5,11 +5,11 @@ // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "slidrmsw.h" #endif @@ -29,9 +29,7 @@ #include "wx/msw/slidrmsw.h" #include "wx/msw/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxSliderMSW, wxControl) -#endif // Slider wxSliderMSW::wxSliderMSW() @@ -43,7 +41,6 @@ wxSliderMSW::wxSliderMSW() m_lineSize = 1; m_rangeMax = 0; m_rangeMin = 0; - m_tickFreq = 0; } bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, @@ -53,8 +50,13 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { + if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT ) + style |= wxBORDER_NONE; + SetName(name); +#if wxUSE_VALIDATORS SetValidator(validator); +#endif // wxUSE_VALIDATORS if (parent) parent->AddChild(this); SetBackgroundColour(parent->GetBackgroundColour()) ; @@ -66,12 +68,11 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, m_pageSize = 1; m_lineSize = 1; m_windowStyle = style; - m_tickFreq = 0; - if ( id == -1 ) - m_windowId = (int)NewControlId(); + if ( id == wxID_ANY ) + m_windowId = (int)NewControlId(); else - m_windowId = id; + m_windowId = id; int x = pos.x; int y = pos.y; @@ -79,34 +80,35 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, int height = size.y; // non-Win95 implementation - - long msStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER; - bool want3D; - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ; + long msStyle = SS_CENTER; + + WXDWORD exStyle = 0; + msStyle |= MSWGetStyle(GetWindowStyle(), & exStyle) ; - m_staticValue = (WXHWND) CreateWindowEx(exStyle, "STATIC", NULL, + m_staticValue = (WXHWND) CreateWindowEx(exStyle, wxT("STATIC"), NULL, msStyle, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), wxGetInstance(), NULL); // Now create min static control - sprintf(wxBuffer, "%d", minValue); - m_staticMin = (WXHWND) CreateWindowEx(0, "STATIC", wxBuffer, - STATIC_FLAGS, + wxString buf; + buf.Printf(wxT("%d"), minValue); + DWORD wstyle = STATIC_FLAGS; + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + m_staticMin = (WXHWND) CreateWindowEx(0, wxT("STATIC"), buf, + wstyle, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), wxGetInstance(), NULL); - // Now create slider - m_windowId = (int)NewControlId(); - msStyle = 0; if (m_windowStyle & wxSL_VERTICAL) msStyle = SBS_VERT | WS_CHILD | WS_VISIBLE | WS_TABSTOP ; else msStyle = SBS_HORZ | WS_CHILD | WS_VISIBLE | WS_TABSTOP ; - HWND scroll_bar = CreateWindowEx(MakeExtendedStyle(m_windowStyle), "SCROLLBAR", wxBuffer, + HWND scroll_bar = CreateWindowEx(exStyle, wxT("SCROLLBAR"), wxEmptyString, msStyle, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL); @@ -125,9 +127,12 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, SubclassWin(GetHWND()); // Finally, create max value static item - sprintf(wxBuffer, "%d", maxValue); - m_staticMax = (WXHWND) CreateWindowEx(0, "STATIC", wxBuffer, - STATIC_FLAGS, + buf.Printf(wxT("%d"), maxValue); + wstyle = STATIC_FLAGS; + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + m_staticMax = (WXHWND) CreateWindowEx(0, wxT("STATIC"), buf, + wstyle, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), wxGetInstance(), NULL); @@ -138,14 +143,14 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, // GetFont()->RealizeResource(); 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, + 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, + if (m_staticValue) + SendMessage((HWND)m_staticValue,WM_SETFONT, (WPARAM)GetFont().GetResourceHandle(),0L); } } @@ -153,10 +158,11 @@ bool wxSliderMSW::Create(wxWindow *parent, wxWindowID id, SetSize(x, y, width, height); SetValue(value); - return TRUE; + return true; } -void wxSliderMSW::MSWOnVScroll(WXWORD wParam, WXWORD pos, WXHWND control) +bool wxSliderMSW::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, + WXWORD pos, WXHWND control) { int position = ::GetScrollPos((HWND)control, SB_CTL); @@ -164,75 +170,76 @@ void wxSliderMSW::MSWOnVScroll(WXWORD wParam, WXWORD pos, WXHWND control) 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; + int newPos = position + nScrollInc; - if (!(newPos < GetMin() || newPos > GetMax())) - { - SetValue(newPos); + if ( (newPos < GetMin()) || (newPos > GetMax()) ) + { + // out of range - but we did process it + return true; + } - wxScrollEvent event(scrollEvent, m_windowId); - event.SetPosition(newPos); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); + SetValue(newPos); - wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() ); - cevent.SetEventObject( this ); - GetEventHandler()->ProcessEvent( cevent ); - } - } -} + wxScrollEvent event(scrollEvent, m_windowId); + event.SetPosition(newPos); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); -void wxSliderMSW::MSWOnHScroll(WXWORD wParam, WXWORD pos, WXHWND control) -{ - MSWOnVScroll(wParam, pos, control); + wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() ); + cevent.SetInt( newPos ); + cevent.SetEventObject( this ); + + return GetEventHandler()->ProcessEvent( cevent ); } wxSliderMSW::~wxSliderMSW() @@ -247,16 +254,17 @@ wxSliderMSW::~wxSliderMSW() int wxSliderMSW::GetValue() const { - return ::GetScrollPos((HWND) GetHWND(), SB_CTL); + return ::GetScrollPos(GetHwnd(), SB_CTL); } void wxSliderMSW::SetValue(int value) { - ::SetScrollPos((HWND) GetHWND(), SB_CTL, value, TRUE); + ::SetScrollPos(GetHwnd(), SB_CTL, value, TRUE); if (m_staticValue) { - sprintf(wxBuffer, "%d", value); - SetWindowText((HWND) m_staticValue, wxBuffer); + wxString buf; + buf.Printf(wxT("%d"), value); + SetWindowText((HWND) m_staticValue, buf); } } @@ -314,6 +322,8 @@ void wxSliderMSW::GetPosition(int *x, int *y) const *y = point.y; } +// TODO one day, make sense of all this horros and replace it with a readable +// DoGetBestSize() void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int x1 = x; @@ -323,14 +333,14 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) int currentX, currentY; GetPosition(¤tX, ¤tY); - if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + if (x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) x1 = currentX; - if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + if (y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) y1 = currentY; AdjustForParentClientOrigin(x1, y1, sizeFlags); - char buf[300]; + wxChar buf[300]; int x_offset = x; int y_offset = y; @@ -339,12 +349,12 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) int cy; int cyf; - wxGetCharSize(GetHWND(), &cx, &cy,& this->GetFont()); + wxGetCharSize(GetHWND(), &cx, &cy, this->GetFont()); if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL) { - if ( m_windowStyle & wxSL_LABELS ) - { + if ( m_windowStyle & wxSL_LABELS ) + { int min_len = 0; GetWindowText((HWND) m_staticMin, buf, 300); @@ -357,17 +367,17 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) 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 new_width += 3*cx; #endif - MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); + ::MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); x_offset += new_width + cx; } - MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); + ::MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); x_offset += (int)(min_len + cx); int slider_length = (int)(w1 - x_offset - max_len - cx); @@ -378,25 +388,25 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (slider_length < 100) slider_length = 100; - MoveWindow((HWND) GetHWND(), x_offset, y_offset, slider_length, slider_height, TRUE); + ::MoveWindow(GetHwnd(), x_offset, y_offset, slider_length, slider_height, TRUE); x_offset += slider_length + cx; - MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); + ::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(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 ) - { + if ( m_windowStyle & wxSL_LABELS ) + { int min_len; GetWindowText((HWND) m_staticMin, buf, 300); GetTextExtent(buf, &min_len, &cyf,NULL,NULL,& this->GetFont()); @@ -408,7 +418,7 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) 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 @@ -418,11 +428,11 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) ... and replace with following line: */ new_width += cx; - MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); + ::MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); y_offset += valueHeight; } - MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); + ::MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); y_offset += cy; int slider_length = (int)(h1 - y_offset - cy - cy); @@ -434,20 +444,20 @@ void wxSliderMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (slider_length < 100) slider_length = 100; - MoveWindow((HWND) GetHWND(), x_offset, y_offset, slider_width, slider_length, TRUE); + ::MoveWindow(GetHwnd(), x_offset, y_offset, slider_width, slider_length, TRUE); y_offset += slider_length; - MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); + ::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(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); - } } } @@ -456,44 +466,29 @@ void wxSliderMSW::SetRange(int minValue, int maxValue) m_rangeMin = minValue; m_rangeMax = maxValue; - ::SetScrollRange((HWND) GetHWND(), SB_CTL, m_rangeMin, m_rangeMax, TRUE); - char buf[40]; + ::SetScrollRange(GetHwnd(), SB_CTL, m_rangeMin, m_rangeMax, TRUE); + wxChar buf[40]; if ( m_staticMin ) { - sprintf(buf, "%d", m_rangeMin); - SetWindowText((HWND) m_staticMin, buf); + wxSprintf(buf, wxT("%d"), m_rangeMin); + SetWindowText((HWND) m_staticMin, buf); } if ( m_staticMax ) { - sprintf(buf, "%d", m_rangeMax); + wxSprintf(buf, wxT("%d"), m_rangeMax); SetWindowText((HWND) m_staticMax, buf); } } WXHBRUSH wxSliderMSW::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) + WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { if ( nCtlColor == CTLCOLOR_SCROLLBAR ) - return 0; + return 0; // Otherwise, it's a static - if (GetParent()->GetTransparentBackground()) - SetBkMode((HDC) pDC, TRANSPARENT); - else - SetBkMode((HDC) pDC, OPAQUE); - - ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue())); - ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue())); - - wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); - - return (WXHBRUSH) backgroundBrush->GetResourceHandle(); -} - -// For trackbars only -void wxSliderMSW::SetTickFreq(int n, int pos) -{ + return wxControl::OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); } void wxSliderMSW::SetPageSize(int pageSize) @@ -506,14 +501,6 @@ int wxSliderMSW::GetPageSize() const return m_pageSize; } -void wxSliderMSW::ClearSel() -{ -} - -void wxSliderMSW::ClearTicks() -{ -} - void wxSliderMSW::SetLineSize(int lineSize) { m_lineSize = lineSize; @@ -524,36 +511,20 @@ int wxSliderMSW::GetLineSize() const return m_lineSize; } -int wxSliderMSW::GetSelEnd() const -{ - return 0; -} - -int wxSliderMSW::GetSelStart() const -{ - return 0; -} - -void wxSliderMSW::SetSelection(int minPos, int maxPos) -{ -} - -void wxSliderMSW::SetThumbLength(int len) +// Not yet implemented +void wxSliderMSW::SetThumbLength(int WXUNUSED(lenPixels)) { } +// Not yet implemented int wxSliderMSW::GetThumbLength() const { - return 0; -} - -void wxSliderMSW::SetTick(int tickPos) -{ + return 0; } bool wxSliderMSW::ContainsHWND(WXHWND hWnd) const { - return ( hWnd == GetStaticMin() || hWnd == GetStaticMax() || hWnd == GetEditValue() ); + return ( hWnd == GetStaticMin() || hWnd == GetStaticMax() || hWnd == GetEditValue() ); } void wxSliderMSW::Command (wxCommandEvent & event) @@ -564,7 +535,7 @@ void wxSliderMSW::Command (wxCommandEvent & event) bool wxSliderMSW::Show(bool show) { - wxWindow::Show(show); + wxWindow::Show(show); int cshow; if (show) @@ -573,12 +544,12 @@ bool wxSliderMSW::Show(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); - return TRUE; + ShowWindow((HWND) m_staticMax, (BOOL)cshow); + return true; }