uses RichEdit;

{将RichEdit1的内容保存为图片,此函数也适合于RxRichEdit,即RichEdit: TRxRichEdit}
procedure RichEditToCanvas(RichEdit: TRichEdit; Canvas: TCanvas; PixelsPerInch: Integer);
var
ImageCanvas: TCanvas;
fmt: TFormatRange;
begin
ImageCanvas := Canvas;
with fmt do
begin
hdc:= ImageCanvas.Handle;
hdcTarget:= hdc;
rc:= Rect(0, 0,
ImageCanvas.ClipRect.Right * 1440 div PixelsPerInch,
ImageCanvas.ClipRect.Bottom * 1440 div PixelsPerInch
);
rcPage:= rc;
chrg.cpMin := 0;
chrg.cpMax := RichEdit.GetTextLen;
end;
SetBkMode(ImageCanvas.Handle, TRANSPARENT);
RichEdit.Perform(EM_FORMATRANGE, 1, Integer(@fmt));
RichEdit.Perform(EM_FORMATRANGE, 0, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RichEditToCanvas(RichEdit1, Image1.Canvas, Self.PixelsPerInch);
Image1.Refresh;
end;

TRichEdit的打印预览

Rich Edit控件(我们说的是标准的Windows控件,不是一个Delphi构件)包含内置的打印特性,可以使用这个特性向打印机传送格式化的文本,或是通过程序员稍微地努力就可将它的内容绘制到任何Canvas上。

当然,标准的Delphi TRichEdit构件封装了这一特性。我们可以使用这一可能性来制作一个快速的比例缩放的打印预览,或者将Rich Text绘制到任何Delphi控件上。

将Rich Edit控件绘制到任何Canvas上,涉及使用标准Rich Edit控件消息EM_FORMATRANGE。

这个消息的lParam参数是一个指向TFormatRange纪录的指针。在将消息传递给RichEdit之前,必须填充这个记录。

TFORMATRANGE记录包含一个rich edit控件用于格式化输出它的内容到特定设备的信息。这里的

hdc —— 要渲染的设备。

HdcTarget —— 要格式化的目标设备。

rc —— 要渲染的区域。使用的测量单位是缇。缇是一种不受屏幕约束(screen-independent)的单位,以确保屏幕元素的比例在所有显示系统上都相同。一缇被定义为一英寸的1/1440。

RcPage —— 渲染设备的整个区域。使用的测量单位是缇。

chrg —— TCHARRANGE记录指定了格式化文本的范围。

这个记录通常被EM_EXGETSEL和EM_EXSETSEL消息使用,它包含两个域:cpMin和cpMax。
 
cpMin 是一个字符位置索引,直接位于范围内第一个字符之前。

cpMax 是一个字符位置索引,直接位于范围内最后一个字符之后。

打印一个Rich Edit控件到一个位图上用于预览

完整页代码:
   unit Unit1;  
      
    interface  
      
   uses  
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
   Dialogs, StdCtrls, ComCtrls, ExtCtrls, RichEdit;  
     
    type  
  TForm1 = class(TForm)  
  Button1: TButton;  
  Button2: TButton;  
   Image1: TImage;  
  RichEdit1: TRichEdit;  
  procedure Button1Click(Sender: TObject);  
  procedure Button2Click(Sender: TObject);  
  private  
   { Private declarations }  
   public  
  { Public declarations }  
   end;  
   
 var  
   Form1: TForm1;  
 
  implementation  
    
   {$R *.dfm}  
     
  function PrintRTFToBitmap(ARichEdit : TRichEdit; ABitmap : TBitmap) : Longint;

var
  range : TFormatRange;
begin
   FillChar(Range, SizeOf(TFormatRange), 0);
   // 渲染我们要测量的相同DC。
   Range.hdc        := ABitmap.Canvas.handle;
   Range.hdcTarget  := ABitmap.Canvas.Handle;
   // 设定页。
   Range.rc.left    := 0;
   Range.rc.top     := 0;
   Range.rc.right   := ABitmap.Width * 1440 div Screen.PixelsPerInch;
   Range.rc.Bottom  := ABitmap.Height * 1440 div Screen.PixelsPerInch;

// 打印文本的缺省范围为整个文档。
   Range.chrg.cpMax := -1;
   Range.chrg.cpMin := 0;

// 格式化文本。
   Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range));

// 释放缓冲信息。
   SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
   //Image1.Refresh;
end;
 // 接下来的实例显示了不只是如何将Rich Edit绘制到任何Canvas上,还包括如何只绘制选择的文本范围。

function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;

ARichEdit : TRichEdit; AWidth, AHeight : integer) : Longint;
var
  Range : TFormatRange;
begin
    FillChar(Range, SizeOf(TFormatRange), 0);
    Range.hdc        := ACanvas.handle;
    Range.hdcTarget  := ACanvas.Handle;
    Range.rc.left    := 0;
    Range.rc.top     := 0;
    Range.rc.right   := AWidth * 1440 div Screen.PixelsPerInch;
    Range.rc.Bottom  := AHeight * 1440 div Screen.PixelsPerInch;
    Range.chrg.cpMax := ToChar;
    Range.chrg.cpMin := FromChar;
    Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range));
   SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
end;
  {use PrintRTFToBitmap function}  
 procedure TForm1.Button1Click(Sender: TObject);  
   var  
   Bmp: TBitmap;  
  begin  
   Bmp := TBitmap.Create;  
   bmp.Width := RichEdit1.ClientWidth;  
   bmp.Height := RichEdit1.ClientHeight;  
  PrintRTFToBitmap(RichEdit1, Bmp);  
 Image1.Canvas.Draw(0, 0, Bmp);  
   bmp.Free;  
  end;  
    
  {use PrintToCanvas function}  
  procedure TForm1.Button2Click(Sender: TObject);  
   var  
    Bmp: TBitmap;  
   begin  
      Bmp := TBitmap.Create;  
      bmp.Width := RichEdit1.ClientWidth;  
      bmp.Height := RichEdit1.ClientHeight;  
      PrintToCanvas(bmp.Canvas, 0, Length(RichEdit1.Text), RichEdit1, Bmp.Width, Bmp.Height);  
       Image1.Canvas.Draw(0, 0, Bmp);  
       bmp.Free;  
   end;  
     
  end.

http://blog.csdn.net/yanjiaye520/article/details/6674774

Delphi RichEdit的内容保存为图片的更多相关文章

  1. 将HTML5 Canvas的内容保存为图片借助toDataURL实现

    将HTML5 Canvas的内容保存为图片主要思想是借助Canvas自己的API - toDataURL()来实现,具体实现如下,感兴趣的朋友可以参考下哈,希望对你有所帮助 <html> ...

  2. 如何将Canvas中内容保存为图片

    Bitmap bm = Bitmap.createBitmap(320, 480, Config.ARGB_8888); Canvas canvas = new Canvas(bm); Paint p ...

  3. UItableView 所有内容保存为图片

    将所有的UITableView保存为图片,因为UITableView只能保存显示当前,所以,就单个保存后,合并为一张图片 代码如下: -(IBAction)savePic:(id)sender { / ...

  4. 将HTML5 Canvas的内容保存为图片

    主要思想是借助Canvas自己的API - toDataURL()来实现,整个实现 HTML + JavaScript的代码很简单. 代码如下: <html> <meta http- ...

  5. CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)

    CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...

  6. 用JavaScript将Canvas内容转化成图片的方法

    上周我们花了半天时间开发下一个准备放进Mozilla Marketplace的应用.有一个应用现在非常的火热,那就是Instagram,Facebook花了100万美元收购了它.我们也想有100万美元 ...

  7. 1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

     1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets prints ...

  8. 修改css的(屏蔽)overflow: hidden;实现浏览器能把网页全图保存成图片

    摘要: 1.项目需要,需要对网页内容“下载”保存成全图片 2.QQ浏览器等主流浏览器都支持这种下载保存功能 3.项目需要场景:编写好的项目维护文档,放在服务器上.如果是txt不能带图片可视化,如果wo ...

  9. C# 将容器内容转成图片导出

    ///   将容器内容转成图片导出,这里的controller就是this         /// </summary>         private void OutTheContro ...

随机推荐

  1. 利用jQuery实现的Ajax 验证用户名是否存在

    异步刷新实现方式有多种,也可以借助JS的多种框架,下面是使用jQuery框架实现的AJAX 验证用户名是否存在 jQuery.ajax概述 HTTP 请求加载远程数据. 通过jQuery 底层 AJA ...

  2. jQuery 方法

    方法 描述 animate() 对被选元素应用"自定义"的动画 clearQueue() 对被选元素移除所有排队函数(仍未运行的) delay() 对被选元素的所有排队函数(仍未运 ...

  3. ecos3.0编译 if_lancepci.c:528: 错误: 赋值运算的左操作数必须是左值

    /home/xin/ecos3/ecos-3.0/packages/devs/eth/amd/lancepci/v3_0/src/if_lancepci.c:528: 错误: 赋值运算的左操作数必须是 ...

  4. Wordpress主题中常用代码总结

    1. 在 Wordpress主题中显示最热文章的 PHP代码 <?php $result = $wpdb->get_results("SELECT comment_count,I ...

  5. python运维开发(十五)----JavaScript

    内容目录: HTML补充 javascript HTML补充 1.display标签 display的inline-block 属性会自动带3px的宽度 <span style="di ...

  6. 【转载】深入浅出http请求

    转载链接:http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html HTTP(HyperText Transfer Proto ...

  7. SQL Server 查看表定义的 2 种方法

    方法 1. 用SQL Server Management Studio 第一步找到要查看的表,右键 第二步点设计 方法 2. sp_help @objname = 'tableName' execut ...

  8. MYSQL 转换字符集的 2 种方法

    方法 1. convert(expression using character_set); convert('123456789' using ascii); 方法 2. cast(expresio ...

  9. Nginx安装配置PHP(FastCGI)环境的教程

    这篇是Nginx安装配置PHP(FastCGI)环境的教程.Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用. 一.什么是 FastCGI F ...

  10. Windows提供了两种将DLL映像到进程地址空间的方法

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...