home *** CD-ROM | disk | FTP | other *** search
/ Team Palmtops 7 / Palmtops_numero07.iso / WinCE / SDKWindowsCE / HandHeldPCPro30 / sdk.exe / Jupiter SDK / data1.cab / MFC_Samples / cmnctrls / spinctrl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-19  |  6.3 KB  |  247 lines

  1. // SpinCtrl.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "ctrldemo.h"
  6. #include "SpinCtrl.h"
  7.  
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12.  
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CSpinCtrlPage property page
  15.  
  16. IMPLEMENT_DYNCREATE(CSpinCtrlPage, CPropertyPage)
  17.  
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #endif
  21.  
  22. CSpinCtrlPage::CSpinCtrlPage() : CPropertyPage(CSpinCtrlPage::IDD)
  23. {
  24.     //{{AFX_DATA_INIT(CSpinCtrlPage)
  25.     m_iAlignment = 0;
  26.     m_uiRangeFrom = 0;
  27.     m_iOrientation = 0;
  28.     m_uiRangeTo = 100;
  29.     m_bWrap = FALSE;
  30.     //}}AFX_DATA_INIT
  31. }
  32.  
  33. CSpinCtrlPage::~CSpinCtrlPage()
  34. {
  35. }
  36.  
  37. void CSpinCtrlPage::DoDataExchange(CDataExchange* pDX)
  38. {
  39.     if(!pDX->m_bSaveAndValidate)
  40.     {
  41.         CComboBox* pOrientation = (CComboBox*)GetDlgItem(IDC_SPIN_ORIENTATION);
  42.         pOrientation->ResetContent();
  43.         pOrientation->AddString(CString((LPCTSTR)IDS_VERTICAL2));
  44.         pOrientation->AddString(CString((LPCTSTR)IDS_HORIZONTAL2));
  45.  
  46.         CComboBox* pAlign = (CComboBox*)GetDlgItem(IDC_SPIN_ALIGNMENT);
  47.         pAlign->ResetContent();
  48.         pAlign->AddString(CString((LPCTSTR)IDS_UNATTACHED));
  49.         pAlign->AddString(CString((LPCTSTR)IDS_LEFT2));
  50.         pAlign->AddString(CString((LPCTSTR)IDS_RIGHT2));
  51.     }
  52.  
  53.     CPropertyPage::DoDataExchange(pDX);
  54.     //{{AFX_DATA_MAP(CSpinCtrlPage)
  55.     DDX_CBIndex(pDX, IDC_SPIN_ALIGNMENT, m_iAlignment);
  56.     DDX_Text(pDX, IDC_SPIN_FROM, m_uiRangeFrom);
  57.     DDV_MinMaxUInt(pDX, m_uiRangeFrom, 0, 65535);
  58.     DDX_CBIndex(pDX, IDC_SPIN_ORIENTATION, m_iOrientation);
  59.     DDX_Text(pDX, IDC_SPIN_TO, m_uiRangeTo);
  60.     DDV_MinMaxUInt(pDX, m_uiRangeTo, 0, 65535);
  61.     DDX_Check(pDX, IDC_SPIN_WRAP, m_bWrap);
  62.     //}}AFX_DATA_MAP
  63. }
  64.  
  65. BOOL CSpinCtrlPage::OnInitDialog()
  66. {
  67.     CPropertyPage::OnInitDialog();
  68.  
  69.     CWnd* pEdit = GetDlgItem( IDC_SPIN_EDIT );
  70.     pEdit->GetWindowRect( &m_EditRect );
  71.     ScreenToClient( &m_EditRect );
  72.     pEdit->SetWindowText(_T("0"));
  73.  
  74.     CreateSpinCtrl();
  75.     SetModified(TRUE);
  76.  
  77.     return TRUE;
  78. }
  79.  
  80. void CSpinCtrlPage::CreateSpinCtrl()
  81. {
  82.     if(m_Spin.m_hWnd != NULL)
  83.     {
  84. #if (_WIN32_WCE > 200)
  85.         m_Spin.SetBuddy(NULL);
  86. #endif // _WIN32_WCE
  87.         m_Spin.DestroyWindow();
  88.     }
  89.     DWORD dwStyles=UDS_ARROWKEYS;
  90.  
  91.     // Build styles mask
  92.     if ( 1 == m_iAlignment )
  93.         dwStyles |= UDS_ALIGNLEFT;        // Control is placed to the left of buddy, if set
  94.                                         // (default = unattached)
  95.     else if ( 2 == m_iAlignment )
  96.         dwStyles |= UDS_ALIGNRIGHT;        // Control is placed to the right of buddy, if set
  97.                                         // (default = unattached)
  98.     if ( 1 == m_iOrientation )
  99.         dwStyles |= UDS_HORZ;            // Control is horizontal, if set (default = vert)
  100.  
  101.     if ( m_bWrap )
  102.         dwStyles |= UDS_WRAP;            // Position wraps when range exceeded, if set
  103.  
  104.     // Get edit control and change Z-order (created controls go at bottom of Z-order)
  105.     CWnd *pEdit = GetDlgItem( IDC_SPIN_EDIT );
  106.  
  107.     pEdit->SetWindowPos(&wndBottom, m_EditRect.left, m_EditRect.top, m_EditRect.Width(), 
  108.         m_EditRect.Height(), SWP_SHOWWINDOW);
  109.  
  110.     // Create spin (up-down) control
  111.     CWnd* pWnd = GetDlgItem( IDC_SPIN_POS );
  112.     CRect rect;
  113.     pWnd->GetWindowRect( &rect );
  114.     ScreenToClient( &rect );
  115.  
  116.     m_Spin.Create( WS_VISIBLE | WS_CHILD | dwStyles, rect, this, IDC_SPIN );
  117.     m_Spin.SetRange( m_uiRangeFrom, m_uiRangeTo );    // Sends UDM_SETRANGE
  118.     m_Spin.SetBuddy(pEdit);
  119.     
  120.     int nCurrValue = GetDlgItemInt(IDC_SPIN_EDIT);
  121.     m_Spin.SetPos(nCurrValue);
  122.  
  123.     CWnd *pStatic = GetDlgItem(IDC_SPIN_STATIC);
  124.     pStatic->SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  125. }
  126.  
  127. BEGIN_MESSAGE_MAP(CSpinCtrlPage, CPropertyPage)
  128.     //{{AFX_MSG_MAP(CSpinCtrlPage)
  129.     ON_WM_HSCROLL()
  130.     ON_WM_VSCROLL()
  131.     ON_CBN_SELCHANGE(IDC_SPIN_ALIGNMENT, OnSelchangeSpinAlignment)
  132.     ON_EN_KILLFOCUS(IDC_SPIN_FROM, OnKillfocusSpinFrom)
  133.     ON_EN_KILLFOCUS(IDC_SPIN_EDIT, OnKillfocusSpinEdit)
  134.     ON_CBN_SELCHANGE(IDC_SPIN_ORIENTATION, OnSelchangeSpinOrientation)
  135.     ON_EN_KILLFOCUS(IDC_SPIN_TO, OnKillfocusSpinTo)
  136.     ON_BN_CLICKED(IDC_SPIN_WRAP, OnSpinWrap)
  137.     ON_EN_CHANGE(IDC_SPIN_EDIT, OnChangeSpinEdit)
  138.     //}}AFX_MSG_MAP
  139. END_MESSAGE_MAP()
  140.  
  141. /////////////////////////////////////////////////////////////////////////////
  142. // CSpinCtrlPage message handlers
  143.  
  144. void CSpinCtrlPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  145. {
  146.     TCHAR buf[32];
  147.     wsprintf( buf, _T("%d"), nPos );
  148.     CWnd* pWnd = ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN))->GetBuddy();
  149.     if ( pWnd != NULL )
  150.         pWnd->SetWindowText( buf );
  151.     CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  152. }
  153.  
  154. void CSpinCtrlPage::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  155. {
  156.     TCHAR buf[32];
  157.     wsprintf( buf, _T("%d"), nPos );
  158.     CWnd* pWnd = ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN))->GetBuddy();
  159.     if ( pWnd != NULL )
  160.         pWnd->SetWindowText( buf );
  161.     CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar);
  162. }
  163.  
  164. void CSpinCtrlPage::ChangeCtrlStyle()
  165. {
  166.     UpdateData();
  167.     CreateSpinCtrl();
  168. }
  169.  
  170. void CSpinCtrlPage::OnSpinWrap() 
  171. {
  172.     ChangeCtrlStyle();
  173. }
  174.  
  175. void CSpinCtrlPage::OnKillfocusSpinFrom() 
  176. {
  177.     UpdateData();
  178.     int min, max;
  179.     CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN);
  180.     pSpin->GetRange(min, max);
  181.     if (m_uiRangeFrom > m_uiRangeTo)
  182.     {
  183.         SWAP(m_uiRangeFrom, m_uiRangeTo);
  184.         UpdateData(FALSE);
  185.     }
  186.     min = m_uiRangeFrom;
  187.     max = m_uiRangeTo;
  188.     pSpin->SetRange(min, max);
  189.     CString strEdit;
  190.     pSpin->GetBuddy()->GetWindowText(strEdit);
  191.     if (_ttoi(strEdit) > max)
  192.     {
  193.         TCHAR buf[32];
  194.         wsprintf( buf, _T("%d"), max );
  195.         pSpin->GetBuddy()->SetWindowText(buf);
  196.     }
  197. }
  198.  
  199. void CSpinCtrlPage::OnKillfocusSpinTo() 
  200. {
  201.     UpdateData();
  202.     CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN);
  203.     int min, max;
  204.     pSpin->GetRange(min, max);
  205.     if (m_uiRangeFrom > m_uiRangeTo)
  206.     {
  207.         SWAP(m_uiRangeFrom, m_uiRangeTo);
  208.         UpdateData(FALSE);
  209.     }
  210.     min = m_uiRangeFrom;
  211.     max = m_uiRangeTo;
  212.     pSpin->SetRange(min, max);
  213.     CString strEdit;
  214.     pSpin->GetBuddy()->GetWindowText(strEdit);
  215.     if (_ttoi(strEdit) < min)
  216.     {
  217.         TCHAR buf[32];
  218.         wsprintf( buf, _T("%d"), min );
  219.         pSpin->GetBuddy()->SetWindowText(buf);
  220.     }
  221. }
  222.  
  223. void CSpinCtrlPage::OnKillfocusSpinEdit() 
  224. {
  225.     UpdateData();
  226. }
  227.  
  228. void CSpinCtrlPage::OnSelchangeSpinOrientation() 
  229. {
  230.     ChangeCtrlStyle();
  231. }
  232.  
  233. void CSpinCtrlPage::OnSelchangeSpinAlignment() 
  234. {
  235.     ChangeCtrlStyle();
  236. }
  237.  
  238.  
  239.  
  240. void CSpinCtrlPage::OnChangeSpinEdit() 
  241. {
  242.     int nCurrValue = GetDlgItemInt(IDC_SPIN_EDIT);
  243.     CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN);
  244.     if(pSpin != NULL)
  245.         pSpin->SetPos(nCurrValue);
  246. }
  247.