This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1154 lines
40 KiB
C++
1154 lines
40 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/os2/slider.cpp
|
|
// Purpose: wxSlider
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 10/15/99
|
|
// 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
|
|
|
|
#if wxUSE_SLIDER
|
|
|
|
#include "wx/slider.h"
|
|
#include "wx/os2/private.h"
|
|
|
|
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 WXUNUSED(nSizeFlags) )
|
|
{
|
|
int nXOffset = nX;
|
|
int nYOffset = nY;
|
|
int nCx; // slider,min,max sizes
|
|
int nCy;
|
|
int nCyf;
|
|
wxChar zBuf[300];
|
|
wxFont vFont = this->GetFont();
|
|
|
|
wxGetCharSize( GetHWND()
|
|
,&nCx
|
|
,&nCy
|
|
,&vFont
|
|
);
|
|
|
|
if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL)
|
|
{
|
|
if (m_windowStyle & wxSL_LABELS )
|
|
{
|
|
int nMinLen = 0;
|
|
int nMaxLen = 0;
|
|
|
|
::WinQueryWindowText((HWND)m_hStaticMin, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &vFont);
|
|
|
|
::WinQueryWindowText((HWND)m_hStaticMax, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &vFont);
|
|
|
|
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, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &vFont);
|
|
|
|
::WinQueryWindowText((HWND)m_hStaticMax, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &vFont);
|
|
|
|
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 == wxID_ANY)
|
|
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
|
|
//
|
|
wxSprintf(wxBuffer, wxT("%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 = (USHORT)m_nPageSize;
|
|
vSlData.usScale2Increments = (USHORT)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
|
|
//
|
|
wxSprintf(wxBuffer, wxT("%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().IsOk())
|
|
{
|
|
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(*wxBLACK);
|
|
|
|
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(wxT("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;
|
|
wxChar zBuf[300];
|
|
wxFont vFont = this->GetFont();
|
|
|
|
//
|
|
// Adjust for OS/2's reverse coordinate system
|
|
//
|
|
wxWindowOS2* pParent = (wxWindowOS2*)GetParent();
|
|
int nUsedHeight = 0;
|
|
int nOS2Height = nHeight;
|
|
|
|
if (nOS2Height < 0)
|
|
nOS2Height = 20;
|
|
CacheBestSize(wxSize(nWidth,nOS2Height));
|
|
|
|
if (pParent)
|
|
{
|
|
int nOS2ParentHeight = GetOS2ParentHeight(pParent);
|
|
|
|
nYOffset = nOS2ParentHeight - (nYOffset + nOS2Height);
|
|
if (nY != wxDefaultCoord)
|
|
nY1 = nOS2ParentHeight - (nY1 + nOS2Height);
|
|
}
|
|
else
|
|
{
|
|
RECTL vRect;
|
|
|
|
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
|
|
nYOffset = vRect.yTop - (nYOffset + nOS2Height);
|
|
if (nY != wxDefaultCoord)
|
|
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
|
|
,&vFont
|
|
);
|
|
|
|
if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL)
|
|
{
|
|
if (m_windowStyle & wxSL_LABELS )
|
|
{
|
|
int nMinLen = 0;
|
|
int nMaxLen = 0;
|
|
|
|
::WinQueryWindowText((HWND)m_hStaticMin, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &vFont);
|
|
::WinQueryWindowText((HWND)m_hStaticMax, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &vFont);
|
|
|
|
if (m_hStaticValue)
|
|
{
|
|
int nNewWidth = (wxMax(nMinLen, nMaxLen));
|
|
int nValueHeight = nCyf;
|
|
|
|
::WinSetWindowPos( (HWND)m_hStaticValue
|
|
,HWND_TOP
|
|
,(LONG)nXOffset
|
|
,(LONG)nYOffset - (LONG)(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 - (LONG)(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 - (LONG)(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, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &vFont);
|
|
::WinQueryWindowText((HWND)m_hStaticMax, 300, (PSZ)zBuf);
|
|
GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &vFont);
|
|
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;
|
|
}
|
|
if (pnX)
|
|
*pnX = vPoint.x;
|
|
if (pnY)
|
|
*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
|
|
);
|
|
if (pnWidth)
|
|
*pnWidth = vRect.xRight - vRect.xLeft;
|
|
if (pnHeight)
|
|
*pnHeight = vRect.yTop - vRect.yBottom;
|
|
} // 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 nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
|
|
,SLM_QUERYSLIDERINFO
|
|
,MPFROM2SHORT( SMA_SLIDERARMPOSITION
|
|
,SMA_RANGEVALUE
|
|
)
|
|
,(MPARAM)0
|
|
)
|
|
);
|
|
int 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 WXUNUSED(wPos),
|
|
WXHWND WXUNUSED(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 = (int)(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);
|
|
HandleWindowEvent(vEvent);
|
|
|
|
wxCommandEvent vCevent( wxEVT_SLIDER, GetId() );
|
|
|
|
vCevent.SetInt(nNewPos);
|
|
vCevent.SetEventObject(this);
|
|
return (HandleWindowEvent(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, (PSZ)zBuf);
|
|
}
|
|
|
|
if (m_hStaticMax)
|
|
{
|
|
wxSprintf(zBuf, wxT("%d"), m_nRangeMax);
|
|
::WinSetWindowText((HWND)m_hStaticMax, (PSZ)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 = (int)(nTickPos * m_dPixelToRange);
|
|
::WinSendMsg( GetHwnd()
|
|
,SLM_ADDDETENT
|
|
,MPFROMSHORT(nTickPos)
|
|
,NULL
|
|
);
|
|
} // end of wxSlider::SetTick
|
|
|
|
// For trackbars only
|
|
void wxSlider::DoSetTickFreq( int n )
|
|
{
|
|
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 = (USHORT)((m_nRangeMax - m_nRangeMin)/n);
|
|
vSlData.usScale2Increments = (USHORT)((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 = (int)(i * n * m_dPixelToRange);
|
|
::WinSendMsg( GetHwnd()
|
|
,SLM_ADDDETENT
|
|
,MPFROMSHORT(nPixelPos)
|
|
,NULL
|
|
);
|
|
}
|
|
} // end of wxSlider::SetTickFreq
|
|
|
|
void wxSlider::SetValue(
|
|
int nValue
|
|
)
|
|
{
|
|
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, (PSZ)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
|
|
|
|
#endif // wxUSE_SLIDER
|