zoukankan      html  css  js  c++  java
  • Delphi RichEdit的内容保存为图片

    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

  • 相关阅读:
    vue-router重写push方法,解决相同路径跳转报错
    Vue中的权限管理怎么做
    linux启动过程中建立临时页表
    用redis当作LRU缓存
    用IPV6隧道连接IPV4孤岛
    redis协议规范
    nginx的脚本引擎(二)rewrite
    nginx的脚本引擎(一)
    nginx的变量系统
    Singleton
  • 原文地址:https://www.cnblogs.com/findumars/p/4999198.html
Copyright © 2011-2022 走看看