1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/slider.cpp 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  23 #include "wx/scrolwin.h" 
  28 #include "wx/slider.h" 
  29 #include "wx/os2/private.h" 
  31 IMPLEMENT_DYNAMIC_CLASS(wxSlider
, wxControl
) 
  43 } // end of wxSlider::wxSlider 
  48         ::WinDestroyWindow((HWND
)m_hStaticMin
); 
  50         ::WinDestroyWindow((HWND
)m_hStaticMax
); 
  52         ::WinDestroyWindow((HWND
)m_hStaticValue
); 
  53 } // end of wxSlider::~wxSlider 
  55 void wxSlider::AdjustSubControls( int nX
, 
  59                                   int WXUNUSED(nSizeFlags
) ) 
  63     int                             nCx
;     // slider,min,max sizes 
  67     wxFont                          vFont 
= this->GetFont(); 
  69     wxGetCharSize( GetHWND() 
  75     if ((m_windowStyle 
& wxSL_VERTICAL
) != wxSL_VERTICAL
) 
  77         if (m_windowStyle 
& wxSL_LABELS 
) 
  82             ::WinQueryWindowText((HWND
)m_hStaticMin
, 300, (PSZ
)zBuf
); 
  83             GetTextExtent(zBuf
, &nMinLen
, &nCyf
, NULL
, NULL
, &vFont
); 
  85             ::WinQueryWindowText((HWND
)m_hStaticMax
, 300, (PSZ
)zBuf
); 
  86             GetTextExtent(zBuf
, &nMaxLen
, &nCyf
, NULL
, NULL
, &vFont
); 
  90                 int                 nNewWidth 
= wxMax(nMinLen
, nMaxLen
); 
  91                 int                 nValueHeight 
= nCyf
; 
  93                 ::WinSetWindowPos( (HWND
)m_hStaticValue
 
  95                                   ,(LONG
)nXOffset 
- (nNewWidth 
+ nCx 
+ nMinLen 
+ nCx
) 
 102             ::WinSetWindowPos( (HWND
)m_hStaticMin
 
 104                               ,(LONG
)nXOffset 
- (nMinLen 
+ nCx
) 
 110             nXOffset 
+= nWidth 
+ nCx
; 
 112             ::WinSetWindowPos( (HWND
)m_hStaticMax
 
 118                               ,SWP_ZORDER 
| SWP_SHOW
 
 125         // Now deal with a vertical slider 
 128         if (m_windowStyle 
& wxSL_LABELS 
) 
 133             ::WinQueryWindowText((HWND
)m_hStaticMin
, 300, (PSZ
)zBuf
); 
 134             GetTextExtent(zBuf
, &nMinLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 136             ::WinQueryWindowText((HWND
)m_hStaticMax
, 300, (PSZ
)zBuf
); 
 137             GetTextExtent(zBuf
, &nMaxLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 141                 int                 nNewWidth 
= (wxMax(nMinLen
, nMaxLen
)); 
 143                 ::WinSetWindowPos( (HWND
)m_hStaticValue
 
 146                                   ,(LONG
)nYOffset 
+ nHeight 
+ nCyf
 
 152             ::WinSetWindowPos( (HWND
)m_hStaticMax
 
 155                               ,(LONG
)nYOffset 
+ nHeight
 
 160             ::WinSetWindowPos( (HWND
)m_hStaticMin
 
 163                               ,(LONG
)nYOffset 
- nCyf
 
 170 } // end of wxSlider::AdjustSubControls 
 172 void wxSlider::ClearSel() 
 174 } // end of wxSlider::ClearSel 
 176 void wxSlider::ClearTicks() 
 178 } // end of wxSlider::ClearTicks 
 180 void wxSlider::Command ( 
 181   wxCommandEvent
&                   rEvent
 
 184     SetValue(rEvent
.GetInt()); 
 185     ProcessCommand(rEvent
); 
 186 } // end of wxSlider::Command 
 188 bool wxSlider::ContainsHWND( 
 192     return ( hWnd 
== GetStaticMin() || 
 193              hWnd 
== GetStaticMax() || 
 194              hWnd 
== GetEditValue() 
 196 } // end of wxSlider::ContainsHWND 
 198 bool wxSlider::Create( 
 204 , const wxPoint
&                    rPos
 
 205 , const wxSize
&                     rSize
 
 207 , const wxValidator
&                rValidator
 
 208 , const wxString
&                   rsName
 
 213     int                             nWidth   
= rSize
.x
; 
 214     int                             nHeight  
= rSize
.y
; 
 220     SetValidator(rValidator
); 
 223         pParent
->AddChild(this); 
 224     SetBackgroundColour(pParent
->GetBackgroundColour()) ; 
 225     SetForegroundColour(pParent
->GetForegroundColour()) ; 
 232     m_windowStyle  
= lStyle
; 
 236         m_windowId 
= (int)NewControlId(); 
 240     if (m_windowStyle 
& wxCLIP_SIBLINGS 
) 
 241         lMsStyle 
|= WS_CLIPSIBLINGS
; 
 243     if (m_windowStyle 
& wxSL_LABELS
) 
 245         lMsStyle 
|= WS_VISIBLE 
| SS_TEXT 
| DT_VCENTER
; 
 247         m_hStaticValue 
= (WXHWND
)::WinCreateWindow( (HWND
)GetHwndOf(pParent
) // Parent window handle 
 248                                                    ,WC_STATIC                
// Window class 
 249                                                    ,(PSZ
)NULL                
// Initial Text 
 250                                                    ,(ULONG
)lMsStyle          
// Style flags 
 251                                                    ,0L, 0L, 0L, 0L           // Origin -- 0 size 
 252                                                    ,(HWND
)GetHwndOf(pParent
) // owner window handle (same as parent 
 253                                                    ,HWND_TOP                 
// initial z position 
 254                                                    ,(ULONG
)NewControlId()    // Window identifier 
 255                                                    ,NULL                     
// no control data 
 256                                                    ,NULL                     
// no Presentation parameters 
 260         // Now create min static control 
 262         wxSprintf(wxBuffer
, wxT("%d"), nMinValue
); 
 263         lWstyle 
= SS_TEXT
|DT_LEFT
|WS_VISIBLE
; 
 264         if (m_windowStyle 
& wxCLIP_SIBLINGS
) 
 265             lWstyle 
|= WS_CLIPSIBLINGS
; 
 267         m_hStaticMin 
= (WXHWND
)::WinCreateWindow( (HWND
)GetHwndOf(pParent
) // Parent window handle 
 268                                                  ,WC_STATIC                
// Window class 
 269                                                  ,(PSZ
)wxBuffer            
// Initial Text 
 270                                                  ,(ULONG
)lWstyle           
// Style flags 
 271                                                  ,0L, 0L, 0L, 0L           // Origin -- 0 size 
 272                                                  ,(HWND
)GetHwndOf(pParent
) // owner window handle (same as parent 
 273                                                  ,HWND_TOP                 
// initial z position 
 274                                                  ,(ULONG
)NewControlId()    // Window identifier 
 275                                                  ,NULL                     
// no control data 
 276                                                  ,NULL                     
// no Presentation parameters 
 283     vSlData
.cbSize 
= sizeof(SLDCDATA
); 
 284     if (m_windowStyle 
& wxSL_VERTICAL
) 
 285         lMsStyle 
= SLS_VERTICAL 
| SLS_HOMEBOTTOM 
| WS_VISIBLE 
| WS_TABSTOP
; 
 287         lMsStyle 
= SLS_HORIZONTAL 
| SLS_HOMELEFT 
| WS_VISIBLE 
| WS_TABSTOP
; 
 289     if (m_windowStyle 
& wxCLIP_SIBLINGS
) 
 290         lMsStyle 
|= WS_CLIPSIBLINGS
; 
 292     if (m_windowStyle 
& wxSL_AUTOTICKS
) 
 294         vSlData
.usScale1Spacing 
= 0; 
 295         vSlData
.usScale2Spacing 
= 0; 
 298     if (m_windowStyle 
& wxSL_LEFT
) 
 299         lMsStyle 
|= SLS_PRIMARYSCALE2
; // if SLS_VERTICAL then SCALE2 is to the left 
 300     else if (m_windowStyle 
& wxSL_RIGHT
) 
 301         lMsStyle 
|= SLS_PRIMARYSCALE1
; // if SLS_VERTICAL then SCALE2 is to the right 
 302     else if (m_windowStyle 
& wxSL_TOP
) 
 303         lMsStyle 
|= SLS_PRIMARYSCALE1
; // if SLS_HORIZONTAL then SCALE1 is to the top 
 304     else if (m_windowStyle 
& wxSL_BOTTOM 
) 
 305         lMsStyle 
|= SLS_PRIMARYSCALE2
; // if SLS_HORIZONTAL then SCALE1 is to the bottom 
 306     else if ( m_windowStyle 
& wxSL_BOTH 
) 
 307         lMsStyle 
|= SLS_PRIMARYSCALE1 
| SLS_PRIMARYSCALE2
; 
 309         lMsStyle 
|= SLS_PRIMARYSCALE2
; 
 310     lMsStyle 
|= SLS_RIBBONSTRIP
; 
 312     m_nPageSize 
= ((nMaxValue 
- nMinValue
)/10); 
 313     vSlData
.usScale1Increments 
= (USHORT
)m_nPageSize
; 
 314     vSlData
.usScale2Increments 
= (USHORT
)m_nPageSize
; 
 316     HWND hScrollBar 
= ::WinCreateWindow( (HWND
)GetHwndOf(pParent
) // Parent window handle 
 317                                         ,WC_SLIDER                
// Window class 
 318                                         ,(PSZ
)wxBuffer            
// Initial Text 
 319                                         ,(ULONG
)lMsStyle          
// Style flags 
 320                                         ,0L, 0L, 0L, 0L           // Origin -- 0 size 
 321                                         ,(HWND
)GetHwndOf(pParent
) // owner window handle (same as parent 
 322                                         ,HWND_BOTTOM                 
// initial z position 
 323                                         ,(HMENU
)m_windowId       
// Window identifier 
 324                                         ,&vSlData                 
// Slider control data 
 325                                         ,NULL                     
// no Presentation parameters 
 327     m_nRangeMax 
= nMaxValue
; 
 328     m_nRangeMin 
= nMinValue
; 
 331     // Set the size of the ticks ... default to 6 pixels 
 333     ::WinSendMsg( hScrollBar
 
 335                  ,MPFROM2SHORT(SMA_SETALLTICKS
, (USHORT
)12) 
 339     // Set the position to the initial value 
 341     ::WinSendMsg( hScrollBar
 
 343                  ,MPFROM2SHORT(SMA_SLIDERARMPOSITION
, SMA_RANGEVALUE
) 
 347     m_hWnd 
= (WXHWND
)hScrollBar
; 
 348     SubclassWin(GetHWND()); 
 349     ::WinSetWindowText((HWND
)m_hWnd
, ""); 
 351     SetFont(*wxSMALL_FONT
); 
 352     if (m_windowStyle 
& wxSL_LABELS
) 
 355         // Finally, create max value static item 
 357         wxSprintf(wxBuffer
, wxT("%d"), nMaxValue
); 
 358         lWstyle 
= SS_TEXT
|DT_LEFT
|WS_VISIBLE
; 
 359         if (m_windowStyle 
& wxCLIP_SIBLINGS
) 
 360             lMsStyle 
|= WS_CLIPSIBLINGS
; 
 362         m_hStaticMax 
= (WXHWND
)::WinCreateWindow( (HWND
)GetHwndOf(pParent
) // Parent window handle 
 363                                                  ,WC_STATIC                
// Window class 
 364                                                  ,(PSZ
)wxBuffer            
// Initial Text 
 365                                                  ,(ULONG
)lWstyle           
// Style flags 
 366                                                  ,0L, 0L, 0L, 0L           // Origin -- 0 size 
 367                                                  ,(HWND
)GetHwndOf(pParent
) // owner window handle (same as parent 
 368                                                  ,HWND_TOP                 
// initial z position 
 369                                                  ,(ULONG
)NewControlId()    // Window identifier 
 370                                                  ,NULL                     
// no control data 
 371                                                  ,NULL                     
// no Presentation parameters 
 375             if (GetFont().GetResourceHandle()) 
 378                     wxOS2SetFont( m_hStaticMin
 
 382                     wxOS2SetFont( m_hStaticMax
 
 386                     wxOS2SetFont( m_hStaticValue
 
 400     m_nThumbLength 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
 402                                                ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
 
 407                                  ) + 4; // for bordersizes 
 411     vColour
.Set(wxString(wxT("BLACK"))); 
 413     LONG                            lColor 
= (LONG
)vColour
.GetPixel(); 
 415     ::WinSetPresParam( m_hStaticMin
 
 420     ::WinSetPresParam( m_hStaticMax
 
 425     ::WinSetPresParam( m_hStaticValue
 
 430     ::WinSetPresParam( m_hWnd
 
 435     lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
 436     ::WinSetPresParam( m_hStaticMin
 
 441     ::WinSetPresParam( m_hStaticMax
 
 446     ::WinSetPresParam( m_hStaticValue
 
 451     ::WinSetPresParam( m_hWnd
 
 456     vColour
.Set(wxString(wxT("BLUE"))); 
 457     lColor 
= (LONG
)vColour
.GetPixel(); 
 458     ::WinSetPresParam( m_hWnd
 
 459                       ,PP_HILITEBACKGROUNDCOLOR
 
 465 } // end of wxSlider::Create 
 467 void wxSlider::DoSetSize( 
 477     int                             nWidth1  
= nWidth
; 
 478     int                             nHeight1 
= nHeight
; 
 481     int                             nCx
;     // slider,min,max sizes 
 487     wxFont                          vFont 
= this->GetFont(); 
 490     // Adjust for OS/2's reverse coordinate system 
 492     wxWindowOS2
*                    pParent 
= (wxWindowOS2
*)GetParent(); 
 494     int                             nOS2Height 
= nHeight
; 
 498     CacheBestSize(wxSize(nWidth
,nOS2Height
)); 
 502         int                         nOS2ParentHeight 
= GetOS2ParentHeight(pParent
); 
 504         nYOffset 
= nOS2ParentHeight 
- (nYOffset 
+ nOS2Height
); 
 506             nY1 
= nOS2ParentHeight 
- (nY1 
+ nOS2Height
); 
 512         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
 513         nYOffset 
= vRect
.yTop 
- (nYOffset 
+ nOS2Height
); 
 515             nY1 
= vRect
.yTop 
- (nY1 
+ nOS2Height
); 
 517     m_nSizeFlags 
= nSizeFlags
; 
 519     GetPosition( &nCurrentX
 
 522     if (nX 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
 524     if (nY 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
 527     AdjustForParentClientOrigin( nX1
 
 531     wxGetCharSize( GetHWND() 
 537     if ((m_windowStyle 
& wxSL_VERTICAL
) != wxSL_VERTICAL
) 
 539         if (m_windowStyle 
& wxSL_LABELS 
) 
 544             ::WinQueryWindowText((HWND
)m_hStaticMin
, 300, (PSZ
)zBuf
); 
 545             GetTextExtent(zBuf
, &nMinLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 546             ::WinQueryWindowText((HWND
)m_hStaticMax
, 300, (PSZ
)zBuf
); 
 547             GetTextExtent(zBuf
, &nMaxLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 551                 int              nNewWidth 
= (wxMax(nMinLen
, nMaxLen
)); 
 552                 int              nValueHeight 
= nCyf
; 
 554                 ::WinSetWindowPos( (HWND
)m_hStaticValue
 
 557                                   ,(LONG
)nYOffset 
- (LONG
)(nCyf 
* 1.2) 
 560                                   ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 562                 nXOffset 
+= nNewWidth 
+ nCx
; 
 564             ::WinSetWindowPos( (HWND
)m_hStaticMin
 
 567                               ,(LONG
)nYOffset 
- (LONG
)(nCyf 
* 1.2) 
 570                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 572             nXOffset 
+= nMinLen 
+ nCx
; 
 574             int                  nSliderLength 
= nWidth1 
- nXOffset 
- nMaxLen 
- nCx
; 
 575             int                  nSliderHeight 
= nHeight1
; 
 577             if (nSliderHeight 
< 0) 
 581             // Slider must have a minimum/default length/height 
 583             if (nSliderLength 
< 100) 
 586             ::WinSetWindowPos( GetHwnd() 
 592                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 594             ::WinQueryWindowPos(GetHwnd(), GetSwp()); 
 595             ::WinSendMsg( GetHwnd() 
 597                          ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
 
 600                          ,MPFROMLONG((ULONG
)(nSliderHeight
/2)) 
 602             nXOffset 
+= nSliderLength 
+ nCx
; 
 604             ::WinSetWindowPos( (HWND
)m_hStaticMax
 
 607                               ,(LONG
)nYOffset 
- (LONG
)(nCyf 
* 1.2) 
 610                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 617             // If we're prepared to use the existing size, then... 
 619             if (nWidth 
== -1 && nHeight 
== -1 && 
 620                 ((nSizeFlags 
& wxSIZE_AUTO
) != wxSIZE_AUTO
)) 
 630             ::WinSetWindowPos( GetHwnd() 
 636                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 642     // Now deal with a vertical slider 
 646         if (m_windowStyle 
& wxSL_LABELS 
) 
 651             ::WinQueryWindowText((HWND
)m_hStaticMin
, 300, (PSZ
)zBuf
); 
 652             GetTextExtent(zBuf
, &nMinLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 653             ::WinQueryWindowText((HWND
)m_hStaticMax
, 300, (PSZ
)zBuf
); 
 654             GetTextExtent(zBuf
, &nMaxLen
, &nCyf
, NULL
, NULL
, &vFont
); 
 657                 int              nNewWidth 
= wxMax(nMinLen
, nMaxLen
); 
 658                 int              nValueHeight 
= nCyf
; 
 660                 ::WinSetWindowPos( (HWND
)m_hStaticValue
 
 663                                   ,(LONG
)nYOffset 
+ nHeight
 
 666                                   ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 670             ::WinSetWindowPos( (HWND
)m_hStaticMin
 
 673                               ,(LONG
)nYOffset 
+ nHeight 
- nCyf
 
 676                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 680             int                  nSliderLength 
= nHeight1 
- (nUsedHeight 
+ (2 * nCy
)); 
 681             int                  nSliderWidth  
= nWidth1
; 
 683             if (nSliderWidth 
< 0) 
 687             // Slider must have a minimum/default length 
 689             if (nSliderLength 
< 100) 
 692             ::WinSetWindowPos( GetHwnd() 
 695                               ,(LONG
)nYOffset 
+ nCyf
 
 698                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 700             ::WinQueryWindowPos(GetHwnd(), GetSwp()); 
 701             ::WinSendMsg( GetHwnd() 
 703                          ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
 
 706                          ,MPFROMLONG((ULONG
)(nSliderWidth
/2)) 
 708             nUsedHeight 
+= nSliderLength
; 
 709             ::WinSetWindowPos( (HWND
)m_hStaticMax
 
 712                               ,(LONG
)nYOffset 
- nCyf
 
 715                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 722             // If we're prepared to use the existing size, then... 
 724             if (nWidth 
== -1 && nHeight 
== -1 && 
 725                 ((nSizeFlags 
& wxSIZE_AUTO
) != wxSIZE_AUTO
)) 
 735             ::WinSetWindowPos( GetHwnd() 
 741                               ,SWP_ZORDER 
| SWP_SIZE 
| SWP_MOVE 
| SWP_SHOW
 
 745 } // end of void wxSlider::DoSetSize 
 747 int wxSlider::GetLineSize() const 
 750 } // end of wxSlider::GetLineSize 
 752 int wxSlider::GetPageSize() const 
 755 } // end of wxSlider::GetPageSize 
 757 void wxSlider::GetPosition( 
 762     wxWindowOS2
*                    pParent 
= GetParent(); 
 769     wxFindMaxSize( GetHWND() 
 774         wxFindMaxSize( m_hStaticMin
 
 778         wxFindMaxSize( m_hStaticMax
 
 782         wxFindMaxSize( m_hStaticValue
 
 787     // Since we now have the absolute screen coords, 
 788     // if there's a parent we must subtract its top left corner 
 792     vPoint
.x 
= vRect
.xLeft
; 
 793     vPoint
.y 
= vRect
.yTop
; 
 799         ::WinQueryWindowPos((HWND
)pParent
->GetHWND(), &vSwp
); 
 805     // We may be faking the client origin. 
 806     // So a window that's really at (0, 30) may appear 
 807     // (to wxWin apps) to be at (0, 0). 
 811         wxPoint                     
vPt(GetParent()->GetClientAreaOrigin()); 
 820 } // end of wxSlider::GetPosition 
 822 int wxSlider::GetSelEnd() const 
 825 } // end of wxSlider::GetSelEnd 
 827 int wxSlider::GetSelStart() const 
 830 } // end of wxSlider::GetSelStart 
 832 void wxSlider::DoGetSize( 
 840 } // end of wxSlider::DoGetSize 
 842 void wxSlider::GetSize( 
 854     wxFindMaxSize( GetHWND() 
 859         wxFindMaxSize( m_hStaticMin
 
 863         wxFindMaxSize( m_hStaticMax
 
 867         wxFindMaxSize( m_hStaticValue
 
 871         *pnWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
 873         *pnHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
 874 } // end of wxSlider::GetSize 
 876 int wxSlider::GetThumbLength() const 
 878     return m_nThumbLength
; 
 879 } // end of wxSlider::GetThumbLength 
 881 int wxSlider::GetValue() const 
 883     int                             nPixelRange 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
 885                                                                             ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
 
 891     double                          dPixelToRange 
= (double)(nPixelRange 
- m_nThumbLength
)/(double)(m_nRangeMax 
- m_nRangeMin
); 
 893     int                             nPixelPos 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
 895                                                                           ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
 
 901     nNewPos 
= (int)(nPixelPos
/dPixelToRange
); 
 902     if (nNewPos 
> (m_nRangeMax 
- m_nRangeMin
)/2) 
 905 } // end of wxSlider::GetValue 
 907 WXHBRUSH 
wxSlider::OnCtlColor( 
 916     return (wxControl::OnCtlColor( hDC
 
 924 } // end of wxSlider::OnCtlColor 
 926 bool wxSlider::OS2OnScroll( int    WXUNUSED(nOrientation
), 
 928                             WXWORD 
WXUNUSED(wPos
), 
 929                             WXHWND 
WXUNUSED(hControl
) ) 
 931     wxEventType eScrollEvent 
= wxEVT_NULL
; 
 936             if (m_windowStyle 
& wxSL_TOP
) 
 937                 eScrollEvent 
= wxEVT_SCROLL_TOP
; 
 938             else if (m_windowStyle 
& wxSL_BOTTOM
) 
 939                 eScrollEvent 
= wxEVT_SCROLL_BOTTOM
; 
 942         case SLN_SLIDERTRACK
: 
 943             eScrollEvent 
= wxEVT_SCROLL_THUMBTRACK
; 
 950     int nPixelRange 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
 951                                                , SLM_QUERYSLIDERINFO
 
 952                                                , MPFROM2SHORT( SMA_SHAFTDIMENSIONS
, SMA_RANGEVALUE 
) 
 956     m_dPixelToRange 
= (double)(nPixelRange 
- m_nThumbLength
)/(double)(m_nRangeMax 
- m_nRangeMin
); 
 958     int nPixelPos 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
 959                                              , SLM_QUERYSLIDERINFO
 
 960                                              , MPFROM2SHORT( SMA_SLIDERARMPOSITION
, SMA_RANGEVALUE 
) 
 965     nNewPos 
= (int)(nPixelPos
/m_dPixelToRange
); 
 966     if (nNewPos 
> (m_nRangeMax 
- m_nRangeMin
)/2) 
 968     if ((nNewPos 
< GetMin()) || (nNewPos 
> GetMax())) 
 971         // Out of range - but we did process it 
 977     wxScrollEvent 
vEvent( eScrollEvent
, m_windowId 
); 
 979     vEvent
.SetPosition(nNewPos
); 
 980     vEvent
.SetEventObject(this); 
 981     GetEventHandler()->ProcessEvent(vEvent
); 
 983     wxCommandEvent 
vCevent( wxEVT_COMMAND_SLIDER_UPDATED
, GetId() ); 
 985     vCevent
.SetInt(nNewPos
); 
 986     vCevent
.SetEventObject(this); 
 987     return (GetEventHandler()->ProcessEvent(vCevent
)); 
 988 } // end of wxSlider::OS2OnScroll 
 990 void wxSlider::SetLineSize( int nLineSize 
) 
 992     m_nLineSize 
= nLineSize
; 
 993 } // end of wxSlider::SetLineSize 
 996 void wxSlider::SetPageSize( int nPageSize 
) 
 998     m_nPageSize 
= nPageSize
; 
 999 } // end of wxSlider::SetPageSize 
1001 void wxSlider::SetRange( 
1008     m_nRangeMin 
= nMinValue
; 
1009     m_nRangeMax 
= nMaxValue
; 
1011     int                             nPixelRange 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
1012                                                                             ,SLM_QUERYSLIDERINFO
 
1013                                                                             ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
 
1019     m_dPixelToRange 
= (double)(nPixelRange 
- m_nThumbLength
)/(double)(m_nRangeMax 
- m_nRangeMin
); 
1022         wxSprintf(zBuf
, wxT("%d"), m_nRangeMin
); 
1023         ::WinSetWindowText((HWND
)m_hStaticMin
, (PSZ
)zBuf
); 
1028         wxSprintf(zBuf
, wxT("%d"), m_nRangeMax
); 
1029         ::WinSetWindowText((HWND
)m_hStaticMax
, (PSZ
)zBuf
); 
1031 } // end of wxSlider::SetRange 
1033 void wxSlider::SetSelection( 
1034   int                               WXUNUSED(nMinPos
) 
1035 , int                               WXUNUSED(nMaxPos
) 
1038 } // end of wxSlider::SetSelection 
1040 void wxSlider::SetThumbLength( 
1046     m_nThumbLength 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
1047                                                ,SLM_QUERYSLIDERINFO
 
1048                                                ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
 
1053                                  ) + 4; // for bordersizes 
1054     nBreadth 
= SHORT2FROMMR(::WinSendMsg( GetHwnd() 
1055                                          ,SLM_QUERYSLIDERINFO
 
1056                                          ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
 
1062     ::WinSendMsg( GetHwnd() 
1064                  ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
 
1067                  ,MPFROM2SHORT(nLen
, nBreadth
) 
1069     m_nThumbLength 
= nLen 
+ 4; // Borders 
1070 } // end of wxSlider::SetThumbLength 
1072 void wxSlider::SetTick( 
1076     nTickPos 
= (int)(nTickPos 
* m_dPixelToRange
); 
1077     ::WinSendMsg( GetHwnd() 
1079                  ,MPFROMSHORT(nTickPos
) 
1082 } // end of wxSlider::SetTick 
1084 // For trackbars only 
1085 void wxSlider::SetTickFreq( int n
, int WXUNUSED(nPos
) ) 
1088     WNDPARAMS vWndParams
; 
1092     vSlData
.cbSize 
= sizeof(SLDCDATA
); 
1093     if (m_windowStyle 
& wxSL_AUTOTICKS
) 
1095         vSlData
.usScale1Spacing 
= 0; 
1096         vSlData
.usScale2Spacing 
= 0; 
1098     vSlData
.usScale1Increments 
= (USHORT
)((m_nRangeMax 
- m_nRangeMin
)/n
); 
1099     vSlData
.usScale2Increments 
= (USHORT
)((m_nRangeMax 
- m_nRangeMin
)/n
); 
1101     vWndParams
.fsStatus 
= WPM_CTLDATA
; 
1102     vWndParams
.cchText  
= 0L; 
1103     vWndParams
.pszText  
= NULL
; 
1104     vWndParams
.cbPresParams 
= 0L; 
1105     vWndParams
.pPresParams 
= NULL
; 
1106     vWndParams
.cbCtlData 
= vSlData
.cbSize
; 
1107     vWndParams
.pCtlData 
= (PVOID
)&vSlData
; 
1108     ::WinSendMsg(GetHwnd(), WM_SETWINDOWPARAMS
, (MPARAM
)&vWndParams
, (MPARAM
)0); 
1109     for (i 
= 1; i 
< (m_nRangeMax 
- m_nRangeMin
)/n
; i
++) 
1111         nPixelPos 
= (int)(i 
* n 
* m_dPixelToRange
); 
1112         ::WinSendMsg( GetHwnd() 
1114                      ,MPFROMSHORT(nPixelPos
) 
1118 } // end of wxSlider::SetTickFreq 
1120 void wxSlider::SetValue( 
1124     int                             nPixelRange 
= SHORT1FROMMR(::WinSendMsg( GetHwnd() 
1125                                                                             ,SLM_QUERYSLIDERINFO
 
1126                                                                             ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
 
1132     m_dPixelToRange 
= (double)(nPixelRange 
- m_nThumbLength
)/(double)(m_nRangeMax 
- m_nRangeMin
); 
1133     int                             nNewPos 
= (int)(nValue 
* m_dPixelToRange
); 
1135     ::WinSendMsg( GetHwnd() 
1137                  ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
 
1144         wxSprintf(wxBuffer
, wxT("%d"), nValue
); 
1145         ::WinSetWindowText((HWND
)m_hStaticValue
, (PSZ
)wxBuffer
); 
1147 } // end of wxSlider::SetValue 
1149 bool wxSlider::Show( 
1153     wxWindowOS2::Show(bShow
); 
1155         ::WinShowWindow((HWND
)m_hStaticValue
, bShow
); 
1157         ::WinShowWindow((HWND
)m_hStaticMin
, bShow
); 
1159         ::WinShowWindow((HWND
)m_hStaticMax
, bShow
); 
1161 } // end of wxSlider::Show 
1163 #endif // wxUSE_SLIDER