- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《RTF技术扩展如何实现完美的分页打印
RTF技术扩展 - 如何实现完美的分页打印
摘要: 本文给出了一种完美实现RTF文件分页打印的方法,并根据此方法实现了RTF文件的打印预览及打印。通过本方法实现的RTF文件的WYSIWYG(所见即所得)显示、分页预览及分页打印三者在效果上完全一致,解决了以前预览与打印存在偏差的问题,无论在分页速度和效果上均取得了突破。同时,本方法还解决了分页效果与打印机相关的问题,做到了完全的设备无关。效果图如下:
关键字:RTF、Rich Text Format、分页、打印。
一、背景介绍
RTF文件的分页算法一致是困扰已久的话题,以前我的方法是采用逐行计算行高然后再手工分页的方法,该方法有很多不足之处:
正在计算的行必须在屏幕可视范围内;
每行的左缩进位置必须为正数;
逐行计算采用模拟键盘操作进行,速度很慢;
手工计算存在一些误差;
分页效果与打印机相关,导致不同打印机结果不一致。
综上几点原因,旧的分页算法存在稳定性差和计算不精确等问题,因此分页结果常常出现偏差。寻找一种稳定可靠、高效率的分页算法迫在眉睫。
二、新的分页算法简介
新的分页算法其核心采用以前我翻译的《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( ???? //?返回结果值?LRESULT
???(HWND) hWndControl, ???? // 目标控件句柄
???(UINT) EM_FORMATRANGE, ???? // 消息ID
???(WPARAM)?wParam, ???? //?=?(WPARAM)?()?wParam;
???(LPARAM)?lParam ???? //?=?(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
FORMATRANGE 结构体
FORMATRANGE结构体包含用于Rich Edit控件格式化其输出到指定设备的相关信息。该结构体用于EM_FORMATRANGE消息。
语法:
typedef struct _formatrange?{
HDC?hdc;
HDC?hdcTarget;
RECT?rc;
RECT?rcPage;
CHARRANGE?chrg;
} FORMATRANGE; 成员:
hdc 渲染设备句柄。 hdcTarget 目标设备句柄。 rc 渲染区域,单位:缇。 rcPage 渲染设备的整体区域,单位:缇。 chrg CHARRANGE 结构体,表示用于格式化的文本范围。 结构体信息:
文档评论(0)