home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / com / inproc / ipdrive / ipdrivw.cpp < prev    next >
C/C++ Source or Header  |  1998-04-02  |  7KB  |  281 lines

  1. // ipdrivw.cpp : implementation of the CDriverView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "ipdrive.h"
  15.  
  16. #include "ipdridoc.h"
  17. #include "ipdrivw.h"
  18.  
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char BASED_CODE THIS_FILE[] = __FILE__;
  22. #endif
  23.  
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CDriverView
  26.  
  27. IMPLEMENT_DYNCREATE(CDriverView, CFormView)
  28.  
  29. BEGIN_MESSAGE_MAP(CDriverView, CFormView)
  30.     //{{AFX_MSG_MAP(CDriverView)
  31.     ON_BN_CLICKED(ID_LOOKUP, OnLookup)
  32.     ON_BN_CLICKED(ID_REMOVE, OnRemove)
  33.     ON_BN_CLICKED(ID_ADD, OnAdd)
  34.     ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  35.     ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  36.     //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38.  
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CDriverView construction/destruction
  41.  
  42. CDriverView::CDriverView()
  43.     : CFormView(CDriverView::IDD)
  44. {
  45.     //{{AFX_DATA_INIT(CDriverView)
  46.         // NOTE: the ClassWizard will add member initialization here
  47.     //}}AFX_DATA_INIT
  48.  
  49.     m_bInitialized = FALSE;
  50. }
  51.  
  52. CDriverView::~CDriverView()
  53. {
  54. }
  55.  
  56. void CDriverView::DoDataExchange(CDataExchange* pDX)
  57. {
  58.     CFormView::DoDataExchange(pDX);
  59.     //{{AFX_DATA_MAP(CDriverView)
  60.     DDX_Control(pDX, IDC_EDIT2, m_toValue);
  61.     DDX_Control(pDX, IDC_COMBO3, m_toType);
  62.     DDX_Control(pDX, IDC_EDIT1, m_ctrlValue);
  63.     DDX_Control(pDX, IDC_COMBO2, m_ctrlType);
  64.     //}}AFX_DATA_MAP
  65. }
  66.  
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CDriverView diagnostics
  69.  
  70. #ifdef _DEBUG
  71. void CDriverView::AssertValid() const
  72. {
  73.     CFormView::AssertValid();
  74. }
  75.  
  76. void CDriverView::Dump(CDumpContext& dc) const
  77. {
  78.     CFormView::Dump(dc);
  79. }
  80.  
  81. CDriverDoc* CDriverView::GetDocument() // non-debug version is inline
  82. {
  83.     return STATIC_DOWNCAST(CDriverDoc, m_pDocument);
  84. }
  85. #endif //_DEBUG
  86.  
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CDriverView message handlers
  89.  
  90. void CDriverView::OnInitialUpdate() 
  91. {
  92.     GetParentFrame()->RecalcLayout();
  93.     ResizeParentToFit(FALSE);
  94.  
  95.     CFormView::OnInitialUpdate();
  96.  
  97.     if (!m_bInitialized)
  98.     {
  99.         m_bInitialized = TRUE;
  100.         GetDlgItem(IDC_CURRENT_COUNT)->GetWindowText(m_strCurrentCount);
  101.     }
  102.  
  103.     // initialize the form
  104.     m_ctrlType.SetCurSel(0);
  105.     UpdateToNothing();
  106. }
  107.  
  108. void CDriverView::UpdateToNothing()
  109. {
  110.     UpdateCurrentCount();
  111.     m_toType.SetCurSel(-1);
  112.  
  113.     CString str;
  114.     str.LoadString(IDS_NOTHING);
  115.     m_toValue.SetWindowText(str);
  116. }
  117.  
  118. void CDriverView::UpdateCurrentCount()
  119. {
  120.     CDriverDoc* pDoc = GetDocument();
  121.     ASSERT_VALID(pDoc);
  122.  
  123.     CString str;
  124.     str.Format(m_strCurrentCount, pDoc->m_map->Count);
  125.     SetDlgItemText(IDC_CURRENT_COUNT, str);
  126. }
  127.  
  128. _variant_t CDriverView::GetFromVariant()
  129. {
  130.     CString strValue;
  131.     m_ctrlValue.GetWindowText(strValue);
  132.  
  133.     // we can just throw it in as a string, then coerce to chosen type
  134.     _variant_t va = (LPCTSTR) strValue, vaTemp;
  135.  
  136.     try
  137.     {
  138.         vaTemp.ChangeType(max(0, m_ctrlType.GetCurSel()), &va);
  139.     }
  140.     catch (_com_error& e)
  141.     {
  142.         dump_com_error(e);
  143.         AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
  144.     }
  145.     return vaTemp;
  146. }
  147.  
  148. _variant_t CDriverView::GetToVariant()
  149. {
  150.     CString strValue;
  151.     m_toValue.GetWindowText(strValue);
  152.  
  153.     // we can just throw it in as a string, then coerce to chosen type
  154.     _variant_t va = (LPCTSTR) strValue, vaTemp;
  155.  
  156.     try
  157.     {
  158.         vaTemp.ChangeType(max(0, m_toType.GetCurSel()), &va);
  159.     }
  160.     catch (_com_error& e)
  161.     {
  162.         dump_com_error(e);
  163.         AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
  164.     }
  165.     return vaTemp;
  166. }
  167.     
  168. void CDriverView::UpdateCurrentVariant(const _variant_t& va)
  169. {
  170.     m_toType.SetCurSel(va.vt);
  171.  
  172.     _variant_t vaTemp;
  173.     CString str;
  174.     try
  175.     {
  176.         vaTemp.ChangeType(VT_BSTR, &va);
  177.         str = (LPCTSTR) (_bstr_t) vaTemp;
  178.     }
  179.     catch (...)
  180.     {
  181.         str.LoadString(IDS_UNKNOWN);
  182.     }
  183.     
  184.     m_toValue.SetWindowText(str);
  185. }
  186.  
  187. void CDriverView::OnLookup() 
  188. {
  189.     CDriverDoc* pDoc = GetDocument();
  190.     ASSERT_VALID(pDoc);
  191.  
  192.     _variant_t vaFrom = GetFromVariant();
  193.     _variant_t vaTo = pDoc->m_map->Item[vaFrom];
  194.     UpdateCurrentVariant(vaTo);
  195. }
  196.  
  197. void CDriverView::OnRemove() 
  198. {
  199.     CDriverDoc* pDoc = GetDocument();
  200.     ASSERT_VALID(pDoc);
  201.  
  202.     _variant_t vaFrom = GetFromVariant();
  203.     pDoc->m_map->RemoveKey(vaFrom);
  204.     
  205.     UpdateToNothing();
  206.     UpdateCurrentCount();
  207. }
  208.  
  209. void CDriverView::OnAdd() 
  210. {
  211.     CDriverDoc* pDoc = GetDocument();
  212.     ASSERT_VALID(pDoc);
  213.  
  214.     _variant_t vaFrom = GetFromVariant();
  215.     _variant_t vaTo = GetToVariant();
  216.     pDoc->m_map->SetAt(vaFrom, vaTo);
  217.     
  218.     OnLookup();
  219.     UpdateCurrentCount();
  220. }
  221.  
  222. void CDriverView::OnButton1() 
  223. {
  224.     CDriverDoc* pDoc = GetDocument();
  225.     ASSERT_VALID(pDoc);
  226.  
  227.     long nCount = 0;
  228.     DWORD dwThen = GetTickCount();
  229.  
  230.     if (GetKeyState(VK_CONTROL) >= 0)
  231.     {
  232.         while (GetTickCount() - dwThen < 5000)
  233.         {
  234.             pDoc->m_map->str1 = _T("Hello, World");
  235.             ++nCount;
  236.         }
  237.     }
  238.     else
  239.     {
  240.         while (GetTickCount() - dwThen < 5000)
  241.         {
  242.             pDoc->m_map->i1 = 1;
  243.             ++nCount;
  244.         }
  245.     }
  246.     CString str, strFormat;
  247.     strFormat.LoadString(IDP_TIMING_RESULT);
  248.     str.Format(strFormat, nCount);
  249.     AfxMessageBox(str);
  250. }
  251.  
  252. void CDriverView::OnButton2() 
  253. {
  254.     CDriverDoc* pDoc = GetDocument();
  255.     ASSERT_VALID(pDoc);
  256.  
  257.     long nCount = 0;
  258.     DWORD dwThen = GetTickCount();
  259.  
  260.     if (GetKeyState(VK_CONTROL) >= 0)
  261.     {
  262.         while (GetTickCount() - dwThen < 5000)
  263.         {
  264.             pDoc->m_map->str2 = _T("Hello, World");
  265.             ++nCount;
  266.         }
  267.     }
  268.     else
  269.     {
  270.         while (GetTickCount() - dwThen < 5000)
  271.         {
  272.             pDoc->m_map->i2 = 1;
  273.             ++nCount;
  274.         }
  275.     }
  276.     CString str, strFormat;
  277.     strFormat.LoadString(IDP_TIMING_RESULT);
  278.     str.Format(strFormat, nCount);
  279.     AfxMessageBox(str);
  280. }
  281.