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

  1. /*
  2.   Program to demonstrate MDI windows with controls
  3. */
  4. #include <owl\mdi.rh>
  5. #include <owl\applicat.h>
  6. #include <owl\framewin.h>
  7. #include <owl\button.h>
  8. #include <owl\edit.h>
  9. #include <owl\checkbox.h>
  10. #include <owl\scroller.h>
  11. #include <owl\mdi.h>
  12. #include "mdi2.h"
  13. #include <stdio.h>
  14. #include <string.h>
  15.  
  16. // declare constants for sizing and spacing the controls
  17. // in the MDI child window
  18. const Wbtn = 50 * 3;
  19. const Hbtn = 30;
  20. const BtnHorzSpacing = 20;
  21. const BtnVertSpacing = 10;
  22. const Wchk = 200 * 3;
  23. const Hchk = 20;
  24. const ChkVertSpacing = 10;
  25. const Wbox = 400 * 3;
  26. const Hbox = 200 * 3;
  27.  
  28. // declare the constants for the random text that appears
  29. // in the MDI child window
  30. const MaxWords = 200;
  31. const WordsPerLine = 10;
  32. const NumWords = 10;
  33. const BufferSize = 1024;
  34. char AppBuffer[BufferSize];
  35. char* Words[NumWords] = { "The ", "friend ", "saw ", "the ",
  36.               "girl ", "drink ", "milk ", "boy ",
  37.               "cake ", "bread " };
  38.  
  39.  
  40. BOOL ExpressClose = FALSE;
  41. int NumMDIChild = 0;
  42. int HighMDIindex = 0;
  43.  
  44. class TWinApp : public TApplication
  45. {
  46. public:
  47.   TWinApp() : TApplication() {}
  48.  
  49. protected:
  50.   virtual void InitMainWindow();
  51. };
  52.  
  53. class TAppMDIChild : public TMDIChild
  54. {
  55. public:
  56.  
  57.  
  58.   TAppMDIChild(TMDIClient& parent, int ChildNum);
  59.  
  60. protected:
  61.   
  62.   TEdit* TextBox;
  63.   TCheckBox* CanCloseChk;
  64.  
  65.   // handle the UpperCase button
  66.   void HandleUpperCaseBtn()
  67.     { CMUpperCase(); }
  68.  
  69.   // handle the LowerCase button
  70.   void HandleLowerCaseBtn()
  71.     { CMLowerCase(); }
  72.  
  73.   // handle clear the active MDI child
  74.   void CMClear()
  75.     { TextBox->Clear(); }
  76.  
  77.   // handle converting the text of the active
  78.   // MDI child to uppercase
  79.   void CMUpperCase();
  80.  
  81.   // handle converting the text of the active
  82.   // MDI child to lowercase
  83.   void CMLowerCase();
  84.  
  85.   // handle resetting the text of the active MDI child
  86.   void CMReset();
  87.  
  88.   // reset the text in an MDI child window
  89.   void InitText();
  90.  
  91.   // handle closing the MDI child window
  92.   virtual BOOL CanClose();
  93.  
  94.   // declare response table
  95.   DECLARE_RESPONSE_TABLE(TAppMDIChild);
  96. };
  97.  
  98. DEFINE_RESPONSE_TABLE1(TAppMDIChild, TMDIChild)
  99.   EV_COMMAND(ID_UPPERCASE_BTN, HandleUpperCaseBtn),
  100.   EV_COMMAND(ID_LOWERCASE_BTN, HandleLowerCaseBtn),
  101.   EV_COMMAND(CM_CLEAR, CMClear),
  102.   EV_COMMAND(CM_UPPERCASE, CMUpperCase),
  103.   EV_COMMAND(CM_LOWERCASE, CMLowerCase),
  104.   EV_COMMAND(CM_RESET, CMReset),
  105. END_RESPONSE_TABLE;
  106.  
  107. class TAppMDIClient : public TMDIClient
  108. {
  109. public:
  110.  
  111.  TAppMDIClient() : TMDIClient() {}
  112.  
  113.  protected:
  114.  
  115.   // create a new child
  116.   virtual TMDIChild* InitChild();
  117.  
  118.   // close all MDI children
  119.   virtual BOOL CloseChildren();
  120.  
  121.   // handle the command for counting the MDI children
  122.   void CMCountChildren();
  123.  
  124.   // handle closing the MDI frame window
  125.   virtual BOOL CanClose();
  126.  
  127.   // declare response table
  128.   DECLARE_RESPONSE_TABLE(TAppMDIClient);
  129. };
  130.  
  131. DEFINE_RESPONSE_TABLE1(TAppMDIClient, TMDIClient)
  132.   EV_COMMAND(CM_COUNTCHILDREN, CMCountChildren),
  133. END_RESPONSE_TABLE;
  134.  
  135. TAppMDIChild::TAppMDIChild(TMDIClient& parent, int ChildNum)
  136.   : TMDIChild(parent),
  137.     TFrameWindow(&parent),
  138.     TWindow(&parent)
  139. {
  140.   char s[41];
  141.   int x0 = 10;
  142.   int y0 = 10;
  143.   int x = x0;
  144.   int y = y0;
  145.  
  146.   // set the scrollers in the window
  147.   Attr.Style |= WS_VSCROLL | WS_HSCROLL;
  148.   // create the TScroller instance
  149.   Scroller = new TScroller(this, 200, 15, 10, 50);
  150.  
  151.   // set MDI child window title
  152.   sprintf(s, "%s%i", "Child #", ChildNum);
  153.   Title = _fstrdup(s);
  154.  
  155.   // create the push button controls
  156.   new TButton(this, ID_UPPERCASE_BTN, "->UpperCase",
  157.               x, y, Wbtn, Hbtn, TRUE);
  158.   x += Wbtn + BtnHorzSpacing;
  159.   new TButton(this, ID_LOWERCASE_BTN, "->LowerCase",
  160.               x, y, Wbtn, Hbtn, FALSE);
  161.  
  162.   x = x0;
  163.   y += Hbtn + BtnVertSpacing;
  164.   CanCloseChk = new TCheckBox(this, ID_CANCLOSE_CHK, "Can Close",
  165.                               x, y, Wchk, Hchk, NULL);
  166.   y += Hchk + ChkVertSpacing;
  167.   InitText();
  168.   // create the edit box
  169.   TextBox = new TEdit(this, ID_TEXT_EDIT, AppBuffer,
  170.                              x, y, Wbox, Hbox, 0, TRUE);
  171.   // remove borders and scroll bars
  172.   TextBox->Attr.Style &= ~WS_BORDER;
  173.   TextBox->Attr.Style &= ~WS_VSCROLL;
  174.   TextBox->Attr.Style &= ~WS_HSCROLL;
  175. }
  176.  
  177. void TAppMDIChild::CMUpperCase()
  178. {
  179.   TextBox->GetText(AppBuffer, BufferSize);
  180.   strupr(AppBuffer);
  181.   TextBox->SetText(AppBuffer);
  182. }
  183.  
  184. void TAppMDIChild::CMLowerCase()
  185. {
  186.   TextBox->GetText(AppBuffer, BufferSize);
  187.   strlwr(AppBuffer);
  188.   TextBox->SetText(AppBuffer);
  189. }
  190.  
  191. void TAppMDIChild::CMReset()
  192. {
  193.   InitText();
  194.   TextBox->SetText(AppBuffer);
  195. }
  196.  
  197. BOOL TAppMDIChild::CanClose()
  198. {
  199.   // return TRUE if the ExpressClose member of the
  200.   // parent MDI frame window is TRUE
  201.   if (ExpressClose == TRUE) {
  202.     NumMDIChild--;
  203.     return TRUE;
  204.   }
  205.   else
  206.   // do not close the MDi child window if the Can Close is not checked
  207.   if (CanCloseChk->GetCheck() == BF_UNCHECKED)
  208.     return FALSE;
  209.   else {
  210.     NumMDIChild--;
  211.      return TRUE;
  212.   }
  213. }
  214.  
  215. void TAppMDIChild::InitText()
  216. {
  217.   // randomize the seed for the random-number generator
  218.   randomize();
  219.  
  220.   // assign a null string to the buffer
  221.   AppBuffer[0] = '\0';
  222.   // build the list of random words
  223.   for (int i = 0;
  224.          i < MaxWords && strlen(AppBuffer) <= (BufferSize - 10);
  225.        i++) {
  226.     if (i > 0 && i % WordsPerLine == 0)
  227.       strcat(AppBuffer, "\r\n");
  228.     strcat(AppBuffer, Words[random(NumWords)]);
  229.   }
  230. }
  231.  
  232. TMDIChild* TAppMDIClient::InitChild()
  233. {
  234.   ++NumMDIChild;
  235.   return new TAppMDIChild(*this, ++HighMDIindex);
  236. }
  237.  
  238. BOOL TAppMDIClient::CloseChildren()
  239. {
  240.   BOOL result;
  241.   // set the ExpressClose flag
  242.   ExpressClose = TRUE;
  243.   // invoke the parent class CloseChildren() member function
  244.   result = TMDIClient::CloseChildren();
  245.   // clear the ExpressClose flag
  246.   ExpressClose = FALSE;
  247.   NumMDIChild = 0;
  248.   HighMDIindex = 0;
  249.   return result;
  250. }
  251.  
  252. //  display a message box that shows the number of children
  253. void TAppMDIClient::CMCountChildren()
  254. {
  255.   char msgStr[81];
  256.  
  257.   sprintf(msgStr, "There are %i MDI children", NumMDIChild);
  258.   MessageBox(msgStr, "Information", MB_OK | MB_ICONINFORMATION);
  259. }
  260.  
  261. BOOL TAppMDIClient::CanClose()
  262. {
  263.   return MessageBox("Close this application?",
  264.             "Query", MB_YESNO | MB_ICONQUESTION) == IDYES;
  265. }
  266.  
  267. void TWinApp::InitMainWindow()
  268. {
  269.   MainWindow = new TMDIFrame("Simple MDI Text Viewer (version 2)",
  270.                   TResId(IDM_COMMANDS),
  271.                   *new TAppMDIClient);
  272. }
  273.  
  274. int OwlMain(int /* argc */, char** /*argv[] */)
  275. {
  276.   TWinApp app;
  277.   return app.Run();
  278. }
  279.  
  280.