home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tybc4 / xped4 / apxprint.cpp < prev    next >
C/C++ Source or Header  |  1994-02-13  |  6KB  |  181 lines

  1. /*  Main xped4
  2.     
  3.     Copyright ⌐ 1993. All Rights Reserved.
  4.  
  5.     SUBSYSTEM:    xped4.exe Application
  6.     FILE:         APXPrint.CPP
  7.     AUTHOR:       
  8.  
  9.  
  10.     OVERVIEW
  11.     ========
  12.     Source file for implementation of Printing.
  13. */
  14.  
  15.  
  16. #include <owl\owlpch.h>
  17. #pragma hdrstop
  18.  
  19. #include <owl\listbox.h>
  20. #include <owl\edit.h>
  21. #include <owl\preview.h>
  22.  
  23. #include "apxprint.h"
  24.  
  25.  
  26. // Do not enable page range in the print dialog since only one page is
  27. // available to be printed
  28. //
  29. void APXPrintOut::GetDialogInfo (int& minPage, int& maxPage, int& selFromPage, int& selToPage)
  30. {
  31.     minPage = maxPage = 0;
  32.     selFromPage = selToPage = 0;
  33. }
  34.  
  35.  
  36. void APXPrintOut::BeginPrinting ()
  37. {
  38.     TRect clientR;
  39.  
  40.     BeginPage(clientR);
  41.  
  42.     TFrameWindow *fWindow = TYPESAFE_DOWNCAST(Window, TFrameWindow);
  43.  
  44.     HFONT   hFont = (HFONT)fWindow->GetClientWindow()->GetWindowFont();
  45.     TFont   font("Arial", -12);
  46.     if (hFont == 0)
  47.       DC->SelectObject(font);
  48.     else
  49.       DC->SelectObject(TFont(hFont));
  50.     
  51.     TEXTMETRIC  tm;
  52.     int fHeight = (DC->GetTextMetrics(tm) == TRUE) ? tm.tmHeight + tm.tmExternalLeading : 10;
  53.  
  54.     DC->RestoreFont();
  55.     
  56.     // How many lines of this font can we fit on a page.
  57.     int linesPerPage = MulDiv(clientR.Height(), 1, fHeight);
  58.     
  59.     TPrintDialog::TData &printerData = Printer->GetSetup();
  60.  
  61.     int maxPg = 1;
  62.  
  63.     // Get the client class window (this is the contents we're going to print).
  64.     TEdit *clientEditWindow = 0;
  65.     TListBox *clientListWindow = 0;
  66.  
  67.     clientEditWindow = TYPESAFE_DOWNCAST(fWindow->GetClientWindow(), TEdit);
  68.     if (clientEditWindow)
  69.         maxPg = ((clientEditWindow->GetNumLines() / linesPerPage) + 1.0);
  70.     else {
  71.         clientListWindow = TYPESAFE_DOWNCAST(fWindow->GetClientWindow(), TListBox);
  72.         if (clientListWindow)
  73.             maxPg = ((clientListWindow->GetCount() / linesPerPage) + 1.0);
  74.     }
  75.  
  76.     // Compute the number of pages to print.
  77.     printerData.MinPage = 1;
  78.     printerData.MaxPage = maxPg;
  79.  
  80.     EndPage();
  81.  
  82.     TPrintout::BeginPrinting();
  83. }
  84.  
  85.  
  86. void APXPrintOut::BeginPage (TRect &clientR)
  87. {
  88.     TScreenDC screenDC;
  89.     TSize screenRes(screenDC.GetDeviceCaps(LOGPIXELSX),
  90.                     screenDC.GetDeviceCaps(LOGPIXELSY));
  91.     TSize printRes(DC->GetDeviceCaps(LOGPIXELSX),
  92.                    DC->GetDeviceCaps(LOGPIXELSY));
  93.  
  94.     // Temporarily change the window size (so any WM_PAINT queries on the total window size (GetClientRect) is
  95.     // the window size for the WM_PAINT of the window and the printer page size when Paint is called from
  96.     // PrintPage. Notice, we don't use AdjustWindowRect because its harder and not accurate.  Instead we
  97.     // compute the difference (in pixels) between the client window and the frame window.  This difference
  98.     // is then added to the clientRect to compute the new frame window size for SetWindowPos.
  99.     clientR = Window->GetClientRect();
  100.     Window->MapWindowPoints(HWND_DESKTOP, (TPoint*)&clientR, 2);
  101.  
  102.     // Compute extra X and Y pixels to bring a client window dimensions to equal the frame window.
  103.     OrgR = Window->GetWindowRect();
  104.     int adjX = OrgR.Width() - clientR.Width();
  105.     int adjY = OrgR.Height() - clientR.Height();
  106.     
  107.     // Conditionally scale the DC to the window so the printout will resemble the window.
  108.     if (Scale) {
  109.         clientR = Window->GetClientRect();
  110.         PrevMode = DC->SetMapMode(MapMode);
  111.         DC->SetViewportExt(PageSize, &OldVExt);
  112.  
  113.         // Scale window to logical page size (assumes left & top are 0)
  114.         clientR.right = MulDiv(PageSize.cx, screenRes.cx, printRes.cx);
  115.         clientR.bottom = MulDiv(PageSize.cy, screenRes.cy, printRes.cy);
  116.  
  117.         DC->SetWindowExt(clientR.Size(), &OldWExt);
  118.     }
  119.  
  120.     // Compute the new size of the window based on the printer DC dimensions.    
  121.     // Resize the window, notice position, order, and redraw are not done the window size changes but the user
  122.     // doesn't see any visible change to the window.
  123.     Window->SetRedraw(FALSE);
  124.     Window->SetWindowPos(0, 0, 0, clientR.Width() + adjX, clientR.Height() + adjY,
  125.                          SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER| SWP_NOACTIVATE);
  126. }
  127.  
  128.  
  129. void APXPrintOut::PrintPage (int page, TRect& bandRect, unsigned)
  130. {
  131.     TRect clientR;
  132.  
  133.     BeginPage(clientR);
  134.  
  135.     if (Scale)
  136.         DC->DPtoLP(bandRect, 2);
  137.  
  138.     // Change the printer range to this current page.
  139.     TPrintDialog::TData& printerData = Printer->GetSetup();
  140.     int fromPg = printerData.FromPage;
  141.     int toPg = printerData.ToPage;
  142.  
  143.     printerData.FromPage = page;
  144.     printerData.ToPage = page;
  145.  
  146.     // Call the window to paint itself to the printer DC.
  147.     Window->Paint(*DC, FALSE, bandRect);
  148.  
  149.     printerData.FromPage = fromPg;
  150.     printerData.ToPage = toPg;
  151.  
  152.     if (Scale)
  153.         DC->LPtoDP(bandRect, 2);
  154.  
  155.     EndPage();
  156. }
  157.  
  158.  
  159. void APXPrintOut::EndPage ()
  160. {
  161.     // Resize to original window size, no one's the wiser.
  162.     Window->SetWindowPos(0, 0, 0, OrgR.Width(), OrgR.Height(),
  163.                          SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER| SWP_NOACTIVATE);
  164.     Window->SetRedraw(TRUE);
  165.  
  166.     // Restore changes made to the DC
  167.     if (Scale) {
  168.         DC->SetWindowExt(OldWExt);
  169.         DC->SetViewportExt(OldVExt);
  170.         DC->SetMapMode(PrevMode);
  171.     }
  172. }
  173.  
  174.  
  175. BOOL APXPrintOut::HasPage (int pageNumber)
  176. {
  177.     TPrintDialog::TData &printerData = Printer->GetSetup();
  178.  
  179.     return (pageNumber >= printerData.MinPage) && (pageNumber <= printerData.MaxPage);
  180. }
  181.