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

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //   Printing program example using Application Framework Libraries (OWL)
  4. //   This application displays and prints a Ruler using OWL printer classes.
  5. //----------------------------------------------------------------------------
  6. #include <owl\owlpch.h>
  7. #include <owl\applicat.h>
  8. #include <owl\framewin.h>
  9. #include <owl\dc.h>
  10. #include <owl\printer.h>
  11. #include <owl\editfile.rh>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15.  
  16. //----------------------------------------------------------------------------
  17. // TWindowPrintout
  18.  
  19. class TWindowPrintout : public TPrintout {
  20.   public:
  21.     TWindowPrintout(const char* title, TWindow* window);
  22.  
  23.     void GetDialogInfo(int& minPage, int& maxPage,
  24.                        int& selFromPage, int& selToPage);
  25.     void PrintPage(int page, TRect& rect, unsigned flags);
  26.     void SetBanding(BOOL b) {Banding = b;}
  27.     BOOL HasPage(int pageNumber) {return pageNumber == 1;}
  28.     
  29.   protected:
  30.     TWindow* Window;
  31.     BOOL     Scale;
  32. };
  33.  
  34. TWindowPrintout::TWindowPrintout(const char* title, TWindow* window)
  35.   : TPrintout(title)
  36. {
  37.   Window = window;
  38.   Scale = TRUE;
  39. }
  40.  
  41. void
  42. TWindowPrintout::PrintPage(int, TRect& rect, unsigned)
  43. {
  44.   // Conditionally scale the DC to the window so the printout will
  45.   // resemble the window
  46.   //
  47.   int    prevMode;
  48.   TSize  oldVExt, oldWExt;
  49.   if (Scale) {
  50.     prevMode = DC->SetMapMode(MM_ISOTROPIC);
  51.     TRect windowSize = Window->GetClientRect();
  52.     DC->SetViewportExt(PageSize, &oldVExt);
  53.     DC->SetWindowExt(windowSize.Size(), &oldWExt);
  54.     DC->IntersectClipRect(windowSize);
  55.     DC->DPtoLP(rect, 2);
  56.   }
  57.  
  58.   // Call the window to paint itself
  59.   Window->Paint(*DC, FALSE, rect);
  60.  
  61.   // Restore changes made to the DC
  62.   if (Scale) {
  63.     DC->SetWindowExt(oldWExt);
  64.     DC->SetViewportExt(oldVExt);
  65.     DC->SetMapMode(prevMode);
  66.   }
  67. }
  68.  
  69. // Do not enable page range in the print dialog since only one page is
  70. // available to be printed
  71. //
  72. void
  73. TWindowPrintout::GetDialogInfo(int& minPage, int& maxPage,
  74.                                int& selFromPage, int& selToPage)
  75. {
  76.   minPage = 0;
  77.   maxPage = 0;
  78.   selFromPage = selToPage = 0;
  79. }
  80.  
  81. //----------------------------------------------------------------------------
  82. // TRulerWin
  83.  
  84. class TRulerWin : public TFrameWindow {
  85.   TPrinter* Printer;
  86.   public:
  87.     TRulerWin(TWindow* parent, const char* title, TModule* = 0);
  88.     ~TRulerWin();
  89.  
  90.     void Paint(TDC&, BOOL, TRect&);
  91.  
  92.     void CmFilePrint();
  93.     void CmFilePrinterSetup();
  94.  
  95.   DECLARE_RESPONSE_TABLE(TRulerWin);
  96. };
  97.  
  98. DEFINE_RESPONSE_TABLE1(TRulerWin, TFrameWindow)
  99.   EV_COMMAND(CM_FILEPRINT, CmFilePrint),
  100.   EV_COMMAND(CM_FILEPRINTERSETUP, CmFilePrinterSetup),
  101. END_RESPONSE_TABLE;
  102.  
  103. TRulerWin::TRulerWin(TWindow* parent, const char* title, TModule* module)
  104.   : TFrameWindow(parent, title, 0, FALSE, module)
  105. {
  106.   AssignMenu("RulerMenu");
  107.   Attr.X = GetSystemMetrics(SM_CXSCREEN) / 8;
  108.   Attr.Y = GetSystemMetrics(SM_CYSCREEN) / 8;
  109.   Attr.H = Attr.Y * 6;
  110.   Attr.W = Attr.X * 6;
  111.   Printer = new TPrinter;
  112. }
  113.  
  114. TRulerWin::~TRulerWin()
  115. {
  116.   delete Printer;
  117. }
  118.  
  119. void
  120. TRulerWin::CmFilePrint()          // Execute File:Print command
  121. {
  122.   if (Printer) {
  123.     TWindowPrintout printout("Ruler Test", this);
  124.     printout.SetBanding(TRUE);
  125.     Printer->Print(this, printout, TRUE);
  126.   }
  127. }
  128.  
  129. void
  130. TRulerWin::CmFilePrinterSetup()    // Execute File:Printer-setup command
  131. {
  132.   if (Printer)
  133.     Printer->Setup(this);
  134. }
  135.  
  136. // Paint window's contents on any dc, screen or printer or whatever...
  137. //
  138. void
  139. TRulerWin::Paint(TDC& dc, BOOL, TRect&)
  140. {
  141.   const UnitsPerInch = 100;                // Display scale units per inch
  142.   const NumInches = 8;                     // Size of ruler in inches
  143.   const MarkFraction = 4;                  // Power of 2 to use for marks
  144.   const MarksPerInch = (1<<MarkFraction);  // Number of markers for each inch
  145.   const LargeMarkerSize = UnitsPerInch/3;  // Size of large, labeled markers
  146.   const SmallMarkerSize = UnitsPerInch/8;  // Size of smallest markers
  147.   const MarkStep = (LargeMarkerSize-SmallMarkerSize) / MarkFraction;
  148.  
  149.   dc.SaveDC();
  150.   dc.SetMapMode(MM_LOENGLISH);
  151.   int x1 = 0; //0.50 * UnitsPerInch;
  152.   int y1 = x1;
  153.   int x2 = x1 + NumInches * UnitsPerInch;
  154.   int y2 = y1 + 1*UnitsPerInch;
  155.   dc.Rectangle(x1, -y1, x2, -y2);
  156.  
  157.   //
  158.   // Draw marks
  159.   //
  160.   y2 = y1 + SmallMarkerSize;
  161.   for (int marksPerInch = MarksPerInch; marksPerInch > 0; marksPerInch /= 2) {
  162.     for (int i = 0; i <= NumInches*marksPerInch - 1; i++) {
  163.       int x = x1 + (i * UnitsPerInch) / marksPerInch;
  164.       dc.MoveTo(x, -y1);
  165.       dc.LineTo(x, -y2);
  166.     }
  167.     y2 += MarkStep;
  168.   }
  169.  
  170.   //
  171.   // Label the inch marks
  172.   //
  173.   y2 = y1 + LargeMarkerSize; // - text height
  174.   for (int i = 1;  i <= NumInches - 1; i++) {
  175.     int x = x1 + i * UnitsPerInch;  // - ( text width + 20%)
  176.     char s[3];
  177.     itoa(i, s, 10);
  178.     dc.TextOut(TPoint(x, -y2), s, strlen(s));
  179.   }
  180.  
  181.   dc.RestoreDC();
  182. }
  183.  
  184.  
  185. //----------------------------------------------------------------------------
  186. // TRulerApp
  187.  
  188. class TRulerApp : public TApplication {
  189.   public:
  190.     TRulerApp() : TApplication() {}
  191.     void InitMainWindow() {
  192.       EnableCtl3d();
  193.       MainWindow = new TRulerWin(0, "Ruler Printing Demonstration");
  194.     }
  195. };
  196.  
  197. int
  198. OwlMain(int /*argc*/, char* /*argv*/ [])
  199. {
  200.   return TRulerApp().Run();
  201. }
  202.