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

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl\owlpch.h>
  5. #include <owl\applicat.h>
  6. #include <owl\dialog.h>
  7. #include <owl\dc.h>
  8. #include <stdio.h>
  9. #include "tscrnsav.h"
  10. #include "owlscrn.h"
  11.  
  12. //#define USE_BWCC
  13.  
  14. #if defined(USE_BWCC)
  15.   #define IDD_CONFIGURE "IDD_CONFIGURE_BWCC"
  16. #else
  17.   #define IDD_CONFIGURE "IDD_CONFIGURE"
  18. #endif
  19.  
  20. const char OwlScrnSectionStr[] = "OwlScreenSaver";
  21. const char ObjectsStr[] = "Objects";
  22. const char SpeedStr[] = "Speed";
  23. char  AppName[]  = "ScreenSaver.OWLSample";
  24. const int NumThings = 900;
  25. const int MaxBuilders = 8;
  26.  
  27. class TScreenThing {
  28.   public:
  29.     TScreenThing(TSize& scrnSize);
  30.  
  31.     virtual void Draw(TDC& dc) = 0;
  32.  
  33.   protected:
  34.     const TPoint& Position() {return Pos;}
  35.     const TColor& Color() {return C;}
  36.  
  37.   private:
  38.     TPoint  Pos;
  39.     TColor  C;
  40. };
  41.  
  42. typedef TScreenThing* (*TScreenThingBuilder)(TSize&);
  43.  
  44. TScreenThing::TScreenThing(TSize& scrnSize)
  45. {
  46.   Pos.x = random(scrnSize.cx + 1);
  47.   Pos.y = random(scrnSize.cy + 1);
  48.   C = TColor(random(0x100), random(0x100), random(0x100));
  49. }
  50.  
  51.  
  52. class TDot : public TScreenThing {
  53.   public:
  54.     TDot(TSize& scrnSize) : TScreenThing(scrnSize) {}
  55.  
  56.     virtual void Draw(TDC& dc);
  57.  
  58.     static TScreenThing* Build(TSize& scrnSize) {return new TDot(scrnSize);}
  59. };
  60.  
  61. void
  62. TDot::Draw(TDC& dc)
  63. {
  64.   dc.SetPixel(Position(), Color());
  65. }
  66.  
  67. class TLine : public TScreenThing  {
  68.   public:
  69.     TLine(TSize& scrnSize) : TScreenThing(scrnSize) {
  70.       End.x = random(scrnSize.cx + 1);
  71.       End.y = random(scrnSize.cy + 1);
  72.     }
  73.  
  74.     virtual void Draw(TDC& dc);
  75.  
  76.     static TScreenThing* Build(TSize& scrnSize) {return new TLine(scrnSize);}
  77.  
  78.   private:
  79.     TPoint  End;
  80. };
  81.  
  82. void
  83. TLine::Draw(TDC& dc)
  84. {
  85.   dc.SelectObject(TPen(Color()));
  86.   dc.MoveTo(Position());
  87.   dc.LineTo(End);
  88.   dc.RestorePen();
  89. }
  90.  
  91. class TBlob : public TScreenThing  {
  92.   public:
  93.     TBlob(TSize& scrnSize) : TScreenThing(scrnSize) {
  94.       Rad.cx = random(scrnSize.cx/20);
  95.       Rad.cy = random(scrnSize.cy/20);
  96.     }
  97.  
  98.     virtual void Draw(TDC& dc);
  99.     static TScreenThing* Build(TSize& scrnSize) {return new TBlob(scrnSize);}
  100.  
  101.   private:
  102.     TSize  Rad;
  103. };
  104.  
  105. void
  106. TBlob::Draw(TDC& dc)
  107. {
  108.   dc.SelectObject(TBrush(Color()));
  109.   dc.Ellipse(Position().x-Rad.cx, Position().y-Rad.cy,
  110.              Position().x+Rad.cx, Position().y+Rad.cy);
  111.   dc.RestoreBrush();
  112. }
  113.  
  114. //----------------------------------------------------------------------------
  115.  
  116. class TMyScrnSavWindow : public TScrnSavWindow {
  117.   public:
  118.     TMyScrnSavWindow(TWindow* parent, const char* title, TModule* = 0);
  119.  
  120.   protected:
  121.     char far* GetClassName() {return(AppName);}
  122.     void  GetWindowClass(WNDCLASS& wndClass);
  123.  
  124.     virtual void  AnimateScreen();
  125.  
  126.   private:
  127.     TScreenThing*  Thing[NumThings];
  128.     TScreenThingBuilder Builder[MaxBuilders];
  129.     TSize          ScreenSize;
  130.     int            DrawIndex, EraseIndex;
  131.     int            NumBuilders;
  132.     BOOL           DoDots;
  133.     BOOL           DoLines;
  134.     BOOL           DoBlobs;
  135. };
  136.  
  137. TMyScrnSavWindow::TMyScrnSavWindow(TWindow* parent, const char* title,
  138.                                    TModule* module)
  139.   : TWindow(parent, title, module),
  140.     TScrnSavWindow(parent, title, module)
  141. {
  142.   DrawIndex  = 0;
  143.   EraseIndex = -2*(NumThings/3);
  144.   ScreenSize.cx = GetSystemMetrics(SM_CXSCREEN);
  145.   ScreenSize.cy = GetSystemMetrics(SM_CYSCREEN);
  146.  
  147.   char settings[32];
  148.  
  149.   GetProfileString(OwlScrnSectionStr, ObjectsStr, "1 0 0", settings, sizeof(settings));
  150.   sscanf(settings, "%d %d %d", &DoDots, &DoLines, &DoBlobs);
  151.  
  152.   NumBuilders = 0;
  153.   if (DoDots)
  154.     Builder[NumBuilders++] = TDot::Build;
  155.   if (DoLines)
  156.     Builder[NumBuilders++] = TLine::Build;
  157.   if (DoBlobs)
  158.     Builder[NumBuilders++] = TBlob::Build;
  159.  
  160.   int speed;
  161.   GetProfileString(OwlScrnSectionStr, SpeedStr, "2", settings, sizeof(settings));
  162.   sscanf(settings, "%d", &speed);
  163.  
  164.   ((TScrnSavApp*)GetApplication())->SetSpeed(speed);
  165. }
  166.  
  167. void
  168. TMyScrnSavWindow::GetWindowClass(WNDCLASS& wndClass)
  169. {
  170.   TScrnSavWindow::GetWindowClass(wndClass);
  171.   wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  172. }
  173.  
  174. void
  175. TMyScrnSavWindow::AnimateScreen()
  176. {
  177.   if (!DoDots && !DoLines && !DoBlobs)
  178.     return;
  179.  
  180.   TClientDC  dc(*this);
  181.   if (dc) {
  182.     dc.SetROP2(R2_XORPEN);
  183.  
  184.     Thing[DrawIndex] = Builder[random(NumBuilders)](ScreenSize);
  185.     Thing[DrawIndex]->Draw(dc);
  186.  
  187.     DrawIndex++;
  188.     DrawIndex %= NumThings;
  189.  
  190.     if (EraseIndex >= 0) {
  191.       Thing[EraseIndex]->Draw(dc);
  192.       delete Thing[EraseIndex];
  193.       EraseIndex++;
  194.       EraseIndex %= NumThings;
  195.  
  196.     } else
  197.       EraseIndex++;
  198.   }
  199. }
  200.  
  201. //----------------------------------------------------------------------------
  202.  
  203. class TScrnSavDlg : public TDialog {
  204.   public:
  205.     TScrnSavDlg(TWindow* parent, const char* name, TModule* module)
  206.       : TDialog(parent, name, module) {}
  207.  
  208.     void SetupWindow();
  209.     void CloseWindow(int retValue);
  210.  
  211.   DECLARE_RESPONSE_TABLE(TScrnSavDlg);
  212. };
  213.  
  214. DEFINE_RESPONSE_TABLE1(TScrnSavDlg, TDialog)
  215.   EV_COMMAND(IDCANCEL, CmCancel),
  216. END_RESPONSE_TABLE;
  217.  
  218. void
  219. TScrnSavDlg::SetupWindow()
  220. {
  221.   TDialog::SetupWindow();
  222.   char settings[32];
  223.  
  224.   int doDots, doLines, doBlobs;
  225.   ::GetProfileString(OwlScrnSectionStr, ObjectsStr, "1 0 0",
  226.                      settings, sizeof(settings));
  227.   sscanf(settings, "%d %d %d", &doDots, &doLines, &doBlobs);
  228.   CheckDlgButton(ID_DOTS, doDots);
  229.   CheckDlgButton(ID_LINES, doLines);
  230.   CheckDlgButton(ID_BLOBS, doBlobs);
  231.  
  232.   int speed;
  233.   ::GetProfileString(OwlScrnSectionStr, SpeedStr, "2",
  234.                      settings, sizeof(settings));
  235.   sscanf(settings, "%d", &speed);
  236.   CheckRadioButton(ID_SLOW, ID_FAST, ID_SLOW+speed);
  237. }
  238.  
  239. void
  240. TScrnSavDlg::CloseWindow(int retValue)
  241. {
  242.   char settings[32];
  243.  
  244.   wsprintf(settings, "%d %d %d", IsDlgButtonChecked(ID_DOTS),
  245.                                  IsDlgButtonChecked(ID_LINES),
  246.                                  IsDlgButtonChecked(ID_BLOBS));
  247.   WriteProfileString(OwlScrnSectionStr, ObjectsStr, settings);
  248.  
  249.   wsprintf(settings, "%d", IsDlgButtonChecked(ID_SLOW) ? 0 :
  250.                            (IsDlgButtonChecked(ID_MED) ? 1 : 2));
  251.   WriteProfileString(OwlScrnSectionStr, SpeedStr, settings);
  252.  
  253.   TDialog::CloseWindow(retValue);
  254. }
  255.  
  256. //----------------------------------------------------------------------------
  257.  
  258. class TMyScrnSavApp : public TScrnSavApp {
  259.   public:
  260.     TMyScrnSavApp(char far* name) : TScrnSavApp(name) {
  261.       #if defined(USE_BWCC)
  262.         EnableBWCC();
  263.       #endif
  264.     }
  265.  
  266.     // Override TScrnSavApp's virtual functions
  267.     //
  268.     void  InitScrnSavWindow();
  269.     void  InitConfigDialog();
  270. };
  271.  
  272. void
  273. TMyScrnSavApp::InitScrnSavWindow()
  274. {
  275.   ScrnSavWnd = new TMyScrnSavWindow(0, AppName);
  276. }
  277.  
  278. void
  279. TMyScrnSavApp::InitConfigDialog()
  280. {
  281.   ConfigureDialog = new TScrnSavDlg(0, IDD_CONFIGURE, this);
  282. }
  283.  
  284. int
  285. OwlMain(int /*argc*/, char* /*argv*/ [])
  286. {
  287.   return TMyScrnSavApp(AppName).Run();
  288. }
  289.