2024年3月24日发(作者:)

RTF技术扩展 - 如何实现完美的分页打印

摘要: 本文给出了一种完美实现RTF文件分页打印的方法,并根据此方法实现了RTF文件的打印预览及

打印。通过本方法实现的RTF文件的WYSIWYG(所见即所得)显示、分页预览及分页打印三者在效果

上完全一致,解决了以前预览与打印存在偏差的问题,无论在分页速度和效果上均取得了突破。同时,本

方法还解决了分页效果与打印机相关的问题,做到了完全的设备无关。效果图如下:

关键字:RTF、Rich Text Format、分页、打印。

一、背景介绍

RTF文件的分页算法一致是困扰已久的话题,以前我的方法是采用逐行计算行高然后再手工分页的方

法,该方法有很多不足之处:

1、 正在计算的行必须在屏幕可视范围内;

2、 每行的左缩进位置必须为正数;

3、 逐行计算采用模拟键盘操作进行,速度很慢;

4、 手工计算存在一些误差;

5、 分页效果与打印机相关,导致不同打印机结果不一致。

综上几点原因,旧的分页算法存在稳定性差和计算不精确等问题,因此分页结果常常出现偏差。寻找

一种稳定可靠、高效率的分页算法迫在眉睫。

二、新的分页算法简介

新的分页算法其核心采用以前我翻译的《RichTextBox SDK 参考手册》一文中介绍的方法:主要方

法是通过向Rich Edit控件发送EM_FORMATRANGE消息来将其输出重定向到指定设备,比如打印机。

当然,也可以指定一个用于Rich Text文本格式化的输出设备,比如图片框。同时,可以使用

EM_SETTARGETDEVICE消息来指定一个用于Rich Text文本格式化的目标设备。该消息用于实现

WYSIWYG(所见即所得)模式,即在该模式下应用程序采用默认打印机字体规格而非屏幕字体规格来定

位文本。这样就实现了RTF文本的WYSIWYG(所见即所得)显示、打印预览与最终打印。

需要说明的是,如果要保持3种方法在结果上的一致性,那么采用的目标设备必须统一,这样才能保

证渲染结果的统一。我们采用屏幕Screen对象来作为目标设备,这样就实现了渲染结果与打印机无关,

避免了不同打印机其分页效果不同的问题。

下面对这几个消息进行详细讲解:

三、相关Windows消息和函数详解

 EM_FORMATRANGE 消息

EM_FORMATRANGE 消息用于为指定设备格式化一定范围的文本,用于Rich Edit控件。

语法:

发送该消息,采用如下方法调用 SendMessage 函数:

lResult = SendMessage(

(HWND) hWndControl,

(UINT) EM_FORMATRANGE,

(WPARAM) wParam,

(LPARAM) lParam

);

// 返回结果值 LRESULT

// 目标控件句柄

// 消息ID

// = (WPARAM) () wParam;

// = (LPARAM) () lParam;

参数:

wParam

表示是否渲染文本。如果该参数为非0值,文本将被渲染;否则,文本仅仅被测量(不做实际渲

染)。

lParam

指向一个 FORMATRANGE 结构体,该结构体包含输出设备相关信息,或者为NULL用于释放

目标控件所绑定的信息。

返回值:

该消息返回适合该区域的最后一个字符位置,加1。

注释:

该消息通常与EM_DISPLAYBAND消息搭配,用于为输出设备诸如打印机等格式化Rich Edit控件中的

内容。

非常重要的是,在你最后一次使用该消息后需要为lParam参数指定NULL值来释放所绑定的信息。另外,

一旦你在某个设备使用该消息后,如果需要在不同设备再使用该消息,同样你必须先释放所绑定的信息。

消息信息:

头文件

操作系统

Richedit.h

Windows 95, Windows NT 4.0

参见:

Rich Edit Controls, EM_DISPLAYBAND, FORMATRANGE