1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxSpinButton 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13     #pragma implementation "spinbutt.h" 
  14     #pragma implementation "spinbutbase.h" 
  17 // For compilers that support precompilation, includes "wx.h". 
  18 #include "wx/wxprec.h" 
  26 // Can't resolve reference to CreateUpDownControl in 
  27 // TWIN32, but could probably use normal CreateWindow instead. 
  30 #include "wx/spinbutt.h" 
  32 extern void  wxAssociateWinWithHandle( HWND         hWnd
 
  35 static WXFARPROC fnWndProcSpinCtrl 
= (WXFARPROC
)NULL
; 
  37 IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent
, wxNotifyEvent
) 
  39 #include "wx/os2/private.h" 
  41 // ============================================================================ 
  43 // ============================================================================ 
  45 // ---------------------------------------------------------------------------- 
  47 // ---------------------------------------------------------------------------- 
  49 IMPLEMENT_DYNAMIC_CLASS(wxSpinButton
, wxControl
) 
  51 bool wxSpinButton::Create( 
  57 , const wxString
&                   rsName
 
  63     int                             nHeight 
= rSize
.y
; 
  69         m_windowId 
= NewControlId(); 
  72     m_backgroundColour 
= pParent
->GetBackgroundColour(); 
  73     m_foregroundColour 
= pParent
->GetForegroundColour(); 
  76     m_windowStyle      
= lStyle
; 
  79     // Get the right size for the control 
  81     if (nWidth 
<= 0 || nHeight 
<= 0 ) 
  83         wxSize                      vSize 
= DoGetBestSize(); 
  97     lSstyle 
= WS_VISIBLE      
| 
  99               SPBS_MASTER     
| // We use only single field spin buttons 
 100               SPBS_NUMERICONLY
; // We default to numeric data 
 102     if (m_windowStyle 
& wxCLIP_SIBLINGS 
) 
 103         lSstyle 
|= WS_CLIPSIBLINGS
; 
 105     m_hWnd 
= (WXHWND
)::WinCreateWindow( GetWinHwnd(pParent
) 
 120     SetRange(m_min
, m_max
); 
 122         pParent
->AddChild((wxSpinButton 
*)this); 
 124     ::WinQueryWindowPos(m_hWnd
, &vSwp
); 
 127     wxFont
*                          pTextFont 
= new wxFont( 10 
 134     // For OS/2 we want to hide the text portion so we can substitute an 
 135     // independent text ctrl in its place.  10 device units does this 
 142     wxAssociateWinWithHandle( m_hWnd
 
 147     // Apparently, this does not work, as it crashes in setvalue/setrange calls 
 148     // What's it supposed to do anyway? 
 149     ::WinSetWindowULong(GetHwnd(), QWL_USER
, (LONG
)this); 
 150     fnWndProcSpinCtrl 
= (WXFARPROC
)::WinSubclassWindow(m_hWnd
, (PFNWP
)wxSpinCtrlWndProc
); 
 154 } // end of wxSpinButton::Create 
 156 wxSpinButton::~wxSpinButton() 
 158 } // end of wxSpinButton::~wxSpinButton 
 160 // ---------------------------------------------------------------------------- 
 162 // ---------------------------------------------------------------------------- 
 164 wxSize 
wxSpinButton::DoGetBestSize() const 
 167     // OS/2 PM does not really have system metrics so we'll just set  it to 
 168     // 24x20 which is the size of the buttons and the borders. 
 169     // Also we have no horizontal spin buttons. 
 171     return (wxSize(24,20)); 
 172 } // end of wxSpinButton::DoGetBestSize 
 174 // ---------------------------------------------------------------------------- 
 176 // ---------------------------------------------------------------------------- 
 178 int wxSpinButton::GetValue() const 
 183     ::WinSendMsg( GetHwnd() 
 186                  ,MPFROM2SHORT( (USHORT
)10 
 192 } // end of wxSpinButton::GetValue 
 194 bool wxSpinButton::OS2OnScroll( 
 201     wxCHECK_MSG(hControl
, FALSE
, wxT("scrolling what?") ) 
 203     wxSpinEvent                     
vEvent( wxEVT_SCROLL_THUMBTRACK
 
 206     int                             nVal 
= (int)wPos
;    // cast is important for negative values! 
 208     vEvent
.SetPosition(nVal
); 
 209     vEvent
.SetEventObject(this); 
 210     return(GetEventHandler()->ProcessEvent(vEvent
)); 
 211 } // end of wxSpinButton::OS2OnScroll 
 213 bool wxSpinButton::OS2Command( 
 219 } // end of wxSpinButton::OS2Command 
 221 void wxSpinButton::SetRange( 
 229     ::WinSendMsg( GetHwnd() 
 234 } // end of wxSpinButton::SetRange 
 236 void wxSpinButton::SetValue( 
 240     ::WinSendMsg(GetHwnd(), SPBM_SETCURRENTVALUE
, MPFROMLONG(nValue
), MPARAM(0)); 
 241 } // end of wxSpinButton::SetValue 
 243 #endif //wxUSE_SPINBTN