17.6.3 准备打印
Application Wizard在开始时就在CSketcherView中添加OnPreparePrinting()、OnBeginPrinting() 和OnEndPrinting()函数。为OnPreparePrinting()函数提供的基本代码将在return语句中调用DoPreparePrinting()函数:
- BOOL CSketcherView::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // default preparation
- return DoPreparePrinting(pInfo);
- }
DoPreparePrinting()函数将使用在CPrintInfo对象中定义的有关打印页数的信息显示Print对话框。只要有可能,就应当在这个调用出现之前计算要打印的页数,并把它存储在CPrintInfo对象中。当然在许多情况中,在执行该操作之前,可能需要从设备上下文获取有关打印机的信息。 例如,在打印页数受所用字体大小影响的文档时,在调用OnPreparePrinting()函数前不可能获得页数。在这种情况下,可以在OnBeginPrinting()成员中计算页数,这个函数将把指向设备上下文的指针作为参数。在调用OnPreparePrinting()函数之后,框架将调用OnBeginPrinting()函数,这样就可以使用在Print对话框中输入的信息。这意味着,也可以考虑用户在Print对话框中选择的纸型。
假设这个纸型大到足以包含绘制文档数据时使用的7.5英寸×10英寸区域,所以可以在On- PreparePrinting()函数中计算页数。其代码是:
- BOOL CSketcherView::OnPreparePrinting(CPrintInfo* pInfo)
- {
- CPrintData* printData(new CPrintData); // Create a print data object
- CSketcherDoc* pDoc = GetDocument(); // Get a document pointer
- CRect docExtent = pDoc->GetDocExtent(); // Get the whole document area
- printData->m_DocRefPoint = docExtent.TopLeft(); // Save document reference point
- printData->m_DocTitle = pDoc->GetTitle(); // Save the document filename
- // Calculate how many printed page widths are required
- // to accommodate the width of the document
- printData->m_nWidths = static_cast<UINT>(ceil(
- static_cast<double>(docExtent.Width())/printData->printWidth));
- // Calculate how many printed page lengths are required
- // to accommodate the document length
- printData->m_nLengths = static_cast<UINT>(
- ceil(static_cast<double>(docExtent.Height())/printData->printLength));
- // Set the first page number as 1 and
- // set the last page number as the total number of pages
- pInfo->SetMinPage(1);
- pInfo->SetMaxPage(printData->m_nWidths*printData->m_nLengths);
- pInfo->m_lpUserData = printData; // Store address of PrintData object
- return DoPreparePrinting(pInfo);
- }
首先在堆上创建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指令。