TRichEditの情報をCanvasに描画したい

解決


studio-take  2014-08-12 18:35:24  No: 46613

TRichEditの文字情報をFirebirdのBlob保存しています。
これを読み出して、ビューワ専用にTImageのキャンバスにそのまま、描画したいのですが、よさげなメソッドが見あたりません。

http://mrxray.on.coocan.jp/Delphi/plSamples/T160_RichEdit1.htm
も見たのですが、Delphi7ではTFormatRangeという型がなさそうなので、
どうしたものかと悩んでおります。

ご助言宜しくお願いします。


igy  2014-08-12 18:46:29  No: 46614

>Delphi7ではTFormatRangeという型がなさそうなので、

uses に RichEdit を追加すれば、使えませんか?


au  2014-08-12 18:48:25  No: 46615

WindowsのAPIから移植してるだけのはずなので
この辺りを参考に定義したらそのまま使えるんじゃないでしょうか
ttp://msdn.microsoft.com/ja-jp/library/windows/desktop/bb787911(v=vs.85).aspx


DEKO  2014-08-12 18:59:27  No: 46616

> Delphi7ではTFormatRangeという型がなさそうなので
ありますよ。uses に RichEdit を追加してみてください。

> ビューワ専用にTImageのキャンバスにそのまま、描画したい
TRichEdit.ReadOnly := True; ではダメなのでしょうか?
こちらの方が表示内容をコピペできるので使い勝手はいいような気がするのですが…?

[余談]
コピペできないとイラッとする事もあるので、
作るアプリケーションによっては TLabel ではなく 
TEdit の枠を消したもので置換する事があります。


studio-take  2014-08-12 21:43:11  No: 46617

みなさんありがとうございます。
USES  にRICHEDIT追加しました。

なんとか動きました。
Mr.XRAY氏のソースをお借りして、自分なりに使えるようにしました。

TImageと書いていましたが、実はフェイクで、TStringGridのOnDrawCellに記入していたのです。

以下の手続きにStringGridのセルのキャンバスとRect情報を入れたら望み通りになりました。
一部理解しきれてない部分もありますが、これでいけそうです。

//=============================================================================
//  RichEditの内容を描画
//  X1       : 描画領域の左端X座標値
//  X2       : 描画領域の右端X座標値
//  Y1       : 描画領域の上端Y座標値
//  Y2       : 描画領域の下端Y座標値
//  RichEdit : TRichEdit
//=============================================================================
procedure Tfrm.RichEditDraw(Canvas:TCanvas;X1,X2,Y1,Y2: Integer; Rich: TRichEdit);
var
  Range   : TFormatRange;
  SaveMap : Integer;
begin
  //Rangeを0(null)で埋める
  FillChar(Range, SizeOf(TFormatRange), #0);

  //出力先デバイスのハンドル
  Range.hdc := Canvas.Handle;
  //書式設定するデバイスのハンドル
  Range.hdcTarget := Range.hdc;

  //描画領域の指定
  Range.rc.Left   := MiliToPixcel(X1);
  Range.rc.Right  := MiliToPixcel(X2);
  Range.rc.Top    := MiliToPixcel(Y1);
  Range.rc.Bottom := MiliToPixcel(Y2);

  Range.rcPage := Range.rc;

  //テキストの最初から
  Range.chrg.cpMin := 0;
  //最後まで(-1で自動計算)/
  Range.chrg.cpMax := -1;

  //マップモードMM_TEXTにして前のマップモードをSaveMapに保存
  SaveMap := SetMapMode(Range.hdc, MM_TEXT);
  //バッファのフラッシュ}
  SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0);
  try
    //実際の印刷
    SendMessage(Rich.Handle, EM_FORMATRANGE, 1, Longint(Addr(Range)));
  finally
    //バッファのフラッシュ
    SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0);
    //マップモードを元に戻す
    SetMapMode(Range.hdc, SaveMap);
    //TPrev(plPrev1).ScaleInitialize(Canvas, False);
  end;

end;

function TfrmMessage.MiliToPixel(V: Integer): Integer;
var
  DC: HDC;
  dpi:Integer;
begin
  DC := GetDC(0);
  dpi := GetDeviceCaps(DC,LOGPIXELSX);//96
  ReleaseDC(0, DC);
  Result := Trunc(V * 1440 / dpi);//15で丁度いい
end;


studio-take  2014-08-12 21:44:16  No: 46618

解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加