X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c299c3ab663257429983c24e6fb71450f3cf9f1..91b4bd63177025704dd39679a2a7c4198eeb7909:/src/os2/slider.cpp diff --git a/src/os2/slider.cpp b/src/os2/slider.cpp index 2a9101349e..7819dca287 100644 --- a/src/os2/slider.cpp +++ b/src/os2/slider.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #endif #include "wx/slider.h" @@ -49,6 +50,80 @@ wxSlider::~wxSlider() ::WinDestroyWindow((HWND)m_hStaticValue); } // end of wxSlider::~wxSlider +void wxSlider::AdjustSubControls( + int nX +, int nY +, int nWidth +, int nHeight +, int nSizeFlags +) +{ + SWP vSwp; + int nXOffset = nX; + int nYOffset = nY; + int nCx; // slider,min,max sizes + int nCy; + int nCyf; + char zBuf[300]; + + wxGetCharSize( GetHWND() + ,&nCx + ,&nCy + ,&this->GetFont() + ); + + if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL) + { + if (m_windowStyle & wxSL_LABELS ) + { + int nMinLen = 0; + int nMaxLen = 0; + + ::WinQueryWindowText((HWND)m_hStaticMin, 300, zBuf); + GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &this->GetFont()); + + ::WinQueryWindowText((HWND)m_hStaticMax, 300, zBuf); + GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &this->GetFont()); + + if (m_hStaticValue) + { + int nNewWidth = wxMax(nMinLen, nMaxLen); + int nValueHeight = nCyf; + + ::WinSetWindowPos( (HWND)m_hStaticValue + ,HWND_TOP + ,(LONG)nXOffset - (nNewWidth + nCx + nMinLen + nCx) + ,(LONG)nYOffset + ,(LONG)nNewWidth + ,(LONG)nValueHeight + ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW + ); + } + ::WinSetWindowPos( (HWND)m_hStaticMin + ,HWND_TOP + ,(LONG)nXOffset - (nMinLen + nCx) + ,(LONG)nYOffset + ,(LONG)nMinLen + ,(LONG)nCy + ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW + ); + nXOffset += nWidth + nCx; + + ::WinSetWindowPos( (HWND)m_hStaticMax + ,HWND_TOP + ,(LONG)nXOffset + ,(LONG)nYOffset + ,(LONG)nMaxLen + ,(LONG)nCy + ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW + ); + } + } + // + // Now deal with a vertical slider -- OS/2 doesn't have vertical sliders + // +} // end of wxSlider::AdjustSubControls + void wxSlider::ClearSel() { } // end of wxSlider::ClearSel @@ -126,6 +201,15 @@ bool wxSlider::Create( { lMsStyle |= WS_VISIBLE | SS_TEXT | DT_VCENTER; + // + // If the parent is a scrolled window the controls must + // have this style or they will overlap the scrollbars + // + if (pParent) + if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || + pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) + lMsStyle |= WS_CLIPSIBLINGS; + m_hStaticValue = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class ,(PSZ)NULL // Initial Text @@ -145,6 +229,15 @@ bool wxSlider::Create( lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE; if (m_windowStyle & wxCLIP_SIBLINGS) lWstyle |= WS_CLIPSIBLINGS; + // + // If the parent is a scrolled window the controls must + // have this style or they will overlap the scrollbars + // + if (pParent) + if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || + pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) + lWstyle |= WS_CLIPSIBLINGS; + m_hStaticMin = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class ,(PSZ)wxBuffer // Initial Text @@ -189,6 +282,15 @@ bool wxSlider::Create( else lMsStyle |= SLS_PRIMARYSCALE2; + // + // If the parent is a scrolled window the controls must + // have this style or they will overlap the scrollbars + // + if (pParent) + if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || + pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) + lMsStyle |= WS_CLIPSIBLINGS; + m_nPageSize = ((nMaxValue - nMinValue)/10); vSlData.usScale1Increments = m_nPageSize; vSlData.usScale2Increments = m_nPageSize; @@ -227,7 +329,7 @@ bool wxSlider::Create( m_hWnd = (WXHWND)hScrollBar; SubclassWin(GetHWND()); ::WinSetWindowText((HWND)m_hWnd, ""); - SetFont(pParent->GetFont()); + SetFont(*wxSMALL_FONT); if (m_windowStyle & wxSL_LABELS) { // @@ -237,6 +339,15 @@ bool wxSlider::Create( lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE; if (m_windowStyle & wxCLIP_SIBLINGS) lMsStyle |= WS_CLIPSIBLINGS; + // + // If the parent is a scrolled window the controls must + // have this style or they will overlap the scrollbars + // + if (pParent) + if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || + pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) + lWstyle |= WS_CLIPSIBLINGS; + m_hStaticMax = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class ,(PSZ)wxBuffer // Initial Text @@ -308,6 +419,27 @@ bool wxSlider::Create( ,sizeof(LONG) ,(PVOID)&lColor ); + lColor = (LONG)m_backgroundColour.GetPixel(); + ::WinSetPresParam( m_hStaticMin + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + ::WinSetPresParam( m_hStaticMax + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + ::WinSetPresParam( m_hStaticValue + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + ::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); SetValue(nValue); return TRUE; } // end of wxSlider::Create @@ -345,24 +477,11 @@ void wxSlider::DoSetSize( if (pParent) { - // - // Under OS/2, where a frame window is the parent, most child windows - // that are not specific frame clients are actually children of the - // frame's client, not the frame itself, and so position themselves - // with regards to the client origin, not the frame. - // - if (pParent->IsKindOf(CLASSINFO(wxFrame))) - { - nYOffset = pParent->GetClientSize().y - (nYOffset + nOS2Height); - if (nY != -1) - nY1 = pParent->GetClientSize().y - (nY1 + nOS2Height); - } - else - { - nYOffset = pParent->GetSize().y - (nYOffset + nOS2Height); - if (nY != -1) - nY1 = pParent->GetSize().y - (nY1 + nOS2Height); - } + int nOS2ParentHeight = GetOS2ParentHeight(pParent); + + nYOffset = nOS2ParentHeight - (nYOffset + nOS2Height); + if (nY != -1) + nY1 = nOS2ParentHeight - (nY1 + nOS2Height); } else { @@ -373,6 +492,7 @@ void wxSlider::DoSetSize( if (nY != -1) nY1 = vRect.yTop - (nY1 + nOS2Height); } + m_nSizeFlags = nSizeFlags; GetPosition( &nCurrentX ,&nCurrentY