X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c299c3ab663257429983c24e6fb71450f3cf9f1..ba670bae4ec5b272fdf0f45bf00e194741742a7e:/src/os2/slider.cpp diff --git a/src/os2/slider.cpp b/src/os2/slider.cpp index 2a9101349e..b97747f687 100644 --- a/src/os2/slider.cpp +++ b/src/os2/slider.cpp @@ -20,8 +20,11 @@ #include #include #include +#include #endif +#if wxUSE_SLIDER + #include "wx/slider.h" #include "wx/os2/private.h" @@ -49,6 +52,124 @@ wxSlider::~wxSlider() ::WinDestroyWindow((HWND)m_hStaticValue); } // end of wxSlider::~wxSlider +void wxSlider::AdjustSubControls( + int nX +, int nY +, int nWidth +, int nHeight +, int nSizeFlags +) +{ + 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_SIZE | SWP_MOVE + ); + } + ::WinSetWindowPos( (HWND)m_hStaticMin + ,HWND_TOP + ,(LONG)nXOffset - (nMinLen + nCx) + ,(LONG)nYOffset + ,(LONG)nMinLen + ,(LONG)nCyf + ,SWP_SIZE | SWP_MOVE + ); + nXOffset += nWidth + nCx; + + ::WinSetWindowPos( (HWND)m_hStaticMax + ,HWND_TOP + ,(LONG)nXOffset + ,(LONG)nYOffset + ,(LONG)nMaxLen + ,(LONG)nCyf + ,SWP_ZORDER | SWP_SHOW + ); + } + } + else + { + // + // Now deal with a vertical slider + // + + 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)); + + ::WinSetWindowPos( (HWND)m_hStaticValue + ,HWND_TOP + ,(LONG)nXOffset + ,(LONG)nYOffset + nHeight + nCyf + ,(LONG)nNewWidth + ,(LONG)nCyf + ,SWP_SIZE | SWP_MOVE + ); + } + ::WinSetWindowPos( (HWND)m_hStaticMax + ,HWND_TOP + ,(LONG)nXOffset + ,(LONG)nYOffset + nHeight + ,(LONG)nMaxLen + ,(LONG)nCyf + ,SWP_SIZE | SWP_MOVE + ); + ::WinSetWindowPos( (HWND)m_hStaticMin + ,HWND_TOP + ,(LONG)nXOffset + ,(LONG)nYOffset - nCyf + ,(LONG)nMinLen + ,(LONG)nCyf + ,SWP_SIZE | SWP_MOVE + ); + } + } +} // end of wxSlider::AdjustSubControls + void wxSlider::ClearSel() { } // end of wxSlider::ClearSel @@ -84,9 +205,7 @@ bool wxSlider::Create( , const wxPoint& rPos , const wxSize& rSize , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rValidator -#endif , const wxString& rsName ) { @@ -145,6 +264,7 @@ bool wxSlider::Create( lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE; if (m_windowStyle & wxCLIP_SIBLINGS) lWstyle |= WS_CLIPSIBLINGS; + m_hStaticMin = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class ,(PSZ)wxBuffer // Initial Text @@ -163,9 +283,9 @@ bool wxSlider::Create( vSlData.cbSize = sizeof(SLDCDATA); if (m_windowStyle & wxSL_VERTICAL) - lMsStyle = SLS_VERTICAL | WS_VISIBLE | WS_TABSTOP; + lMsStyle = SLS_VERTICAL | SLS_HOMEBOTTOM | WS_VISIBLE | WS_TABSTOP; else - lMsStyle = SLS_HORIZONTAL | WS_VISIBLE | WS_TABSTOP; + lMsStyle = SLS_HORIZONTAL | SLS_HOMELEFT | WS_VISIBLE | WS_TABSTOP; if (m_windowStyle & wxCLIP_SIBLINGS) lMsStyle |= WS_CLIPSIBLINGS; @@ -188,6 +308,7 @@ bool wxSlider::Create( lMsStyle |= SLS_PRIMARYSCALE1 | SLS_PRIMARYSCALE2; else lMsStyle |= SLS_PRIMARYSCALE2; + lMsStyle |= SLS_RIBBONSTRIP; m_nPageSize = ((nMaxValue - nMinValue)/10); vSlData.usScale1Increments = m_nPageSize; @@ -199,7 +320,7 @@ bool wxSlider::Create( ,(ULONG)lMsStyle // Style flags ,0L, 0L, 0L, 0L // Origin -- 0 size ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent - ,HWND_TOP // initial z position + ,HWND_BOTTOM // initial z position ,(HMENU)m_windowId // Window identifier ,&vSlData // Slider control data ,NULL // no Presentation parameters @@ -212,7 +333,7 @@ bool wxSlider::Create( // ::WinSendMsg( hScrollBar ,SLM_SETTICKSIZE - ,MPFROM2SHORT(SMA_SETALLTICKS, 6) + ,MPFROM2SHORT(SMA_SETALLTICKS, (USHORT)12) ,NULL ); // @@ -227,7 +348,8 @@ 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 +359,7 @@ bool wxSlider::Create( lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE; if (m_windowStyle & wxCLIP_SIBLINGS) lMsStyle |= WS_CLIPSIBLINGS; + m_hStaticMax = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class ,(PSZ)wxBuffer // Initial Text @@ -268,6 +391,8 @@ bool wxSlider::Create( } } + SetXComp(0); + SetYComp(0); SetSize( nX ,nY ,nWidth @@ -308,8 +433,36 @@ 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 + ); + vColour.Set(wxString("BLUE")); + lColor = (LONG)vColour.GetPixel(); + ::WinSetPresParam( m_hWnd + ,PP_HILITEBACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); SetValue(nValue); - return TRUE; + return true; } // end of wxSlider::Create void wxSlider::DoSetSize( @@ -345,24 +498,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 +513,7 @@ void wxSlider::DoSetSize( if (nY != -1) nY1 = vRect.yTop - (nY1 + nOS2Height); } + m_nSizeFlags = nSizeFlags; GetPosition( &nCurrentX ,&nCurrentY @@ -412,7 +553,7 @@ void wxSlider::DoSetSize( ::WinSetWindowPos( (HWND)m_hStaticValue ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset - (nCyf * 1.2) + ,(LONG)nYOffset - (LONG)(nCyf * 1.2) ,(LONG)nNewWidth ,(LONG)nValueHeight ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW @@ -422,7 +563,7 @@ void wxSlider::DoSetSize( ::WinSetWindowPos( (HWND)m_hStaticMin ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset - nCyf + ,(LONG)nYOffset - (LONG)(nCyf * 1.2) ,(LONG)nMinLen ,(LONG)nCy ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW @@ -449,12 +590,20 @@ void wxSlider::DoSetSize( ,(LONG)nSliderHeight ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); + ::WinQueryWindowPos(GetHwnd(), GetSwp()); + ::WinSendMsg( GetHwnd() + ,SLM_SETSLIDERINFO + ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS + ,0 + ) + ,MPFROMLONG((ULONG)(nSliderHeight/2)) + ); nXOffset += nSliderLength + nCx; ::WinSetWindowPos( (HWND)m_hStaticMax ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset - nCyf + ,(LONG)nYOffset - (LONG)(nCyf * 1.2) ,(LONG)nMaxLen ,(LONG)nCy ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW @@ -507,33 +656,24 @@ void wxSlider::DoSetSize( int nNewWidth = wxMax(nMinLen, nMaxLen); int nValueHeight = nCyf; - nNewWidth += nCx; - - // - // The height needs to be a bit bigger under Win95 if using native - // 3D effects. - // - nValueHeight = (int)(nValueHeight * 1.5); ::WinSetWindowPos( (HWND)m_hStaticValue ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset + ,(LONG)nYOffset + nHeight ,(LONG)nNewWidth ,(LONG)nValueHeight ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); - nYOffset -= nValueHeight; - nUsedHeight += nValueHeight; + nUsedHeight += nCyf; } ::WinSetWindowPos( (HWND)m_hStaticMin ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset + ,(LONG)nYOffset + nHeight - nCyf ,(LONG)nMinLen ,(LONG)nCy ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); - nYOffset -= nCy; nUsedHeight += nCy; int nSliderLength = nHeight1 - (nUsedHeight + (2 * nCy)); @@ -548,20 +688,27 @@ void wxSlider::DoSetSize( if (nSliderLength < 100) nSliderLength = 100; - ::WinSetWindowPos( (HWND)m_hStaticMin + ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset + ,(LONG)nYOffset + nCyf ,(LONG)nSliderWidth ,(LONG)nSliderLength ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); - nYOffset -= nSliderLength; + ::WinQueryWindowPos(GetHwnd(), GetSwp()); + ::WinSendMsg( GetHwnd() + ,SLM_SETSLIDERINFO + ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS + ,0 + ) + ,MPFROMLONG((ULONG)(nSliderWidth/2)) + ); nUsedHeight += nSliderLength; ::WinSetWindowPos( (HWND)m_hStaticMax ,HWND_TOP ,(LONG)nXOffset - ,(LONG)nYOffset + ,(LONG)nYOffset - nCyf ,(LONG)nMaxLen ,(LONG)nCy ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW @@ -679,6 +826,16 @@ int wxSlider::GetSelStart() const return 0; } // end of wxSlider::GetSelStart +void wxSlider::DoGetSize( + int* pnWidth +, int* pnHeight +) const +{ + GetSize( pnWidth + ,pnHeight + ); +} // end of wxSlider::DoGetSize + void wxSlider::GetSize( int* pnWidth , int* pnHeight @@ -707,8 +864,10 @@ void wxSlider::GetSize( wxFindMaxSize( m_hStaticValue ,&vRect ); - *pnWidth = vRect.xRight - vRect.xLeft; - *pnHeight = vRect.yBottom - vRect.yTop; + if (pnWidth) + *pnWidth = vRect.xRight - vRect.xLeft; + if (pnHeight) + *pnHeight = vRect.yTop - vRect.yBottom; } // end of wxSlider::GetSize int wxSlider::GetThumbLength() const @@ -784,7 +943,7 @@ bool wxSlider::OS2OnScroll( break; default: - return FALSE; + return false; } int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd() @@ -805,7 +964,7 @@ bool wxSlider::OS2OnScroll( ,(MPARAM)0 ) ); - nNewPos = (nPixelPos/m_dPixelToRange); + nNewPos = (int)(nPixelPos/m_dPixelToRange); if (nNewPos > (m_nRangeMax - m_nRangeMin)/2) nNewPos++; if ((nNewPos < GetMin()) || (nNewPos > GetMax())) @@ -813,7 +972,7 @@ bool wxSlider::OS2OnScroll( // // Out of range - but we did process it // - return TRUE; + return true; } SetValue(nNewPos); @@ -924,7 +1083,7 @@ void wxSlider::SetTick( int nTickPos ) { - nTickPos *= m_dPixelToRange; + nTickPos = (int)(nTickPos * m_dPixelToRange); ::WinSendMsg( GetHwnd() ,SLM_ADDDETENT ,MPFROMSHORT(nTickPos) @@ -962,7 +1121,7 @@ void wxSlider::SetTickFreq( ::WinSendMsg(GetHwnd(), WM_SETWINDOWPARAMS, (MPARAM)&vWndParams, (MPARAM)0); for (i = 1; i < (m_nRangeMax - m_nRangeMin)/n; i++) { - nPixelPos = i * n * m_dPixelToRange; + nPixelPos = (int)(i * n * m_dPixelToRange); ::WinSendMsg( GetHwnd() ,SLM_ADDDETENT ,MPFROMSHORT(nPixelPos) @@ -975,14 +1134,6 @@ void wxSlider::SetValue( int nValue ) { - int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd() - ,SLM_QUERYSLIDERINFO - ,MPFROM2SHORT( SMA_SLIDERARMPOSITION - ,SMA_RANGEVALUE - ) - ,(MPARAM)0 - ) - ); int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd() ,SLM_QUERYSLIDERINFO ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS @@ -1019,6 +1170,7 @@ bool wxSlider::Show( ::WinShowWindow((HWND)m_hStaticMin, bShow); if(m_hStaticMax) ::WinShowWindow((HWND)m_hStaticMax, bShow); - return TRUE; + return true; } // end of wxSlider::Show +#endif // wxUSE_SLIDER