home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / dovetail.zip / slider.cc < prev    next >
C/C++ Source or Header  |  1994-04-07  |  5KB  |  160 lines

  1. #include "slider.h"
  2.  
  3.  
  4. Slider::Slider(HWND hParent, ULONG ulId) : Control(hParent, ulId)
  5. {
  6.     WNDPARAMS   wprm;                   // Window parameters ct;
  7.     SLDCDATA    sldcd;                  // Slider control data
  8.  
  9.     //----------------------------------------------------------
  10.     // Get original slider dimensions in increments for future
  11.     // calls.  (My thanks to Wayne Kovsky for this example of 
  12.     // using WM_QUERYWINDOWPARAMS.)
  13.     //----------------------------------------------------------
  14.     wprm.fsStatus   = WPM_CTLDATA;      // Request control data
  15.     wprm.cbCtlData  = sizeof (SLDCDATA);
  16.     wprm.pCtlData   = &sldcd;
  17.  
  18.     WinSendMsg (hWnd, WM_QUERYWINDOWPARAMS,
  19.                      MPFROMP(&wprm), 0);
  20.     ulNumTicks = sldcd.usScale1Increments;
  21.     pfTickVals = new float[ulNumTicks];
  22.     for(int i=0; i<ulNumTicks; i++)
  23.        pfTickVals[i] = i;
  24. }
  25.  
  26. Slider::Slider(HWND hParent, ULONG ulId, SHORT xp, SHORT yp, SHORT dx, SHORT dy,
  27.      ULONG ulInc, ULONG ulSliderStyle) : Control()
  28.    {
  29.     //  Create a simple slider.
  30.     SLDCDATA sldcData;
  31.  
  32.    sldcData.cbSize=sizeof(SLDCDATA);
  33.    sldcData.usScale1Increments = ulInc;
  34.    sldcData.usScale1Spacing = 0;
  35.    ulNumTicks = ulInc;
  36.    pfTickVals = new float[ulNumTicks];
  37.    for(int i=0; i<ulNumTicks; i++)
  38.       pfTickVals[i] = i;
  39.  
  40.    hWnd = WinCreateWindow(
  41.               hParent,       /* Parent Window Handle */
  42.               WC_SLIDER,     /* Slider Window class name */
  43.               NULL,     /* No Window Text */
  44.               ulSliderStyle &
  45.               ~WS_VISIBLE, /* Slider style but not visible*/
  46.               xp,   /* Xcoord */
  47.               yp,   /* Ycoord */
  48.               dx,   /* Width */
  49.               dy,    /* Height */
  50.               hParent,       /* Owner Window Handle */
  51.               HWND_TOP,      /* Sibling Window Handle */
  52.               ulId,     /* Slider Window ID */
  53.               &sldcData,     /* Control Data Structure */
  54.               (PVOID)NULL);  /* no presentation parameters */
  55.    fCreated=TRUE;
  56. }
  57.  
  58. Slider::~Slider()
  59. {
  60. delete pfTickVals;
  61. }
  62.  
  63. // associate float values with each tick mark
  64. void Slider::SetTickVals(float *vals)
  65. {
  66. for(int i=0; i<ulNumTicks; i++)
  67.   pfTickVals[i] = vals[i];
  68. }
  69.  
  70. // get interpolated value of slider arm
  71.  Slider::operator float()
  72. {
  73.   ULONG ulv;
  74.  
  75.   ulv = (ULONG) WinSendMsg(
  76.                hWnd,     /* my window handle */
  77.                SLM_QUERYSLIDERINFO, /* Message for querrying slider */
  78.                MPFROM2SHORT(
  79.                  SMA_SLIDERARMPOSITION,
  80.                  SMA_RANGEVALUE),
  81.                NULL);
  82.   float t =  (float)(ulNumTicks-1) *
  83.           (float)(USHORT)ulv/(float)(USHORT)(ulv >> 16);
  84.   int i= (int) t;
  85.   t -= i;
  86.   return pfTickVals[i] + t*(pfTickVals[i+1]-pfTickVals[i]);
  87. }
  88.  
  89. // get slider arm position in terms of ticks
  90.  Slider::operator ULONG()
  91. {
  92.   return (ULONG) WinSendMsg(
  93.                hWnd,     /* my window handle */
  94.                SLM_QUERYSLIDERINFO, /* Message for querrying slider */
  95.                MPFROM2SHORT(
  96.                  SMA_SLIDERARMPOSITION,
  97.                  SMA_INCREMENTVALUE),
  98.                NULL);
  99. }
  100.  
  101. // set size of tick marks.  6 should be a variable, I suppose.
  102. VOID Slider::SetTicks()
  103. {
  104. WinSendMsg(hWnd,SLM_SETTICKSIZE, MPFROM2SHORT(SMA_SETALLTICKS,6),NULL);
  105. }
  106.  
  107. // set a detent at a given position
  108. VOID Slider::SetDetent(float fWhere)
  109. {
  110. SHORT sPos;
  111. ULONG ulv;
  112.  
  113.   ulv = (ULONG) WinSendMsg(
  114.                hWnd,     /* my window handle */
  115.                SLM_QUERYSLIDERINFO, /* Message for querrying slider */
  116.                MPFROM2SHORT(
  117.                  SMA_SLIDERARMPOSITION,
  118.                  SMA_RANGEVALUE),
  119.                NULL);
  120. sPos = (SHORT)(fWhere*(float)(SHORT)(ulv>>16)/(float)(ulNumTicks-1));
  121. WinSendMsg(hWnd,SLM_ADDDETENT,MPFROMSHORT(sPos),NULL);
  122. }
  123.  
  124. // set text over a tick mark
  125. VOID Slider::SetTickText(SHORT sPos,char * cpText)
  126. {
  127. WinSendMsg(hWnd,SLM_SETSCALETEXT,MPFROMSHORT(sPos),
  128.            MPFROMP(cpText));
  129. }
  130.  
  131. // set slider arm position in terms of float values
  132. VOID Slider::SetArmPos(float fWhere)
  133. {
  134. SHORT sPos;
  135. ULONG ulv;
  136. float t;
  137.  
  138. if(fWhere < pfTickVals[0]) fWhere = pfTickVals[0];
  139. if(fWhere > pfTickVals[ulNumTicks-1]) fWhere = pfTickVals[ulNumTicks-1];
  140.  
  141. for(int i=0; i<ulNumTicks-1; i++)
  142.   if(fWhere < pfTickVals[i+1]) break;
  143.  
  144. t = (fWhere-pfTickVals[i])/(pfTickVals[i+1]-pfTickVals[i]);
  145.  
  146. fWhere = i+t;
  147.  
  148.   ulv = (ULONG) WinSendMsg(
  149.                hWnd,     /* my window handle */
  150.                SLM_QUERYSLIDERINFO, /* Message for querrying slider */
  151.                MPFROM2SHORT(
  152.                  SMA_SLIDERARMPOSITION,
  153.                  SMA_RANGEVALUE),
  154.                NULL);
  155. sPos = (SHORT)(fWhere*(float)(SHORT)(ulv>>16)/(float)(ulNumTicks-1));
  156. WinSendMsg(hWnd,SLM_SETSLIDERINFO,MPFROM2SHORT(SMA_SLIDERARMPOSITION,
  157.                                            SMA_RANGEVALUE),
  158.                               MPFROMSHORT(sPos));
  159. }
  160.