home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wxos2240.zip
/
wxWindows-2.4.0
/
src
/
os2
/
slider.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-12-27
|
45KB
|
1,181 lines
/////////////////////////////////////////////////////////////////////////////
// Name: slider.cpp
// Purpose: wxSlider
// Author: David Webster
// Modified by:
// Created: 10/15/99
// RCS-ID: $Id: SLIDER.CPP,v 1.19.2.1 2002/12/27 14:49:35 JS Exp $
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <stdio.h>
#include <wx/utils.h>
#include <wx/brush.h>
#include <wx/scrolwin.h>
#endif
#include "wx/slider.h"
#include "wx/os2/private.h"
IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
wxSlider::wxSlider()
{
m_hStaticValue = 0L;
m_hStaticMin = 0L;
m_hStaticMax = 0L;
m_nPageSize = 1;
m_nLineSize = 1;
m_nRangeMax = 0;
m_nRangeMin = 0;
m_nTickFreq = 0;
} // end of wxSlider::wxSlider
wxSlider::~wxSlider()
{
if (m_hStaticMin)
::WinDestroyWindow((HWND)m_hStaticMin);
if (m_hStaticMax)
::WinDestroyWindow((HWND)m_hStaticMax);
if (m_hStaticValue)
::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_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
void wxSlider::ClearTicks()
{
} // end of wxSlider::ClearTicks
void wxSlider::Command (
wxCommandEvent& rEvent
)
{
SetValue(rEvent.GetInt());
ProcessCommand(rEvent);
} // end of wxSlider::Command
bool wxSlider::ContainsHWND(
WXHWND hWnd
) const
{
return ( hWnd == GetStaticMin() ||
hWnd == GetStaticMax() ||
hWnd == GetEditValue()
);
} // end of wxSlider::ContainsHWND
bool wxSlider::Create(
wxWindow* pParent
, wxWindowID vId
, int nValue
, int nMinValue
, int nMaxValue
, const wxPoint& rPos
, const wxSize& rSize
, long lStyle
, const wxValidator& rValidator
, const wxString& rsName
)
{
int nX = rPos.x;
int nY = rPos.y;
int nWidth = rSize.x;
int nHeight = rSize.y;
long lMsStyle = 0L;
long lWstyle = 0L;
SetName(rsName);
#if wxUSE_VALIDATORS
SetValidator(rValidator);
#endif
if (pParent)
pParent->AddChild(this);
SetBackgroundColour(pParent->GetBackgroundColour()) ;
SetForegroundColour(pParent->GetForegroundColour()) ;
m_hStaticValue = 0L;
m_hStaticMin = 0L;
m_hStaticMax = 0L;
m_nPageSize = 1;
m_nLineSize = 1;
m_windowStyle = lStyle;
m_nTickFreq = 0;
if (vId == -1)
m_windowId = (int)NewControlId();
else
m_windowId = vId;
if (m_windowStyle & wxCLIP_SIBLINGS )
lMsStyle |= WS_CLIPSIBLINGS;
if (m_windowStyle & wxSL_LABELS)
{
lMsStyle |= WS_VISIBLE | SS_TEXT | DT_VCENTER;
m_hStaticValue = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
,WC_STATIC // Window class
,(PSZ)NULL // Initial Text
,(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
,(ULONG)NewControlId() // Window identifier
,NULL // no control data
,NULL // no Presentation parameters
);
//
// Now create min static control
//
sprintf(wxBuffer, "%d", nMinValue);
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
,(ULONG)lWstyle // Style flags
,0L, 0L, 0L, 0L // Origin -- 0 size
,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
,HWND_TOP // initial z position
,(ULONG)NewControlId() // Window identifier
,NULL // no control data
,NULL // no Presentation parameters
);
}
lMsStyle = 0;
SLDCDATA vSlData;
vSlData.cbSize = sizeof(SLDCDATA);
if (m_windowStyle & wxSL_VERTICAL)
lMsStyle = SLS_VERTICAL | SLS_HOMEBOTTOM | WS_VISIBLE | WS_TABSTOP;
else
lMsStyle = SLS_HORIZONTAL | SLS_HOMELEFT | WS_VISIBLE | WS_TABSTOP;
if (m_windowStyle & wxCLIP_SIBLINGS)
lMsStyle |= WS_CLIPSIBLINGS;
if (m_windowStyle & wxSL_AUTOTICKS)
{
vSlData.usScale1Spacing = 0;
vSlData.usScale2Spacing = 0;
}
if (m_windowStyle & wxSL_LEFT)
lMsStyle |= SLS_PRIMARYSCALE2; // if SLS_VERTICAL then SCALE2 is to the left
else if (m_windowStyle & wxSL_RIGHT)
lMsStyle |= SLS_PRIMARYSCALE1; // if SLS_VERTICAL then SCALE2 is to the right
else if (m_windowStyle & wxSL_TOP)
lMsStyle |= SLS_PRIMARYSCALE1; // if SLS_HORIZONTAL then SCALE1 is to the top
else if (m_windowStyle & wxSL_BOTTOM )
lMsStyle |= SLS_PRIMARYSCALE2; // if SLS_HORIZONTAL then SCALE1 is to the bottom
else if ( m_windowStyle & wxSL_BOTH )
lMsStyle |= SLS_PRIMARYSCALE1 | SLS_PRIMARYSCALE2;
else
lMsStyle |= SLS_PRIMARYSCALE2;
lMsStyle |= SLS_RIBBONSTRIP;
m_nPageSize = ((nMaxValue - nMinValue)/10);
vSlData.usScale1Increments = m_nPageSize;
vSlData.usScale2Increments = m_nPageSize;
HWND hScrollBar = ::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
,WC_SLIDER // Window class
,(PSZ)wxBuffer // Initial Text
,(ULONG)lMsStyle // Style flags
,0L, 0L, 0L, 0L // Origin -- 0 size
,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
,HWND_BOTTOM // initial z position
,(HMENU)m_windowId // Window identifier
,&vSlData // Slider control data
,NULL // no Presentation parameters
);
m_nRangeMax = nMaxValue;
m_nRangeMin = nMinValue;
//
// Set the size of the ticks ... default to 6 pixels
//
::WinSendMsg( hScrollBar
,SLM_SETTICKSIZE
,MPFROM2SHORT(SMA_SETALLTICKS, (USHORT)12)
,NULL
);
//
// Set the position to the initial value
//
::WinSendMsg( hScrollBar
,SLM_SETSLIDERINFO
,MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE)
,(MPARAM)nValue
);
m_hWnd = (WXHWND)hScrollBar;
SubclassWin(GetHWND());
::WinSetWindowText((HWND)m_hWnd, "");
SetFont(*wxSMALL_FONT);
if (m_windowStyle & wxSL_LABELS)
{
//
// Finally, create max value static item
//
sprintf(wxBuffer, "%d", nMaxValue);
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
,(ULONG)lWstyle // Style flags
,0L, 0L, 0L, 0L // Origin -- 0 size
,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
,HWND_TOP // initial z position
,(ULONG)NewControlId() // Window identifier
,NULL // no control data
,NULL // no Presentation parameters
);
if (GetFont().Ok())
{
if (GetFont().GetResourceHandle())
{
if (m_hStaticMin)
wxOS2SetFont( m_hStaticMin
,GetFont()
);
if (m_hStaticMax)
wxOS2SetFont( m_hStaticMax
,GetFont()
);
if (m_hStaticValue)
wxOS2SetFont( m_hStaticValue
,GetFont()
);
}
}
}
SetXComp(0);
SetYComp(0);
SetSize( nX
,nY
,nWidth
,nHeight
);
m_nThumbLength = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
) + 4; // for bordersizes
wxColour vColour;
vColour.Set(wxString("BLACK"));
LONG lColor = (LONG)vColour.GetPixel();
::WinSetPresParam( m_hStaticMin
,PP_FOREGROUNDCOLOR
,sizeof(LONG)
,(PVOID)&lColor
);
::WinSetPresParam( m_hStaticMax
,PP_FOREGROUNDCOLOR
,sizeof(LONG)
,(PVOID)&lColor
);
::WinSetPresParam( m_hStaticValue
,PP_FOREGROUNDCOLOR
,sizeof(LONG)
,(PVOID)&lColor
);
::WinSetPresParam( m_hWnd
,PP_FOREGROUNDCOLOR
,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;
} // end of wxSlider::Create
void wxSlider::DoSetSize(
int nX
, int nY
, int nWidth
, int nHeight
, int nSizeFlags
)
{
int nX1 = nX;
int nY1 = nY;
int nWidth1 = nWidth;
int nHeight1 = nHeight;
int nXOffset = nX;
int nYOffset = nY;
int nCx; // slider,min,max sizes
int nCy;
int nCyf;
int nCurrentX;
int nCurrentY;
char zBuf[300];
//
// Adjust for OS/2's reverse coordinate system
//
wxWindowOS2* pParent = (wxWindowOS2*)GetParent();
int nUsedHeight = 0;
int nOS2Height = nHeight;
if (nOS2Height < 0)
nOS2Height = 20;
if (pParent)
{
int nOS2ParentHeight = GetOS2ParentHeight(pParent);
nYOffset = nOS2ParentHeight - (nYOffset + nOS2Height);
if (nY != -1)
nY1 = nOS2ParentHeight - (nY1 + nOS2Height);
}
else
{
RECTL vRect;
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
nYOffset = vRect.yTop - (nYOffset + nOS2Height);
if (nY != -1)
nY1 = vRect.yTop - (nY1 + nOS2Height);
}
m_nSizeFlags = nSizeFlags;
GetPosition( &nCurrentX
,&nCurrentY
);
if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
nX1 = nCurrentX;
if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
nY1 = nCurrentY;
AdjustForParentClientOrigin( nX1
,nY1
,nSizeFlags
);
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
,(LONG)nYOffset - (nCyf * 1.2)
,(LONG)nNewWidth
,(LONG)nValueHeight
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
nXOffset += nNewWidth + nCx;
}
::WinSetWindowPos( (HWND)m_hStaticMin
,HWND_TOP
,(LONG)nXOffset
,(LONG)nYOffset - (nCyf * 1.2)
,(LONG)nMinLen
,(LONG)nCy
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
nXOffset += nMinLen + nCx;
int nSliderLength = nWidth1 - nXOffset - nMaxLen - nCx;
int nSliderHeight = nHeight1;
if (nSliderHeight < 0)
nSliderHeight = 20;
//
// Slider must have a minimum/default length/height
//
if (nSliderLength < 100)
nSliderLength = 100;
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nXOffset
,(LONG)nYOffset
,(LONG)nSliderLength
,(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 * 1.2)
,(LONG)nMaxLen
,(LONG)nCy
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
}
else
{
//
// No labels
// If we're prepared to use the existing size, then...
//
if (nWidth == -1 && nHeight == -1 &&
((nSizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO))
{
GetSize( &nWidth1
,&nHeight1
);
}
if (nWidth1 < 0)
nWidth1 = 200;
if (nHeight1 < 0)
nHeight1 = 20;
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nX1
,(LONG)nY1
,(LONG)nWidth1
,(LONG)nHeight1
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
}
}
//
// Now deal with a vertical slider
//
else
{
if (m_windowStyle & wxSL_LABELS )
{
int nMinLen;
int nMaxLen;
::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
,(LONG)nYOffset + nHeight
,(LONG)nNewWidth
,(LONG)nValueHeight
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
nUsedHeight += nCyf;
}
::WinSetWindowPos( (HWND)m_hStaticMin
,HWND_TOP
,(LONG)nXOffset
,(LONG)nYOffset + nHeight - nCyf
,(LONG)nMinLen
,(LONG)nCy
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
nUsedHeight += nCy;
int nSliderLength = nHeight1 - (nUsedHeight + (2 * nCy));
int nSliderWidth = nWidth1;
if (nSliderWidth < 0)
nSliderWidth = 20;
//
// Slider must have a minimum/default length
//
if (nSliderLength < 100)
nSliderLength = 100;
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nXOffset
,(LONG)nYOffset + nCyf
,(LONG)nSliderWidth
,(LONG)nSliderLength
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
::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 - nCyf
,(LONG)nMaxLen
,(LONG)nCy
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
}
else
{
//
// No labels
// If we're prepared to use the existing size, then...
//
if (nWidth == -1 && nHeight == -1 &&
((nSizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO))
{
GetSize( &nWidth1
,&nHeight1
);
}
if (nWidth1 < 0)
nWidth1 = 20;
if (nHeight1 < 0)
nHeight1 = 200;
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nX1
,(LONG)nY1
,(LONG)nWidth1
,(LONG)nHeight1
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
}
}
} // end of void wxSlider::DoSetSize
int wxSlider::GetLineSize() const
{
return 1;
} // end of wxSlider::GetLineSize
int wxSlider::GetPageSize() const
{
return m_nPageSize;
} // end of wxSlider::GetPageSize
void wxSlider::GetPosition(
int* pnX
, int* pnY
) const
{
wxWindowOS2* pParent = GetParent();
RECTL vRect;
vRect.xLeft = -1;
vRect.xRight = -1;
vRect.yTop = -1;
vRect.yBottom = -1;
wxFindMaxSize( GetHWND()
,&vRect
);
if (m_hStaticMin)
wxFindMaxSize( m_hStaticMin
,&vRect
);
if (m_hStaticMax)
wxFindMaxSize( m_hStaticMax
,&vRect
);
if (m_hStaticValue)
wxFindMaxSize( m_hStaticValue
,&vRect
);
//
// Since we now have the absolute screen coords,
// if there's a parent we must subtract its top left corner
//
POINTL vPoint;
vPoint.x = vRect.xLeft;
vPoint.y = vRect.yTop;
if (pParent)
{
SWP vSwp;
::WinQueryWindowPos((HWND)pParent->GetHWND(), &vSwp);
vPoint.x = vSwp.x;
vPoint.y = vSwp.y;
}
//
// 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 vPt(GetParent()->GetClientAreaOrigin());
vPoint.x -= vPt.x;
vPoint.y -= vPt.y;
}
*pnX = vPoint.x;
*pnY = vPoint.y;
} // end of wxSlider::GetPosition
int wxSlider::GetSelEnd() const
{
return 0;
} // end of wxSlider::GetSelEnd
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
) const
{
RECTL vRect;
vRect.xLeft = -1;
vRect.xRight = -1;
vRect.yTop = -1;
vRect.yBottom = -1;
wxFindMaxSize( GetHWND()
,&vRect
);
if (m_hStaticMin)
wxFindMaxSize( m_hStaticMin
,&vRect
);
if (m_hStaticMax)
wxFindMaxSize( m_hStaticMax
,&vRect
);
if (m_hStaticValue)
wxFindMaxSize( m_hStaticValue
,&vRect
);
*pnWidth = vRect.xRight - vRect.xLeft;
*pnHeight = vRect.yBottom - vRect.yTop;
} // end of wxSlider::GetSize
int wxSlider::GetThumbLength() const
{
return m_nThumbLength;
} // end of wxSlider::GetThumbLength
int wxSlider::GetValue() const
{
int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
double dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
int nNewPos = 0;
int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMPOSITION
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
nNewPos = (int)(nPixelPos/dPixelToRange);
if (nNewPos > (m_nRangeMax - m_nRangeMin)/2)
nNewPos++;
return nNewPos;
} // end of wxSlider::GetValue
WXHBRUSH wxSlider::OnCtlColor(
WXHDC hDC
, WXHWND hWnd
, WXUINT uCtlColor
, WXUINT uMessage
, WXWPARAM wParam
, WXLPARAM lParam
)
{
return (wxControl::OnCtlColor( hDC
,hWnd
,uCtlColor
,uMessage
,wParam
,lParam
)
);
} // end of wxSlider::OnCtlColor
bool wxSlider::OS2OnScroll(
int WXUNUSED(nOrientation)
, WXWORD wParam
, WXWORD wPos
, WXHWND hControl
)
{
wxEventType eScrollEvent = wxEVT_NULL;
switch (wParam)
{
case SLN_CHANGE:
if (m_windowStyle & wxSL_TOP)
eScrollEvent = wxEVT_SCROLL_TOP;
else if (m_windowStyle & wxSL_BOTTOM)
eScrollEvent = wxEVT_SCROLL_BOTTOM;
break;
case SLN_SLIDERTRACK:
eScrollEvent = wxEVT_SCROLL_THUMBTRACK;
break;
default:
return FALSE;
}
int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
int nNewPos = 0;
int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMPOSITION
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
nNewPos = (nPixelPos/m_dPixelToRange);
if (nNewPos > (m_nRangeMax - m_nRangeMin)/2)
nNewPos++;
if ((nNewPos < GetMin()) || (nNewPos > GetMax()))
{
//
// Out of range - but we did process it
//
return TRUE;
}
SetValue(nNewPos);
wxScrollEvent vEvent( eScrollEvent
,m_windowId
);
vEvent.SetPosition(nNewPos);
vEvent.SetEventObject(this);
GetEventHandler()->ProcessEvent(vEvent);
wxCommandEvent vCevent( wxEVT_COMMAND_SLIDER_UPDATED
,GetId()
);
vCevent.SetInt(nNewPos);
vCevent.SetEventObject(this);
return (GetEventHandler()->ProcessEvent(vCevent));
} // end of wxSlider::OS2OnScroll
void wxSlider::SetLineSize(
int nLineSize
)
{
m_nLineSize = nLineSize;
} // end of wxSlider::SetLineSize
void wxSlider::SetPageSize(
int nPageSize
)
{
m_nPageSize = nPageSize;
} // end of wxSlider::SetPageSize
void wxSlider::SetRange(
int nMinValue
, int nMaxValue
)
{
wxChar zBuf[10];
m_nRangeMin = nMinValue;
m_nRangeMax = nMaxValue;
int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
if (m_hStaticMin)
{
wxSprintf(zBuf, wxT("%d"), m_nRangeMin);
::WinSetWindowText((HWND)m_hStaticMin, zBuf);
}
if (m_hStaticMax)
{
wxSprintf(zBuf, wxT("%d"), m_nRangeMax);
::WinSetWindowText((HWND)m_hStaticMax, zBuf);
}
} // end of wxSlider::SetRange
void wxSlider::SetSelection(
int WXUNUSED(nMinPos)
, int WXUNUSED(nMaxPos)
)
{
} // end of wxSlider::SetSelection
void wxSlider::SetThumbLength(
int nLen
)
{
int nBreadth;
m_nThumbLength = SHORT1FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
) + 4; // for bordersizes
nBreadth = SHORT2FROMMR(::WinSendMsg( GetHwnd()
,SLM_QUERYSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
::WinSendMsg( GetHwnd()
,SLM_SETSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
,SMA_RANGEVALUE
)
,MPFROM2SHORT(nLen, nBreadth)
);
m_nThumbLength = nLen + 4; // Borders
} // end of wxSlider::SetThumbLength
void wxSlider::SetTick(
int nTickPos
)
{
nTickPos *= m_dPixelToRange;
::WinSendMsg( GetHwnd()
,SLM_ADDDETENT
,MPFROMSHORT(nTickPos)
,NULL
);
} // end of wxSlider::SetTick
// For trackbars only
void wxSlider::SetTickFreq(
int n
, int nPos
)
{
SLDCDATA vSlData;
WNDPARAMS vWndParams;
int nPixelPos;
int i;
vSlData.cbSize = sizeof(SLDCDATA);
if (m_windowStyle & wxSL_AUTOTICKS)
{
vSlData.usScale1Spacing = 0;
vSlData.usScale2Spacing = 0;
}
vSlData.usScale1Increments = (m_nRangeMax - m_nRangeMin)/n;
vSlData.usScale2Increments = (m_nRangeMax - m_nRangeMin)/n;
vWndParams.fsStatus = WPM_CTLDATA;
vWndParams.cchText = 0L;
vWndParams.pszText = NULL;
vWndParams.cbPresParams = 0L;
vWndParams.pPresParams = NULL;
vWndParams.cbCtlData = vSlData.cbSize;
vWndParams.pCtlData = (PVOID)&vSlData;
::WinSendMsg(GetHwnd(), WM_SETWINDOWPARAMS, (MPARAM)&vWndParams, (MPARAM)0);
for (i = 1; i < (m_nRangeMax - m_nRangeMin)/n; i++)
{
nPixelPos = i * n * m_dPixelToRange;
::WinSendMsg( GetHwnd()
,SLM_ADDDETENT
,MPFROMSHORT(nPixelPos)
,NULL
);
}
} // end of wxSlider::SetTickFreq
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
,SMA_RANGEVALUE
)
,(MPARAM)0
)
);
m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
int nNewPos = (int)(nValue * m_dPixelToRange);
::WinSendMsg( GetHwnd()
,SLM_SETSLIDERINFO
,MPFROM2SHORT( SMA_SLIDERARMPOSITION
,SMA_RANGEVALUE
)
,(MPARAM)nNewPos
);
if (m_hStaticValue)
{
wxSprintf(wxBuffer, wxT("%d"), nValue);
::WinSetWindowText((HWND)m_hStaticValue, wxBuffer);
}
} // end of wxSlider::SetValue
bool wxSlider::Show(
bool bShow
)
{
wxWindowOS2::Show(bShow);
if(m_hStaticValue)
::WinShowWindow((HWND)m_hStaticValue, bShow);
if(m_hStaticMin)
::WinShowWindow((HWND)m_hStaticMin, bShow);
if(m_hStaticMax)
::WinShowWindow((HWND)m_hStaticMax, bShow);
return TRUE;
} // end of wxSlider::Show