home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / EXPERT.PAK / APXPRINT.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  6KB  |  188 lines

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