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. php in_array 和 str_replace

    有这样的用法哦 $allow_state_array_invoc = array('store_invoice','invoiceno','invoicerec','invoiceing'); if ...

  2. 使用ThinkPHP开发中MySQL性能优化的最佳21条经验

    使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...

  3. FMDB用法

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  4. SQL Server 查看identity值的几种方法。

    方法 1. ident_incr('Table_name');#  增量    identity(A,B) 中的B值 ident_seed('Table_name'); # 种子    identit ...

  5. 微软云基础架构Hyper-scale Datacenter

    每天醒来,可能很多人的习惯都是打开手机,看看微信,刷刷朋友圈,或者看看新闻,去咖啡店,打开电脑搜索一些关键字,观看视频,电视剧--可是你有没有想过你每一次键盘的敲击,每一次微信的语音的发送,数据会流向 ...

  6. Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  7. 【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有 ...

  8. OC基础13:数字、字符串和集合2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...

  9. lucas模板

    ll PowMod(ll a,ll b,ll MOD){ ll ret=; while(b){ ) ret=(ret*a)%MOD; a=(a*a)%MOD; b>>=; } return ...

  10. Redis 实践笔记

    本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...