设为首页 加入收藏

TOP

17.6.3 准备打印
2013-10-07 16:14:19 来源: 作者: 【 】 浏览:61
Tags:17.6.3 准备 打印

17.6.3  准备打印

Application Wizard在开始时就在CSketcherView中添加OnPreparePrinting()、OnBeginPrinting() 和OnEndPrinting()函数。为OnPreparePrinting()函数提供的基本代码将在return语句中调用DoPreparePrinting()函数:

  1. BOOL CSketcherView::OnPreparePrinting(CPrintInfo* pInfo)  
  2. {  
  3. // default preparation  
  4. return DoPreparePrinting(pInfo);  
  5. }  

DoPreparePrinting()函数将使用在CPrintInfo对象中定义的有关打印页数的信息显示Print对话框。只要有可能,就应当在这个调用出现之前计算要打印的页数,并把它存储在CPrintInfo对象中。当然在许多情况中,在执行该操作之前,可能需要从设备上下文获取有关打印机的信息。 例如,在打印页数受所用字体大小影响的文档时,在调用OnPreparePrinting()函数前不可能获得页数。在这种情况下,可以在OnBeginPrinting()成员中计算页数,这个函数将把指向设备上下文的指针作为参数。在调用OnPreparePrinting()函数之后,框架将调用OnBeginPrinting()函数,这样就可以使用在Print对话框中输入的信息。这意味着,也可以考虑用户在Print对话框中选择的纸型。

假设这个纸型大到足以包含绘制文档数据时使用的7.5英寸×10英寸区域,所以可以在On- PreparePrinting()函数中计算页数。其代码是:
 

  1. BOOL CSketcherView::OnPreparePrinting(CPrintInfo* pInfo)  
  2. {  
  3. CPrintData* printData(new CPrintData);              // Create a print data object  
  4. CSketcherDoc* pDoc = GetDocument();                         // Get a document pointer  
  5. CRect docExtent = pDoc->GetDocExtent();         // Get the whole document area  
  6. printData->m_DocRefPoint = docExtent.TopLeft(); // Save document reference point  
  7. printData->m_DocTitle = pDoc->GetTitle();                       // Save the document filename  
  8. // Calculate how many printed page widths are required  
  9. // to accommodate the width of the document  
  10. printData->m_nWidths = static_cast<UINT>(ceil(  
  11. static_cast<double>(docExtent.Width())/printData->printWidth));  
  12. // Calculate how many printed page lengths are required  
  13. // to accommodate the document length  
  14. printData->m_nLengths = static_cast<UINT>(  
  15. ceil(static_cast<double>(docExtent.Height())/printData->printLength));  
  16. // Set the first page number as 1 and  
  17. // set the last page number as the total number of pages  
  18. pInfo->SetMinPage(1);  
  19. pInfo->SetMaxPage(printData->m_nWidths*printData->m_nLengths);  
  20. pInfo->m_lpUserData = printData;                                // Store address of PrintData object  
  21. return DoPreparePrinting(pInfo);  
  22. }  

首先在堆上创建CPrintData对象,并把它的地址本地存储在指针中。获得了指向该文档的指针后,通过调用本章前面在文档类中添加的函数GetDocExtent(),获得包围文档类中所有元素的矩形。然后把这个矩形的左上角存储在CPrintData对象的m_DocRefPoint成员中,并把包含该文档的文件的名称放在m_DocTitle中。

接下来的两行代码计算文档宽度上的页数以及长度上的页数。计算文档宽度上的页数时,首先将文档的宽度除以页面打印区域的宽度,然后使用cmath头文件中定义的ceil()库函数,把计算结果向上舍入为邻近的最大整数。例如,ceil(2.1)返回3.0, ceil(2.9)也返回3.0, 而ceil(-2.1)则返回-2.0。利用类似的计算方法可以计算出文档长度上的页数。这两个值的乘积是要打印的总页数,也是要提供给最大页码的值。最后一步是将CPrintInfo对象的地址存储到pInfo对象的m_lpUserData成员中。

不要忘记在SketcherView.cpp文件中添加PrintData.h的#include指令。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.2 Variables (5) 下一篇17.6.4 打印后的清除

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)