home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / slider.pak / SLIDERX.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  6KB  |  223 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\framewin.h>
  7. #include <owl\slider.h>
  8. #include <owl\gauge.h>
  9. #include <owl\static.h>
  10. #include <owl\gdiobjec.h>
  11. #include <stdio.h>
  12.  
  13. const WORD ID_THERMOSTAT = 201;
  14. const WORD ID_HEATERTIME = 202;
  15. const WORD ID_OUTSIDETEMP = 203;
  16. const WORD ID_STATICTEMP = 205;
  17. const WORD ID_STATICTIME = 206;
  18. const WORD ID_STATICOTEMP = 207;
  19. const WORD ID_THERMOMETER = 208;
  20. const UINT ID_TIMER = 1;
  21. const int  Hysteresis = 0;
  22.  
  23. class TTestWindow : public TWindow {
  24.   public:
  25.     TTestWindow();
  26.     
  27.   protected:
  28.     TSlider*  Thermostat;
  29.     TSlider*  HeaterTime;
  30.     TSlider*  OutsideTemp;
  31.     TStatic*  StaticTemp;
  32.     TStatic*  StaticTime;
  33.     TStatic*  StaticOTemp;
  34.     TGauge*   Thermometer;
  35.     TBrush*   BkBrush;
  36.     
  37.     int       Temp;
  38.     int       HeaterTimeLeft;
  39.  
  40.     void    SetupWindow();
  41.  
  42.     void    UpdateTemp();
  43.     void    UpdateHeaterTime(UINT=0);
  44.     void    UpdateOTemp(UINT=0);
  45.     
  46.     BOOL    EvEraseBkgnd(HDC);
  47.     HBRUSH  EvCtlColor(HDC, HWND hWndChild, UINT ctlType);
  48.     void    EvSysColorChange();
  49.     void    EvTimer(UINT timerId);
  50.  
  51.   DECLARE_RESPONSE_TABLE(TTestWindow);
  52. };
  53.  
  54. DEFINE_RESPONSE_TABLE1(TTestWindow, TWindow)
  55.   EV_WM_ERASEBKGND,
  56.   EV_WM_CTLCOLOR,
  57.   EV_WM_SYSCOLORCHANGE,
  58.   EV_WM_TIMER,
  59.   EV_CHILD_NOTIFY_ALL_CODES(ID_HEATERTIME, UpdateHeaterTime),
  60.   EV_CHILD_NOTIFY_ALL_CODES(ID_OUTSIDETEMP, UpdateOTemp),
  61. END_RESPONSE_TABLE;
  62.  
  63. TTestWindow::TTestWindow()
  64.   : TWindow(0, 0, 0)
  65. {
  66.   Attr.X = 20;
  67.   Attr.Y = 20;
  68.   Attr.W = 380;
  69.   Attr.H = 200;
  70.  
  71.   StaticTemp = new TStatic(this, ID_STATICTEMP, "", 110, 30, 160, 17, 0);
  72.   StaticTemp->Attr.Style |= SS_CENTER;
  73.   Thermometer = new TGauge(this, "%d\xB0", ID_THERMOMETER, 70, 70, 240, 24, TRUE, 2);
  74.  
  75.   Thermostat = new THSlider(this, ID_THERMOSTAT, 70, 130, 240, 40);
  76.  
  77.   StaticTime = new TStatic(this, ID_STATICTIME, "", 4, 10, 160, 17, 0);
  78.   StaticTime->Attr.Style |= SS_LEFT;
  79.   HeaterTime = new TVSlider(this, ID_HEATERTIME, 20, 30, 32, 160);
  80.  
  81.   StaticOTemp = new TStatic(this, ID_STATICOTEMP, "", 216, 10, 160, 17, 0);
  82.   StaticOTemp->Attr.Style |= SS_RIGHT;
  83.   OutsideTemp = new TVSlider(this, ID_OUTSIDETEMP, 330, 30, 32, 160);
  84.  
  85.   BkBrush = new TBrush(::GetSysColor(COLOR_BTNFACE));
  86.  
  87.   Temp = 70;
  88.   HeaterTimeLeft = 0;
  89. }
  90.  
  91. void
  92. TTestWindow::SetupWindow()
  93. {
  94.   TWindow::SetupWindow();
  95.  
  96.   Thermostat->SetRange(40, 120);
  97.   Thermostat->SetRuler(5, FALSE);
  98.   Thermostat->SetPosition(75);
  99.   
  100.   HeaterTime->SetRange(0, 20);
  101.   HeaterTime->SetRuler(2, FALSE);
  102.   HeaterTime->SetPosition(10);
  103.  
  104.   OutsideTemp->SetRange(20, 90);
  105.   OutsideTemp->SetRuler(5, FALSE);
  106.   OutsideTemp->SetPosition(40);
  107.  
  108.   Thermometer->SetRange(40-10, 120+10);
  109.   Thermometer->SetValue(75);
  110.   
  111.   SetTimer(ID_TIMER, 1000);
  112.   
  113.   UpdateTemp();
  114.   UpdateHeaterTime();
  115.   UpdateOTemp();
  116. }
  117.  
  118. void
  119. TTestWindow::UpdateTemp()
  120. {
  121.   char str[18];
  122.   sprintf(str, "%s %s", "Heater is ", HeaterTimeLeft ? "On" : "Off");
  123.   StaticTemp->SetText(str);
  124.   Thermometer->SetValue(Temp);
  125. }
  126.  
  127. void
  128. TTestWindow::UpdateHeaterTime(UINT)
  129. {
  130.   char str[16];
  131.   sprintf(str, "%d %s", HeaterTime->GetPosition(), "Secs/Cycle");
  132.   StaticTime->SetText(str);
  133. }
  134.  
  135. void
  136. TTestWindow::UpdateOTemp(UINT)
  137. {
  138.   char str[14];
  139.   sprintf(str, "%d\xB0 %s", OutsideTemp->GetPosition(), "Outside");
  140.   StaticOTemp->SetText(str);
  141. }
  142.  
  143. //
  144. // Paint a raised, grey, background
  145. //
  146. BOOL
  147. TTestWindow::EvEraseBkgnd(HDC hDC)
  148. {
  149.   TDC dc(hDC);
  150.  
  151.   // SysColors that are bkgnds for text are never dithered & can use FastRect
  152.   dc.TextRect(GetClientRect(), ::GetSysColor(COLOR_BTNFACE));
  153.  
  154.   // These sysColors might be dithered. PaBlt is an easy way to paint these
  155.   TBrush highlight(::GetSysColor(COLOR_BTNHIGHLIGHT));
  156.   dc.SelectObject(highlight);
  157.   dc.PatBlt(0, 0, Attr.W, 2);
  158.   dc.PatBlt(0, 2, 2, Attr.H-2);
  159.  
  160.   TBrush shadow(::GetSysColor(COLOR_BTNSHADOW));
  161.   dc.SelectObject(shadow);
  162.   dc.PatBlt(1, Attr.H-2, Attr.W-1, 2);
  163.   dc.PatBlt(Attr.W-2, 1, 2, Attr.H-2-1);  
  164.  
  165.   return TRUE;
  166. }
  167.  
  168. //
  169. // Provide a background color & brush for child controls to use
  170. //
  171. HBRUSH
  172. TTestWindow::EvCtlColor(HDC hDC, HWND /*hWndChild*/, UINT /*ctlType*/)
  173. {
  174.   ::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE));
  175.   return *BkBrush;
  176. }
  177.  
  178. //
  179. // Colors have changed. Rebuild the background brush.
  180. //
  181. void
  182. TTestWindow::EvSysColorChange()
  183. {
  184.   delete BkBrush;
  185.   BkBrush = new TBrush(::GetSysColor(COLOR_BTNFACE));
  186. }
  187.  
  188. void
  189. TTestWindow::EvTimer(UINT /*timerId*/)
  190. {
  191.   Temp += (OutsideTemp->GetPosition()-Temp) / 10;  // heat loss
  192.  
  193.   int tempSetting = Thermostat->GetPosition();   // turn in heater?
  194.   if (!HeaterTimeLeft && Temp < tempSetting-Hysteresis)
  195.     HeaterTimeLeft = HeaterTime->GetPosition();
  196.  
  197.   if (HeaterTimeLeft) {             // heater is running
  198.     HeaterTimeLeft--;
  199.     Temp += 4;                      // heat flows into house
  200.   }
  201.  
  202.   UpdateTemp();
  203. }
  204.  
  205. //----------------------------------------------------------------------------
  206.  
  207. class TTestApp : public TApplication {
  208.   public:
  209.     TTestApp() : TApplication() {}
  210.     void InitMainWindow() {
  211.       MainWindow = new TFrameWindow(0, "Home Heater Simulator", new TTestWindow, TRUE);
  212.       MainWindow->EnableKBHandler();
  213.       MainWindow->Attr.Style &= ~WS_THICKFRAME;
  214.     }
  215. };
  216.  
  217. int
  218. OwlMain(int /*argc*/, char* /*argv*/ [])
  219. {
  220.   TTestApp app;
  221.   return app.Run();
  222. }
  223.