home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tybc4 / rwdlg4.cpp < prev    next >
C/C++ Source or Header  |  1997-07-29  |  4KB  |  181 lines

  1. /*
  2.   Program to test the resourcs for the static text, edit box, 
  3.   and push button controls.
  4.   The program uses these controls to implement a command-line
  5.   oriented calculator application (COCA)
  6. */
  7.  
  8. #include <owl\applicat.h>
  9. #include <owl\framewin.h>
  10. #include <owl\dialog.h>
  11. #include <owl\window.rh>
  12. #include "rwdlg4.h"
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include <string.h>
  17.  
  18. const MaxEditLen = 40;
  19.  
  20. // declare the custom application class as
  21. // a subclass of TApplication
  22. class TWinApp : public TApplication
  23. {
  24. public:
  25.   TWinApp() : TApplication() {}
  26.  
  27. protected:
  28.   virtual void InitMainWindow();
  29. };
  30.  
  31. // expand the functionality of TWindow by
  32. // deriving class TMainWindow
  33. class TMainWindow : public TWindow
  34. {
  35. public:
  36.  
  37.   TMainWindow() : TWindow(0, 0, 0) {}
  38.  
  39. protected:
  40.   //---------------- member functions -------------------
  41.  
  42.   // handle Calc menu option
  43.   void CMCalc();
  44.  
  45.   void CMExit()
  46.     { Parent->SendMessage(WM_CLOSE); }
  47.  
  48.   // handle closing the window
  49.   virtual BOOL CanClose();
  50.  
  51.   // declare the message map macro
  52.   DECLARE_RESPONSE_TABLE(TMainWindow);
  53.  
  54. };
  55.  
  56. class TCalcDialog : public TDialog
  57. {
  58. public:
  59.  
  60.   TCalcDialog(TWindow* parent, TResId resID);
  61.  
  62. protected:
  63.  
  64.   // math error flag
  65.   BOOL InError;
  66.  
  67.   //---------------- member functions -------------------
  68.  
  69.   // handle the calculation
  70.   void HandleCalcBtn();
  71.  
  72.   // declare the message map macro
  73.   DECLARE_RESPONSE_TABLE(TCalcDialog);
  74. };
  75.  
  76. DEFINE_RESPONSE_TABLE1(TMainWindow, TWindow)
  77.   EV_COMMAND(CM_CALC, CMCalc),
  78. END_RESPONSE_TABLE;
  79.  
  80.  
  81. DEFINE_RESPONSE_TABLE1(TCalcDialog, TDialog)
  82.   EV_COMMAND(IDC_CALC_BTN, HandleCalcBtn),
  83. END_RESPONSE_TABLE;
  84.  
  85. TCalcDialog::TCalcDialog(TWindow* parent, TResId resID) :
  86.           TWindow(0, 0, 0), TDialog(parent, resID)
  87. {
  88.   // clear the InError flag
  89.   InError = FALSE;
  90. }
  91.  
  92. void TCalcDialog::HandleCalcBtn()
  93. {
  94.   double x, y, z;
  95.   char opStr[MaxEditLen+1];
  96.   char s[MaxEditLen+1];
  97.  
  98.   // obtain the string in the Operand1 edit box
  99.   GetDlgItemText(IDC_OPERAND1_BOX, s, MaxEditLen);
  100.   // convert the string in the edit box
  101.   x = atof(s);
  102.  
  103.   // obtain the string in the Operand2 edit box
  104.   GetDlgItemText(IDC_OPERAND2_BOX, s, MaxEditLen);
  105.   // convert the string in the edit box
  106.   y = atof(s);
  107.  
  108.   // obtain the string in the Operator edit box
  109.   GetDlgItemText(IDC_OPERATOR_BOX, opStr, MaxEditLen);
  110.  
  111.   // clear the error message box
  112.   SetDlgItemText(IDC_ERRMSG_BOX, "");
  113.   InError = FALSE;
  114.  
  115.   // determine the requested operation
  116.   if (strcmp(opStr, "+") == 0)
  117.     z = x + y;
  118.   else if (strcmp(opStr, "-") == 0)
  119.     z = x - y;
  120.   else if (strcmp(opStr, "*") == 0)
  121.     z = x * y;
  122.   else if (strcmp(opStr, "/") == 0) {
  123.     if (y != 0)
  124.         z = x / y;
  125.     else {
  126.       z = 0;
  127.       InError = TRUE;
  128.       SetDlgItemText(IDC_ERRMSG_BOX, "Division-by-zero error");
  129.     }
  130.   }
  131.   else if (strcmp(opStr, "^") == 0) {
  132.     if (x > 0)
  133.       z = exp(y * log(x));
  134.     else {
  135.       InError = TRUE;
  136.         SetDlgItemText(IDC_ERRMSG_BOX,
  137.            "Cannot raise the power of a negative number");
  138.     }
  139.   }
  140.   else {
  141.     InError = TRUE;
  142.     SetDlgItemText(IDC_ERRMSG_BOX, "Invalid operator");
  143.   }
  144.   // display the result if no error has occurred
  145.   if (!InError) {
  146.     sprintf(s, "%g", z);
  147.     SetDlgItemText(IDC_RESULT_BOX, s);
  148.   }
  149. }
  150.  
  151. void TMainWindow::CMCalc()
  152. {
  153.   TCalcDialog* pDlg = new TCalcDialog(this, TResId(IDD_CALC_DLG));
  154.   pDlg->Execute();
  155. }
  156.  
  157. BOOL TMainWindow::CanClose()
  158. {
  159.   return MessageBox("Want to close this application?",
  160.                     "Query", MB_YESNO | MB_ICONQUESTION) == IDYES;
  161. }
  162.  
  163. void TWinApp::InitMainWindow()
  164. {
  165.   MainWindow = new TFrameWindow(0,
  166.          "Command-Oriented Calculator Application",
  167.          new TMainWindow);
  168.   // load the menu resource
  169.   MainWindow->AssignMenu(TResId(EXITMENU));
  170.   // enable the keyboard handler
  171.   MainWindow->EnableKBHandler();
  172. }
  173.  
  174. int OwlMain(int /* argc */, char** /*argv[] */)
  175. {
  176.   TWinApp app;
  177.   return app.Run();
  178. }
  179.  
  180.  
  181.