17.6.6 打印文档(2)
第一步是用CPrintData对象的地址初始化本地指针p,CPrintData对象存储在pInfo指向的对象的m_lpUserData成员中。然后输出存储在CPrintInfo对象中的文件名。CDC对象的函数成员SetTextAlign()定义后续文本输出的对齐方式,其参考点定义在函数TextOut()的文本字符串中。对齐方式由作为参数传递给该函数的常量确定。指定文本水平对齐方式的方法有3种,如表17-5所示。
表 17-5
|
常 量
|
对 齐 方 式
|
|
TA_LEFT
|
参考点位于文本边界矩形的左边,所以文本位于
该指定点的右边。这是默认的对齐方式
|
|
TA_RIGHT
|
参考点位于文本边界矩形的右边,所
以文本位于该指定点的左边
|
|
TA_CENTER
|
参考点位于文本边界矩形的中心
|
将文件名在页面上的x坐标定义为页面宽度的一半,y坐标定义为距离页面顶部20个单位,即0.2英寸。
在把文档文件的名称作为居中文本输出后,在页面底部中间位置输出页码。使用CString类的Format()成员格式化存储在CPrintInfo对象的m_nCurPage成员中的页码。这定位到页面底部向上20个单位处。然后将文本对齐方式重置为文档中文本所用的默认方式TA_LEFT。
将另一个标志和调整标志进行"或"运算,函数SetTextAlign()还可以在垂直方向上修改文本的位置。另一个标志可以是下列任一标志,见表17-6。
表 17-6
|
常 量
|
对 齐 方 式
|
|
TA_TOP
|
将文本边界矩形的顶部与定义文本位
置的点对齐,这是默认设置
|
|
TA_BOTTOM
|
将文本边界矩形的底部与定义文本位置的点对齐
|
|
TA_BASELINE
|
将文本所使用字体的基线与定义文本位置的点对齐
|
函数OnPrint()的下一个操作是使用前面讨论的方法将文档的一个区域映射为当前页面。通过调用用于在视图中显示文档的函数OnDraw(),可以在这个页面上绘制文档。这也许会绘制整个文档,但是通过定义剪贴矩形,可以限制出现在这个页面的内容。剪贴矩形包围设备上下文中出现输出的矩形区域,从而禁止输出出现在该矩形以外。也可以定义不规则的形状(称为区),进行剪贴。
在打印设备上下文中定义的初始默认剪贴区域是页面边界。我们定义的剪贴矩形对应于位于页面中间的printWidth×printLength区域。这确保了只能在这个区域进行绘制,而不会重写文件名和页码。
在通过OnDraw()函数调用绘制了当前页以后,调用参数为NULL的函数SelectClipRgn()删除了这个剪贴矩形。如果不这样做,那么将禁止输出的文档标题出现在第一页以后的所有页上,因为它位于这个剪贴矩形之外。只有在下一次调用函数IntersectClipRect()时,它才会在打印过程中生效。
最后再次调用函数SetWindowOrg(),把窗口原点还原到它的原始位置,本章前面对此进行过讨论。