937013e0fd
2. use HandleWindowEvent() everywhere as more obvious and convenient shortcut for GetEventHandler()->ProcessEvent(); also for consistency with wxGTK where it's required git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50329 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
229 lines
6.8 KiB
C++
229 lines
6.8 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: spinbutt.cpp
|
|
// Purpose: wxSpinButton
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 10/15/99
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) David Webster
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
#if wxUSE_SPINBTN
|
|
|
|
// Can't resolve reference to CreateUpDownControl in
|
|
// TWIN32, but could probably use normal CreateWindow instead.
|
|
|
|
|
|
#include "wx/spinbutt.h"
|
|
|
|
extern void wxAssociateWinWithHandle( HWND hWnd
|
|
,wxWindowOS2* pWin
|
|
);
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent, wxNotifyEvent)
|
|
|
|
#include "wx/os2/private.h"
|
|
|
|
// ============================================================================
|
|
// implementation
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxWin macros
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
|
|
|
|
bool wxSpinButton::Create(
|
|
wxWindow* pParent
|
|
, wxWindowID vId
|
|
, const wxPoint& rPos
|
|
, const wxSize& rSize
|
|
, long lStyle
|
|
, const wxString& rsName
|
|
)
|
|
{
|
|
int nX = rPos.x;
|
|
int nY = rPos.y;
|
|
int nWidth = rSize.x;
|
|
int nHeight = rSize.y;
|
|
SWP vSwp;
|
|
|
|
m_min = 0;
|
|
m_max = 100;
|
|
if (vId == -1)
|
|
m_windowId = NewControlId();
|
|
else
|
|
m_windowId = vId;
|
|
m_backgroundColour = pParent->GetBackgroundColour();
|
|
m_foregroundColour = pParent->GetForegroundColour();
|
|
SetName(rsName);
|
|
SetParent(pParent);
|
|
m_windowStyle = lStyle;
|
|
|
|
//
|
|
// Get the right size for the control
|
|
//
|
|
if (nWidth <= 0 || nHeight <= 0 )
|
|
{
|
|
wxSize vSize = DoGetBestSize();
|
|
|
|
if (nWidth <= 0 )
|
|
nWidth = vSize.x;
|
|
if (nHeight <= 0 )
|
|
nHeight = vSize.y;
|
|
}
|
|
if (nX < 0 )
|
|
nX = 0;
|
|
if (nY < 0 )
|
|
nY = 0;
|
|
|
|
long lSstyle = 0L;
|
|
|
|
lSstyle = WS_VISIBLE |
|
|
WS_TABSTOP |
|
|
SPBS_MASTER | // We use only single field spin buttons
|
|
SPBS_NUMERICONLY; // We default to numeric data
|
|
|
|
if (m_windowStyle & wxCLIP_SIBLINGS )
|
|
lSstyle |= WS_CLIPSIBLINGS;
|
|
|
|
m_hWnd = (WXHWND)::WinCreateWindow( GetWinHwnd(pParent)
|
|
,WC_SPINBUTTON
|
|
,(PSZ)NULL
|
|
,lSstyle
|
|
,0L, 0L, 0L, 0L
|
|
,GetWinHwnd(pParent)
|
|
,HWND_TOP
|
|
,(HMENU)vId
|
|
,NULL
|
|
,NULL
|
|
);
|
|
if (m_hWnd == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
SetRange(m_min, m_max);
|
|
if(pParent)
|
|
pParent->AddChild((wxSpinButton *)this);
|
|
|
|
::WinQueryWindowPos(m_hWnd, &vSwp);
|
|
SetXComp(vSwp.x);
|
|
SetYComp(vSwp.y-5); // compensate for the associated TextControl border
|
|
|
|
SetFont(*wxSMALL_FONT);
|
|
//
|
|
// For OS/2 we want to hide the text portion so we can substitute an
|
|
// independent text ctrl in its place.
|
|
// Therefore we must override any user given width with our best guess.
|
|
//
|
|
SetSize( nX - GetXComp()
|
|
,nY - GetYComp()
|
|
,nWidth
|
|
,nHeight
|
|
);
|
|
wxAssociateWinWithHandle( m_hWnd
|
|
,(wxWindowOS2*)this
|
|
);
|
|
#if 0
|
|
// FIXME:
|
|
// Apparently, this does not work, as it crashes in setvalue/setrange calls
|
|
// What's it supposed to do anyway?
|
|
::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
|
|
fnWndProcSpinCtrl = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxSpinCtrlWndProc);
|
|
#endif
|
|
return TRUE;
|
|
} // end of wxSpinButton::Create
|
|
|
|
wxSpinButton::~wxSpinButton()
|
|
{
|
|
} // end of wxSpinButton::~wxSpinButton
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// size calculation
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxSize wxSpinButton::DoGetBestSize() const
|
|
{
|
|
//
|
|
// OS/2 PM does not really have system metrics so we'll just set it to
|
|
// a square based on its height.
|
|
//
|
|
RECTL vRect;
|
|
::WinQueryWindowRect(GetHwnd(),&vRect);
|
|
return wxSize(vRect.yTop,vRect.yTop);
|
|
} // end of wxSpinButton::DoGetBestSize
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Attributes
|
|
// ----------------------------------------------------------------------------
|
|
|
|
int wxSpinButton::GetValue() const
|
|
{
|
|
long lVal = 0L;
|
|
char zVal[10];
|
|
|
|
::WinSendMsg( GetHwnd()
|
|
,SPBM_QUERYVALUE
|
|
,MPFROMP(zVal)
|
|
,MPFROM2SHORT( (USHORT)10
|
|
,SPBQ_UPDATEIFVALID
|
|
)
|
|
);
|
|
lVal = atol(zVal);
|
|
return ((int)lVal);
|
|
} // end of wxSpinButton::GetValue
|
|
|
|
bool wxSpinButton::OS2OnScroll( int WXUNUSED(nOrientation),
|
|
WXWORD WXUNUSED(wParam),
|
|
WXWORD wPos,
|
|
WXHWND hControl )
|
|
{
|
|
wxCHECK_MSG(hControl, false, wxT("scrolling what?") );
|
|
|
|
wxSpinEvent vEvent( wxEVT_SCROLL_THUMBTRACK, m_windowId );
|
|
int nVal = (int)wPos; // cast is important for negative values!
|
|
|
|
vEvent.SetPosition(nVal);
|
|
vEvent.SetEventObject(this);
|
|
return(HandleWindowEvent(vEvent));
|
|
} // end of wxSpinButton::OS2OnScroll
|
|
|
|
bool wxSpinButton::OS2Command( WXUINT WXUNUSED(uCmd),
|
|
WXWORD WXUNUSED(wId) )
|
|
{
|
|
return false;
|
|
} // end of wxSpinButton::OS2Command
|
|
|
|
void wxSpinButton::SetRange(
|
|
int nMinVal
|
|
, int nMaxVal
|
|
)
|
|
{
|
|
m_min = nMinVal;
|
|
m_max = nMaxVal;
|
|
|
|
::WinSendMsg( GetHwnd()
|
|
,SPBM_SETLIMITS
|
|
,MPFROMLONG(nMaxVal)
|
|
,MPFROMLONG(nMinVal)
|
|
);
|
|
} // end of wxSpinButton::SetRange
|
|
|
|
void wxSpinButton::SetValue(
|
|
int nValue
|
|
)
|
|
{
|
|
::WinSendMsg(GetHwnd(), SPBM_SETCURRENTVALUE, MPFROMLONG(nValue), MPARAM(0));
|
|
} // end of wxSpinButton::SetValue
|
|
|
|
#endif //wxUSE_SPINBTN
|