home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / cmnctrl.pak / SLIDCTRL.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  9KB  |  344 lines

  1. // SlidCtrl.cpp : implementation file
  2. //
  3.  
  4. // This is a part of the Microsoft Foundation Classes C++ library.
  5. // Copyright (C) 1992-1995 Microsoft Corporation
  6. // All rights reserved.
  7. //
  8. // This source code is only intended as a supplement to the
  9. // Microsoft Foundation Classes Reference and related
  10. // electronic documentation provided with the library.
  11. // See these sources for detailed information regarding the
  12. // Microsoft Foundation Classes product.
  13.  
  14. #include "stdafx.h"
  15. #include "ctrldemo.h"
  16. #include "SlidCtrl.h"
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CSliderCtrlPage property page
  25.  
  26. IMPLEMENT_DYNCREATE(CSliderCtrlPage, CPropertyPage)
  27.  
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #endif
  31.  
  32. CSliderCtrlPage::CSliderCtrlPage() : CPropertyPage(CSliderCtrlPage::IDD)
  33. {
  34.     //{{AFX_DATA_INIT(CSliderCtrlPage)
  35.     m_bAutoticks = TRUE;
  36.     m_bEnablesel = FALSE;
  37.     m_bFixed = FALSE;
  38.     m_uiLine = 10;
  39.     m_bNothumb = FALSE;
  40.     m_bNoticks = FALSE;
  41.     m_iOrientation = 0;
  42.     m_uiPage = 50;
  43.     m_iTickpos = 0;
  44.     m_uiRangeFrom = 0;
  45.     m_uiRangeTo = 100;
  46.     m_uiSelRangeFrom = 20;
  47.     m_uiSelRangeTo = 80;
  48.     m_uiTickFreq = 20;
  49.     //}}AFX_DATA_INIT
  50. }
  51.  
  52. CSliderCtrlPage::~CSliderCtrlPage()
  53. {
  54. }
  55.  
  56. void CSliderCtrlPage::DoDataExchange(CDataExchange* pDX)
  57. {
  58.     CPropertyPage::DoDataExchange(pDX);
  59.     //{{AFX_DATA_MAP(CSliderCtrlPage)
  60.     DDX_Control(pDX, IDC_NOTIFICATIONS, m_Notifications);
  61.     DDX_Check(pDX, IDC_SLIDER_AUTOTICKS, m_bAutoticks);
  62.     DDX_Check(pDX, IDC_SLIDER_ENABLESEL, m_bEnablesel);
  63.     DDX_Check(pDX, IDC_SLIDER_FIXED, m_bFixed);
  64.     DDX_Text(pDX, IDC_SLIDER_LINE, m_uiLine);
  65.     DDV_MinMaxUInt(pDX, m_uiLine, 0, 65535);
  66.     DDX_Check(pDX, IDC_SLIDER_NOTHUMB, m_bNothumb);
  67.     DDX_Check(pDX, IDC_SLIDER_NOTICKS, m_bNoticks);
  68.     DDX_CBIndex(pDX, IDC_SLIDER_ORIENTATION, m_iOrientation);
  69.     DDX_Text(pDX, IDC_SLIDER_PAGE, m_uiPage);
  70.     DDV_MinMaxUInt(pDX, m_uiPage, 0, 65535);
  71.     DDX_CBIndex(pDX, IDC_SLIDER_POINT, m_iTickpos);
  72.     DDX_Text(pDX, IDC_SLIDER_RANGEFROM, m_uiRangeFrom);
  73.     DDV_MinMaxUInt(pDX, m_uiRangeFrom, 0, 65535);
  74.     DDX_Text(pDX, IDC_SLIDER_RANGETO, m_uiRangeTo);
  75.     DDV_MinMaxUInt(pDX, m_uiRangeTo, 0, 65535);
  76.     DDX_Text(pDX, IDC_SLIDER_SELRANGEFROM, m_uiSelRangeFrom);
  77.     DDV_MinMaxUInt(pDX, m_uiSelRangeFrom, 0, 65535);
  78.     DDX_Text(pDX, IDC_SLIDER_SELRANGETO, m_uiSelRangeTo);
  79.     DDV_MinMaxUInt(pDX, m_uiSelRangeTo, 0, 65535);
  80.     DDX_Text(pDX, IDC_SLIDER_TICKFREQ, m_uiTickFreq);
  81.     DDV_MinMaxUInt(pDX, m_uiTickFreq, 0, 65535);
  82.     //}}AFX_DATA_MAP
  83. }
  84.  
  85. BOOL CSliderCtrlPage::OnInitDialog()
  86. {
  87.     CPropertyPage::OnInitDialog();
  88.  
  89.     // Initially create slider control in horizontal position
  90.     CWnd* pWnd =
  91.         GetDlgItem( IDC_SLIDER_HORZPOS );
  92.     CRect rect;
  93.     pWnd->GetWindowRect( &rect );
  94.     ScreenToClient( &rect );
  95.  
  96.     // Initialise controls
  97.     m_Slider.Create( WS_VISIBLE|WS_CHILD|TBS_HORZ|TBS_BOTH|TBS_AUTOTICKS,
  98.                      rect, this, IDC_SLIDER );
  99.     m_Slider.SetTicFreq( m_uiTickFreq );    // Send TBM_SETTICFREQ
  100.     m_Slider.SetLineSize( m_uiLine );        // Send TBM_SETLINESIZE
  101.     m_Slider.SetPageSize( m_uiPage );        // Send TBM_SETPAGESIZE
  102.     m_Slider.SetRange( m_uiRangeFrom, m_uiRangeTo, TRUE );
  103.                                             // Send TBM_SETRANGE
  104.     return TRUE;
  105. }
  106.  
  107. void CSliderCtrlPage::ChangeCtrlStyle( long lStyle, BOOL bSetBit)
  108. {
  109. long    lStyleOld;
  110.  
  111.     lStyleOld = GetWindowLong( m_Slider.GetSafeHwnd(), GWL_STYLE );
  112.     if ( bSetBit )
  113.         lStyleOld |= lStyle;
  114.     else
  115.         lStyleOld &= ~lStyle;
  116.     SetWindowLong( m_Slider.GetSafeHwnd(), GWL_STYLE, lStyleOld );
  117.     m_Slider.SetWindowPos( NULL, 0, 0, 0, 0, SWP_DRAWFRAME|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER );
  118. }
  119.  
  120. BEGIN_MESSAGE_MAP(CSliderCtrlPage, CPropertyPage)
  121.     //{{AFX_MSG_MAP(CSliderCtrlPage)
  122.     ON_BN_CLICKED(IDC_SLIDER_AUTOTICKS, OnAutoticks)
  123.     ON_EN_KILLFOCUS(IDC_SLIDER_TICKFREQ, OnTickfreq)
  124.     ON_BN_CLICKED(IDC_SLIDER_NOTICKS, OnNoticks)
  125.     ON_BN_CLICKED(IDC_SLIDER_NOTHUMB, OnNothumb)
  126.     ON_BN_CLICKED(IDC_SLIDER_FIXED, OnFixed)
  127.     ON_BN_CLICKED(IDC_SLIDER_ENABLESEL, OnEnablesel)
  128.     ON_EN_KILLFOCUS(IDC_SLIDER_LINE, OnLine)
  129.     ON_EN_KILLFOCUS(IDC_SLIDER_PAGE, OnPage)
  130.     ON_EN_KILLFOCUS(IDC_SLIDER_RANGEFROM, OnRangefrom)
  131.     ON_EN_KILLFOCUS(IDC_SLIDER_RANGETO, OnRangeto)
  132.     ON_CBN_SELCHANGE(IDC_SLIDER_ORIENTATION, OnOrientation)
  133.     ON_CBN_SELCHANGE(IDC_SLIDER_POINT, OnPoint)
  134.     ON_EN_KILLFOCUS(IDC_SLIDER_SELRANGEFROM, OnSelrangefrom)
  135.     ON_EN_KILLFOCUS(IDC_SLIDER_SELRANGETO, OnSelrangeto)
  136. //    ON_WM_HSCROLL()
  137.     //}}AFX_MSG_MAP
  138. END_MESSAGE_MAP()
  139.  
  140. /////////////////////////////////////////////////////////////////////////////
  141. // CSliderCtrlPage message handlers
  142.  
  143. void CSliderCtrlPage::OnAutoticks() 
  144. {
  145.     UpdateData();
  146.  
  147.     // Shows tick marks according to increment/frequency when set (default frequency is 1)
  148.     ChangeCtrlStyle( TBS_AUTOTICKS, m_bAutoticks );
  149.  
  150.     // Enable/disable edit controls
  151.     GetDlgItem( IDC_SLIDER_TICKFREQ )->EnableWindow( m_bAutoticks );
  152.  
  153.     if ( m_bAutoticks )
  154.         // Set tick marks with given frequency (1 = tick at every increment)
  155.         m_Slider.SetTicFreq( m_uiTickFreq );    // Send TBM_SETTICFREQ - need TBS_AUTOTICKS
  156.     else
  157.         // Clear tick marks
  158.         m_Slider.ClearTics( TRUE );
  159. }
  160.  
  161. void CSliderCtrlPage::OnTickfreq() 
  162. {
  163.     UpdateData();
  164.     if ( m_bAutoticks )
  165.         // Set tick marks at given frequency (1 = tick at every increment)
  166.         m_Slider.SetTicFreq( m_uiTickFreq );    // Send TBM_SETTICFREQ - need TBS_AUTOTICKS
  167. }
  168.  
  169. void CSliderCtrlPage::OnNoticks() 
  170. {
  171.     UpdateData();
  172.  
  173.     // Removes tick marks when set
  174.     ChangeCtrlStyle( TBS_NOTICKS, m_bNoticks );
  175. }
  176.  
  177. void CSliderCtrlPage::OnNothumb() 
  178. {
  179.     UpdateData();
  180.  
  181.     // Removes thumb from slider control when set
  182.     ChangeCtrlStyle( TBS_NOTHUMB, m_bNothumb );
  183. }
  184.  
  185. void CSliderCtrlPage::OnFixed() 
  186. {
  187.     UpdateData();
  188.  
  189.     // Fixes length of slider thumb when set (
  190.     ChangeCtrlStyle( TBS_FIXEDLENGTH, m_bFixed );
  191. }
  192.  
  193. void CSliderCtrlPage::OnEnablesel()
  194. {
  195.     UpdateData();
  196.     ChangeCtrlStyle( TBS_ENABLESELRANGE, m_bEnablesel );
  197.  
  198.     // Enable/disable edit controls
  199.     GetDlgItem( IDC_SLIDER_SELRANGEFROM )->EnableWindow( m_bEnablesel );
  200.     GetDlgItem( IDC_SLIDER_SELRANGETO )->EnableWindow( m_bEnablesel );
  201.  
  202.     if ( m_bEnablesel )
  203.         // Set selection range
  204.         m_Slider.SetSelection( m_uiSelRangeFrom, m_uiSelRangeTo );    // Send TBM_SETSEL
  205.     else
  206.         // Clear selection range
  207.         m_Slider.ClearSel( TRUE );
  208. }
  209.  
  210. void CSliderCtrlPage::OnLine() 
  211. {
  212.     UpdateData();
  213.  
  214.     // Set line size (determines effect of arrow keys)
  215.     m_Slider.SetLineSize( m_uiLine );        // Send TBM_SETLINESIZE
  216. }
  217.  
  218. void CSliderCtrlPage::OnPage() 
  219. {
  220.     UpdateData();
  221.  
  222.     // Set page size (determines effect of PageUp/PageDown keys)
  223.     m_Slider.SetPageSize( m_uiPage );        // Send TBM_SETPAGESIZE
  224. }
  225.  
  226. void CSliderCtrlPage::OnRangefrom() 
  227. {
  228.     UpdateData();
  229.  
  230.     // Set range of slider control
  231.     m_Slider.SetRangeMin( m_uiRangeFrom, TRUE );    // Send TBM_SETRANGE
  232. }
  233.  
  234. void CSliderCtrlPage::OnRangeto() 
  235. {
  236.     UpdateData();
  237.  
  238.     // Set range of slider control
  239.     m_Slider.SetRangeMax( m_uiRangeTo, TRUE );    // Send TBM_SETRANGE
  240. }
  241.  
  242. void CSliderCtrlPage::OnOrientation() 
  243. {
  244.     UpdateData();
  245.  
  246.     // Obtain horz/vert place marker (static control)
  247.     CWnd* pWnd =
  248.         GetDlgItem( (0==m_iOrientation)?IDC_SLIDER_HORZPOS:IDC_SLIDER_VERTPOS );
  249.     CRect rect;
  250.     pWnd->GetWindowRect( &rect );
  251.     ScreenToClient( &rect );
  252.  
  253.     // Set slider control style
  254.     ChangeCtrlStyle( TBS_HORZ, (0 == m_iOrientation) );
  255.     ChangeCtrlStyle( TBS_VERT, (1 == m_iOrientation) );
  256.  
  257.     // Move control to horz/vert position
  258.     m_Slider.SetWindowPos( NULL,
  259.                            rect.left, rect.top,
  260.                            rect.Width(), rect.Height(),
  261.                            SWP_NOZORDER|SWP_SHOWWINDOW );
  262.     Invalidate();
  263. }
  264.  
  265. void CSliderCtrlPage::OnPoint() 
  266. {
  267.     UpdateData();
  268.  
  269.     switch ( m_iTickpos )
  270.     {
  271.     case 0:
  272.         ChangeCtrlStyle( TBS_BOTH );
  273.         break;
  274.     case 1:
  275.         ChangeCtrlStyle( TBS_TOP );        // Same as TBS_LEFT
  276.         ChangeCtrlStyle( TBS_BOTH, FALSE );
  277.         ChangeCtrlStyle( TBS_BOTTOM, FALSE );
  278.         break;
  279.     case 2:
  280.         ChangeCtrlStyle( TBS_BOTTOM );    // Same as TBS_RIGHT
  281.         ChangeCtrlStyle( TBS_BOTH, FALSE );
  282.         ChangeCtrlStyle( TBS_TOP, FALSE );
  283.         break;
  284.     default:
  285.         break;
  286.     }
  287. }
  288.  
  289. void CSliderCtrlPage::OnSelrangefrom() 
  290. {
  291.     UpdateData();
  292.     m_Slider.ClearSel();
  293.     m_Slider.SetSelection( m_uiSelRangeFrom, m_uiSelRangeTo );    // Send TBM_SETSEL
  294. }
  295.  
  296. void CSliderCtrlPage::OnSelrangeto() 
  297. {
  298.     UpdateData();
  299.     m_Slider.ClearSel();
  300.     m_Slider.SetSelection( m_uiSelRangeFrom, m_uiSelRangeTo );    // Send TBM_SETSEL
  301. }
  302.  
  303. /*
  304. void CSliderCtrlPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  305. {
  306.     // Notifications are sent in WM_HSCROLL message
  307.  
  308.     switch( nSBCode )
  309.     {
  310.     case TB_BOTTOM:
  311.         m_Notifications.SetWindowText( "TB_BOTTOM" );
  312.         break;
  313.     case TB_ENDTRACK:
  314.         m_Notifications.SetWindowText( "TB_ENDTRACK" );
  315.         break;
  316.     case TB_LINEDOWN:
  317.         m_Notifications.SetWindowText( "TB_LINEDOWN" );
  318.         break;
  319.     case TB_LINEUP:
  320.         m_Notifications.SetWindowText( "TB_LINEUP" );
  321.         break;
  322.     case TB_PAGEDOWN:
  323.         m_Notifications.SetWindowText( "TB_PAGEDOWN" );
  324.         break;
  325.     case TB_PAGEUP:
  326.         m_Notifications.SetWindowText( "TB_PAGEUP" );
  327.         break;
  328.     case TB_THUMBPOSITION:
  329.         m_Notifications.SetWindowText( "TB_THUMBPOSITION" );
  330.         break;
  331.     case TB_THUMBTRACK:
  332.         m_Notifications.SetWindowText( "TB_THUMBTRACK" );
  333.         break;
  334.     case TB_TOP:
  335.         m_Notifications.SetWindowText( "TB_TOP" );
  336.         break;
  337.     default:
  338.         break;
  339.     }
  340.     
  341.     CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  342. }
  343. */
  344.