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

  1. // calcdriv.cpp : Defines the class behaviors for the application.
  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 "calcdriv.h"
  15.  
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char BASED_CODE THIS_FILE[] = __FILE__;
  19. #endif
  20.  
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CCalcDrivApp
  23.  
  24. BEGIN_MESSAGE_MAP(CCalcDrivApp, CWinApp)
  25.     //{{AFX_MSG_MAP(CCalcDrivApp)
  26.         // NOTE - the ClassWizard will add and remove mapping macros here.
  27.         //    DO NOT EDIT what you see in these blocks of generated code!
  28.     //}}AFX_MSG_MAP
  29.     // Standard file based document commands
  30. END_MESSAGE_MAP()
  31.  
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CCalcDrivApp construction
  34.  
  35. CCalcDrivApp::CCalcDrivApp()
  36. {
  37.     // TODO: add construction code here,
  38.     // Place all significant initialization in InitInstance
  39. }
  40.  
  41. /////////////////////////////////////////////////////////////////////////////
  42. // The one and only CCalcDrivApp object
  43.  
  44. CCalcDrivApp NEAR theApp;
  45.  
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CCalcDrivApp initialization
  48.  
  49. BOOL CCalcDrivApp::InitInstance()
  50. {
  51. #if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
  52.     #ifndef _MAC
  53.         // turn on extra memory tracking
  54.         afxMemDF |= checkAlwaysMemDF;
  55.     #endif
  56. #endif
  57.  
  58.     // Initialize OLE 2.0 libraries
  59.     if (!AfxOleInit())
  60.     {
  61.         AfxMessageBox(IDP_OLE_INIT_FAILED);
  62.         return FALSE;
  63.     }
  64.  
  65.     // Standard initialization
  66.     // If you are not using these features and wish to reduce the size
  67.     //  of your final executable, you should remove from the following
  68.     //  the specific initialization routines you do not need.
  69.  
  70.     Enable3dControls();    // Use 3d controls in dialogs
  71.  
  72.     // Simple application that simply invokes a dialog
  73.     CDriverDlg dlg;
  74.     m_pMainWnd = &dlg;
  75.     dlg.DoModal();
  76.  
  77.     return FALSE;   // don't run after the dialog is done
  78. }
  79.  
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CDriverDlg dialog
  82.  
  83. CDriverDlg::CDriverDlg(CWnd* pParent /*=NULL*/)
  84.     : CDialog(CDriverDlg::IDD, pParent)
  85. {
  86.     //{{AFX_DATA_INIT(CDriverDlg)
  87.     //}}AFX_DATA_INIT
  88. }
  89.  
  90. CDriverDlg::~CDriverDlg()
  91. {
  92.     TRY
  93.     {
  94.         // shut down the calculator
  95.         //  (since calculator shows its user-interface, it would stay active
  96.         //  if we didn't shut it down with a call to its Quit method)
  97.         m_calc.Close();
  98.     }
  99.     END_TRY
  100. }
  101.  
  102. void CDriverDlg::DoDataExchange(CDataExchange* pDX)
  103. {
  104.     CDialog::DoDataExchange(pDX);
  105.     //{{AFX_DATA_MAP(CDriverDlg)
  106.     DDX_Control(pDX, IDD_LAST_OPERATOR, m_stcOperator);
  107.     DDX_Control(pDX, IDD_LAST_OPERAND, m_stcOperand);
  108.     DDX_Control(pDX, IDC_LAST_ACCUM, m_stcAccum);
  109.     DDX_Control(pDX, IDC_EXPRESSION, m_editExpression);
  110.     //}}AFX_DATA_MAP
  111. }
  112.  
  113. BEGIN_MESSAGE_MAP(CDriverDlg, CDialog)
  114.     //{{AFX_MSG_MAP(CDriverDlg)
  115.     ON_BN_CLICKED(IDC_GO, OnGo)
  116.     ON_BN_CLICKED(IDC_SINGLE_STEP, OnSingleStep)
  117.     ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
  118.     //}}AFX_MSG_MAP
  119. END_MESSAGE_MAP()
  120.  
  121.  
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CDriverDlg message handlers
  124.  
  125. void CDriverDlg::OnGo()
  126. {
  127.     // get current expression from the edit control
  128.     CString strExpression;
  129.     m_editExpression.GetWindowText(strExpression);
  130.     LPCTSTR psz = strExpression;
  131.  
  132.     // send all characters in the edit control from start to end
  133.     int nLen = strExpression.GetLength();
  134.     int nStart, nEnd;
  135.     m_editExpression.GetSel(nStart, nEnd);
  136.     if (nStart == nLen)
  137.         nStart = 0;
  138.     psz += nStart;
  139.     while (*psz != '\0')
  140.     {
  141.         TCHAR szTemp[2];
  142.         szTemp[0] = *psz;
  143.         szTemp[1] = '\0';
  144.         m_calc.Button(szTemp);
  145.         ++psz;
  146.     }
  147.     m_editExpression.SetSel(nLen, nLen);
  148.  
  149.     OnRefresh();    // refresh after all button commands sent
  150.     m_calc.Evaluate();
  151.     m_calc.Display();
  152. }
  153.  
  154. void CDriverDlg::OnSingleStep()
  155. {
  156.     // get current expression from the edit control
  157.     CString strExpression;
  158.     m_editExpression.GetWindowText(strExpression);
  159.     LPCTSTR psz = strExpression;
  160.  
  161.     // send first character in selection, then move selection to next
  162.     int nStart, nEnd;
  163.     m_editExpression.GetSel(nStart, nEnd);
  164.     psz += nStart;
  165.     if (*psz != '\0')
  166.     {
  167.         TCHAR szTemp[2];
  168.         szTemp[0] = *psz;
  169.         szTemp[1] = '\0';
  170.         m_calc.Button(szTemp);
  171.  
  172.         OnRefresh();        // refresh after each step
  173.  
  174.         // move to next character for next single-step
  175.         m_editExpression.SetSel(nStart+1,
  176.             min(strExpression.GetLength(), nStart+2));
  177.     }
  178.     else
  179.     {
  180.         m_calc.Evaluate();
  181.         m_calc.Display();
  182.         // stepping from end will start at beginning next time
  183.         m_editExpression.SetSel(0, min(strExpression.GetLength(), 1));
  184.     }
  185.     OnRefresh();    // refresh after all button commands sent
  186. }
  187.  
  188. void CDriverDlg::OnRefresh()
  189. {
  190.     TCHAR buf[64];
  191.     long lResult = m_calc.GetOperand();
  192.     wsprintf(buf, _T("%ld"), lResult);
  193.     m_stcOperand.SetWindowText(buf);
  194.  
  195.     long lAccum = m_calc.GetAccum();
  196.     wsprintf(buf, _T("%ld"), lAccum);
  197.     m_stcAccum.SetWindowText(buf);
  198.  
  199.     short nOp = m_calc.GetOperation();
  200.     static TCHAR operators[5] = { '?', '+', '-', '*', '/'};
  201.     if (nOp < 0 || nOp > 4)
  202.         nOp = 0;
  203.     wsprintf(buf, _T("%c"), operators[nOp]);
  204.     m_stcOperator.SetWindowText(buf);
  205. }
  206.  
  207. BOOL CDriverDlg::OnInitDialog()
  208. {
  209.     CDialog::OnInitDialog();
  210.  
  211.     // create the calculator object that we'll drive through OLE automation
  212.     COleException e;
  213.     CLSID clsid;
  214.     if (CLSIDFromProgID(OLESTR("mfccalc.calculator"), &clsid) != NOERROR)
  215.     {
  216.         AfxMessageBox(IDP_UNABLE_TO_CREATE);
  217.         EndDialog(IDABORT);
  218.         return FALSE;
  219.     }
  220.  
  221.     // try to get the active calculator before creating a new one
  222.     LPUNKNOWN lpUnk;
  223.     LPDISPATCH lpDispatch;
  224.     if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR)
  225.     {
  226.         HRESULT hr = lpUnk->QueryInterface(IID_IDispatch, 
  227.             (LPVOID*)&lpDispatch);
  228.         lpUnk->Release();
  229.         if (hr == NOERROR)
  230.             m_calc.AttachDispatch(lpDispatch, TRUE);
  231.     }
  232.  
  233.     // if not dispatch ptr attached yet, need to create one
  234.     if (m_calc.m_lpDispatch == NULL && 
  235.         !m_calc.CreateDispatch(clsid, &e))
  236.     {
  237.         AfxMessageBox(IDP_UNABLE_TO_CREATE);
  238.         EndDialog(IDABORT);
  239.         return FALSE;
  240.     }
  241.  
  242.     // attempt to make it visible
  243.     m_calc.SetVisible(TRUE);
  244.     if (!m_calc.GetVisible())
  245.     {
  246.         AfxMessageBox(IDP_UNABLE_TO_SHOW);
  247.         EndDialog(IDABORT);
  248.         return FALSE;
  249.     }
  250.  
  251.     // refresh display to contents of the automation calculator
  252.     OnRefresh();
  253.  
  254.     return TRUE;  // return TRUE  unless you set the focus to a control
  255. }
  256.