home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / autocalc.pak / CALLCALC.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  7KB  |  254 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents - (C) Copyright 1994 by Borland International
  3. // OLE Automation Controller example
  4. //----------------------------------------------------------------------------
  5. #include <stdio.h>
  6. #include <string.h>
  7. #pragma hdrstop
  8. #include "autocalc.cxx"
  9. #include "callcalc.rh"
  10.  
  11. const GUID _cdecl FAR IID_CalcApplication =
  12.       {0x877B6200L,0x7627,0x101B,{0xB8,0x7C,0x00,0x00,0xC0,0x57,0xCE,0x4E}};
  13.  
  14. const GUID _cdecl FAR IID_CalcDebug =
  15.       {0x877B6201L,0x7627,0x101B,{0xB8,0x7C,0x00,0x00,0xC0,0x57,0xCE,0x4E}};
  16.  
  17. const GUID _cdecl FAR IID_CalcDllServer =
  18.       {0x877B6280L,0x7627,0x101B,{0xB8,0x7C,0x00,0x00,0xC0,0x57,0xCE,0x4E}};
  19.  
  20. #define ExeProgId   "OCCalc.Application"
  21. #define DllProgId   "OCCalc.DllServer"
  22. #define DebugProgId "OCCalc.Debug"
  23.  
  24. class TOutputDialog {
  25.   public:
  26.     TOutputDialog(HINSTANCE hInst, int resId);
  27.    ~TOutputDialog() {::DestroyWindow(Window);}
  28.     void Display(int id, const char far* text);
  29.     void Display(int id, long val);
  30.     void Press(int id, bool state);
  31.     void Show(int id, bool state);
  32.     void Pump();
  33.     void Hold();
  34.     int  Wait();
  35.     operator HWND() {return Window;}
  36.   private:
  37.     void ReportResult(long value);
  38.     void Dispatch(MSG& msg);
  39.     HINSTANCE Instance;
  40.     HWND Window;
  41.  
  42.   DECLARE_AUTOCLASS(TOutputDialog)
  43.     AUTOPROPWO(ReportResult, ReportResult, long, )
  44. };
  45. DEFINE_AUTOCLASS(TOutputDialog)
  46.  EXPOSE_PROPWO_ID(0, ReportResult, TAutoLong, "Value", "Result update", 0)
  47. END_AUTOCLASS(TOutputDialog, tfNormal,"TOutputDialog", "Callback object", 0)
  48.  
  49. void TOutputDialog::ReportResult(long value)
  50. {
  51.   Display(IDC_ACCUM, value);
  52. }
  53.  
  54. #define WM_USERSTAT (WM_USER + 100)
  55.  
  56. bool CALLBACK __export
  57. DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/)
  58. {
  59.   if (msg == WM_INITDIALOG) {
  60.     return 1;
  61.   } else if (msg == WM_COMMAND && wParam >= IDOK && wParam <= IDNO) {
  62.     ::PostMessage(hDlg, WM_USERSTAT, wParam, 0);
  63.     return 1;
  64.   } else if (msg == WM_CLOSE) {
  65.     ::PostMessage(hDlg, WM_USERSTAT, IDABORT, 0);
  66.     return 1;
  67.   }
  68.   return 0;
  69. }
  70.  
  71. TOutputDialog::TOutputDialog(HINSTANCE hInst, int resId)
  72. {
  73.   Window = ::CreateDialog(hInst, MAKEINTRESOURCE(resId), 0, (DLGPROC)DlgProc);
  74.   Pump();
  75. }
  76.  
  77. void TOutputDialog::Dispatch(MSG& msg)
  78. {
  79.   if (::IsDialogMessage(Window, &msg))
  80.     return;
  81.   ::TranslateMessage(&msg);
  82.   ::DispatchMessage(&msg);
  83. }
  84.  
  85. void TOutputDialog::Pump()
  86. {
  87.   MSG msg;
  88.   while (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  89.     Dispatch(msg);
  90. }
  91.  
  92. void TOutputDialog::Hold()
  93. {
  94.   MSG msg;
  95.   while (!::GetFocus()
  96. #if 0
  97.     || ::GetWindowTask(::GetFocus())!=::GetCurrentTask())
  98. #endif
  99.     )
  100.     if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  101.       Dispatch(msg);
  102. }
  103.  
  104. int TOutputDialog::Wait()
  105. {
  106.   MSG msg;
  107.   int stat = 0;
  108.   while ( !stat && ::GetMessage(&msg, 0, 0, 0)) {
  109.     if (msg.message == WM_USERSTAT)
  110.       stat = msg.wParam;
  111.     else
  112.       Dispatch(msg);
  113.   }
  114.   return stat;
  115. }
  116.  
  117. void TOutputDialog::Display(int id, const char far* text)
  118. {
  119.   ::SetDlgItemText(Window, id, text);
  120. }
  121.  
  122. void TOutputDialog::Display(int id, long val)
  123. {
  124.   char buf[20];
  125.   wsprintf(buf, "%ld", val);
  126.   Display(id, buf);
  127. }
  128.  
  129. void TOutputDialog::Press(int id, bool state)
  130. {
  131.   ::SendDlgItemMessage(Window, id, BM_SETSTATE, state, 0);
  132. }
  133.  
  134. void TOutputDialog::Show(int id, bool state)
  135. {
  136.   ::ShowWindow(::GetDlgItem(Window, id), state ? SW_SHOWNOACTIVATE : SW_HIDE);
  137.   Pump();
  138. }
  139.  
  140. //____________________________________________________________________________
  141.  
  142. const char* passName[] = {"GUID: AUTOCALC.EXE",      "ProgID: " ExeProgId,
  143.                           "GUID: ACALDIPS.DLL",      "ProgID: " DllProgId,
  144.                           "GUID: AUTOCALC.EXE-DEBUG","ProgID: " DebugProgId};
  145.  
  146. int PASCAL
  147. WinMain(HINSTANCE hInst, HINSTANCE/*prev*/, char far* cmdLine, int/*show*/)
  148. {
  149.   char buf[100];
  150.   try {
  151.     short i;
  152.     TOutputDialog out(hInst, 1);
  153.     TOleAllocator oleMem(0);   // required to initialize OLE memory allocation
  154.     if (!cmdLine || !cmdLine[0])
  155.       cmdLine = "1234";
  156.     char far* passList = cmdLine;
  157.     char pass;
  158.     while ((pass = *passList++)!=0) {
  159.  
  160.       // Initialize display dialog
  161.       //
  162.       if (pass < '1' || pass > '6')
  163.         continue;
  164.       out.Show(IDC_EXIT,   false);
  165.       out.Show(IDC_REPEAT, false);
  166.       for (int b = IDC_FIRSTBUTTON; b <= IDC_LASTBUTTON; b++)
  167.         out.Show(b, false);
  168.       for (int t = IDC_FIRSTTEXT; t <= IDC_LASTTEXT; t++)
  169.         out.Display(t, "");
  170.       out.Display(IDC_PASS, passName[pass-'1']);
  171.  
  172.       // Bind to server, do some arithmetic on the caclculator
  173.       //
  174.       TCalc calc;
  175.       switch (pass) {
  176.         case '1': calc.Bind(IID_CalcApplication); break;
  177.         case '2': calc.Bind(ExeProgId);           break;
  178.         case '3': calc.Bind(IID_CalcDllServer);   break;
  179.         case '4': calc.Bind(DllProgId);           break;
  180.         case '5': calc.Bind(IID_CalcDebug);       break;
  181.         case '6': calc.Bind(DebugProgId);         break;
  182.       }
  183.       calc.SetUpdate(*new TDispatch(TAutoObject<TOutputDialog>(out)));
  184.       calc.SetOperand(pass-'0');
  185.       calc.SetOp("Add");
  186.       calc.Evaluate();
  187.       calc.SetOperand(1111);
  188.       calc.Button("*");
  189.       calc.Evaluate(); // callback will display in IDC_ACCUM
  190.       calc.Display();
  191.  
  192.       // Iteratate over integer array collection
  193.       //
  194.       TCalcArray calcArray;
  195.       calc.GetArray(calcArray);
  196.       TAutoEnumerator<short> array;
  197.       calcArray.Enumerate(array);
  198.       char* bp = buf;
  199.       while (array.Step()) {
  200.         array.Value(i);
  201.         bp += wsprintf(bp, "%i ", i);
  202.       }
  203.       out.Display(IDC_ARRAY, buf);
  204.  
  205.       // Access calculator window, read and write caption
  206.       //
  207.       TCalcWindow window;
  208.       calc.GetWindow(window);
  209.       wsprintf(buf, "Pass %c of CALLCALC", pass);
  210.       window.SetCaption(buf);
  211.       out.Display(IDC_CAPTION, window.GetCaption());
  212.       window.SetColor(RGB(0,255,0));
  213.  
  214.       // Iterate over button collection, pushing and releasing buttons
  215.       //
  216.       TButtonList buttons;
  217.       window.GetButtons(buttons);
  218.       TAutoEnumerator<TCalcButton> list;
  219.       buttons.Enumerate(list);
  220.       TCalcButton button;
  221.       for (i = IDC_FIRSTBUTTON; list.Step(); i++) {
  222.         list.Object(button);
  223.         button.SetActivate(true);
  224.         out.Display(i, button.GetText());
  225.         out.Press(i, true);
  226.         out.Show(i, true);
  227.       }
  228.       window.SetColor(RGB(255,0,0));
  229.       for (int bi = (int)buttons.GetCount(); --bi >= 0; ) {
  230.         buttons.Item(button, (short)bi);
  231.         button.SetActivate(false);
  232.         out.Press(IDC_FIRSTBUTTON + bi, false);
  233.         out.Display(IDC_FIRSTBUTTON + bi, button.GetText());
  234.       }
  235.  
  236.       // Terminate calculator, wait for user response if end of run
  237.       //
  238.       out.Pump();
  239.       if (*passList == 0) {
  240.         out.Show(IDC_EXIT,   true);
  241.         out.Show(IDC_REPEAT, true);
  242.         if (out.Wait() == IDC_REPEAT)
  243.           passList = cmdLine;
  244.       }
  245.       calc.Quit();
  246.     }
  247.     ::CoFreeUnusedLibraries();
  248.   }
  249.   catch (TXBase& x) {
  250.     ::MessageBox(0, x.why().c_str(), "OLE Exception", MB_OK);
  251.   }
  252.   return 0;
  253. }
  254.