RichEdit 与 Bmp
来源:互联网 发布:苹果解压软件下载 编辑:程序博客网 时间:2024/05/16 08:12
{
Sometimes you need to draw RichEdit control upon TImage canvas.
Maybe to manipulate it like create transparent RichEdit control
or other manipulate trick. But you don't know how to convert
RichEdit control into Bitmap.
Here's the solution to convert RichEdit control into bitmap.
}
uses RichEdit;
// Sonic Delphi
// soulyx@yahoo.com
function RTFtoBitmap(myRTF: TRichEdit; GiveSpaceForBorder: Integer): TBitmap;
// using myRTF parameter with your TRichEdit control name,
// default name "RichEdit1".
// For GiveSpaceForBorder parameter, sometimes you need to draw
// the RichEdit control with rectangle colorfull border, so you need
// to give space for it.
var
myRect: TRect;
temp: TBitmap;
begin
temp := TBitmap.Create;
myRect := myRTF.ClientRect;
// if you are using PRF_NONCLIENT parameter in myRTF.perform command
// using this statement
// myRect := Rect(0,0,MyRTF.Width,MyRTF.Height);
temp.Width := myRect.Right;
temp.Height := myRect.Bottom;
with temp.Canvas do
begin
Lock;
try
myRTF.Perform(WM_PRINT, Handle, PRF_CLIENT);
//you can trying to change PRF_CLIENT with
//PRF_CHILDREN or PRF_CLIENT or PRF_NONCLIENT or PRF_ERASEBKGND
//or combine them. See what happen...
finally
Unlock
end;
end;
Result := TBitmap.Create;
Result := CreateEmptyBmp(clWhite,
temp.Width + GiveSpaceForBorder * 2,
temp.Height + GiveSpaceForBorder * 2);
Result.Canvas.Lock;
Result.Canvas.Draw(GiveSpaceForBorder, GiveSpaceForBorder, temp);
Result.Canvas.Unlock;
temp.Free;
end;
// Here's to put colorfull border
procedure MakeBorder(const bdr: TBitmap; BorderWidth: Integer; BorderColor: TColor);
begin
with bdr.Canvas do
begin
Brush.Style := bsClear;
pen.Width := BorderWidth;
pen.Color := BorderColor;
rectangle(BorderWidth - 1, BorderWidth - 1, bdr.Width, bdr.Height);
end;
end;
// Example how to using it
//
// var bmp : TBitmap;
// begin
// bmp := RTFtoBitmap(RichEdit1,2);
// MakeBorder(bmp,2,clBlue);
// Image1.Canvas.Draw(5,5,bmp);
// bmp.free;
// end;
//
//
// Hey, how to make it transparent ??
// Hmm.. think it by yourself.
// I can only giving you one starting solution.. hehe
『-----------------------------------------------------------』
uses
RichEdit;
// Stream Callback function
type
TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): DWORD;
stdcall;
TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
// RichEdit Type
type
TMyRichEdit = TRxRichEdit;
// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): DWORD; stdcall;
// by P. Below
var
theStream: TStream;
dataAvail: LongInt;
begin
theStream := TStream(dwCookie);
with theStream do
begin
dataAvail := Size - Position;
Result := 0;
if dataAvail <= cb then
begin
pcb := read(pbBuff^, dataAvail);
if pcb <> dataAvail then
Result := UINT(E_FAIL);
end
else
begin
pcb := read(pbBuff^, cb);
if pcb <> cb then
Result := UINT(E_FAIL);
end;
end;
end;
// Insert Stream into RichEdit
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
// by P. Below
var
EditStream: TEditStream;
begin
with EditStream do
begin
dwCookie := Longint(SourceStream);
dwError := 0;
pfnCallback := EditStreamInCallBack;
end;
RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
end;
// Convert Bitmap to RTF Code
function BitmapToRTF(pict: TBitmap): string;
// by D3k
var
bi, bb, rtf: string;
bis, bbs: Cardinal;
achar: ShortString;
hexpict: string;
I: Integer;
begin
GetDIBSizes(pict.Handle, bis, bbs);
SetLength(bi, bis);
SetLength(bb, bbs);
GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
rtf := '{/rtf1 {/pict/dibitmap ';
SetLength(hexpict, (Length(bb) + Length(bi)) * 2);
I := 2;
for bis := 1 to Length(bi) do
begin
achar := Format('%x', [Integer(bi[bis])]);
if Length(achar) = 1 then
achar := '0' + achar;
hexpict[I - 1] := achar[1];
hexpict[I] := achar[2];
Inc(I, 2);
end;
for bbs := 1 to Length(bb) do
begin
achar := Format('%x', [Integer(bb[bbs])]);
if Length(achar) = 1 then
achar := '0' + achar;
hexpict[I - 1] := achar[1];
hexpict[I] := achar[2];
Inc(I, 2);
end;
rtf := rtf + hexpict + ' }}';
Result := rtf;
end;
// Example to insert image from Image1 into RxRichEdit1
procedure TForm1.Button1Click(Sender: TObject);
var
SS: TStringStream;
BMP: TBitmap;
begin
BMP := TBitmap.Create;
BMP := Image1.Picture.Bitmap;
SS := TStringStream.Create(BitmapToRTF(BMP));
try
PutRTFSelection(RxRichEdit1, SS);
finally
SS.Free;
end;
end;
- RichEdit 与 Bmp
- RichEdit显示文件中的BMP以及插入BMP到RichEdit
- MFC中richedit控件插入BMP图片
- MFC中richedit控件插入BMP图片
- Richedit中插入图片BMP(BMP,文件),GIF(文件)
- Richedit中插入图片BMP(BMP,文件),GIF(文件)
- RichEdit保存与读取
- RichEdit
- richedit
- RichEdit
- RichEdit
- richedit
- RichEdit
- RichEdit
- RichEdit
- RichEdit
- RichEdit的复制与粘贴
- 获得Richedit的行与列
- 在ArcGIS中为Shapefile属性表增加字段
- JQuery 的load()方法
- sql2000 还原数据库 可以不用删除数据库直接去还原
- ArcCatalog中可以修改字段名吗?
- No.6
- RichEdit 与 Bmp
- oracle查询及删除重复记录的方法
- JSON 简介
- 贴出我的原创 无限分类C#版 源代码五
- python 写xml文件
- SAA7121视频图像D/A转换芯片
- 西方哲学史 -- 阿那克西曼德
- Android的intent:基础以及显示/隐式使用Intent,SD挂载识别&& 通过intent返回结果
- 虚拟化实现业务连续性