关于多文本编辑,即有文本,还能够插入图片及其它控件对象
我用VC实现了一个多文本编辑器,能够插入位图,继续写下去还可以插入任何COM控件,不知Delphi是怎样来实现边个功能,希望大家多多指教 问题点数:100、回复次数:10Top
1 楼newyj(吴刚vs西西弗)回复于 2002-10-08 09:46:09 得分 10
不就是richedit;
请大家去 http://www.new7wonders.com/c/voting.php 投长城一票
Top
2 楼simpledevelop(阳光灿烂)回复于 2002-10-08 11:15:06 得分 0
to newyj(老鬼) :我早就投过了,可不可提供一下思路,是怎样把BMP插进出的Top
3 楼hred(魂之火)回复于 2002-10-08 11:41:05 得分 10
可以吗?把程序拿出来看看?Top
4 楼simpledevelop(阳光灿烂)回复于 2002-10-08 11:52:40 得分 0
请问有没有办法在RichEdit类控件中画图?
想使用RichEdit控件完成类似图文混排的功能,如Word中的文本框,还有Wps2000等。
但发现RichEdit没有Canvas属性(即使有,也不知道是否能够正常显示)。
delphi有实现的可能吗?Top
5 楼hongqi162(失踪的月亮)回复于 2002-10-08 11:55:57 得分 0
关注!Top
6 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-10-08 12:01:11 得分 80
procedure proPrintRTFWithBMP(strCaption,strPic,strTitle:string;rtf:TRichEdit);
{strText为要打印的文本 strCaption为打印标题 strPic为图像文件目录
strTitle为要显示在图像右侧的图像标题}
var
FRTF:IRichEditOle;
FOLE:IOLEObject;
formatEtc:tagFORMATETC;
FStorage :ISTORAGE;
FClientSite:IOLECLIENTSITE;
FLockBytes:ILockBytes;
ReObject:TReObject;
xt:TGuid;
FTemp:IUnknown;
strTemp:string;
bCreateNew:boolean;
ABMP:TBitmap;
Ajpeg:TJpegImage;
i:Longint;
begin
// rtfTemp:=TRichEdit.Create(frmPrintFrame);
try
{ with rtfTemp do
begin
Parent := frmPrintFrame;
width:=200;
height:=200;
visible:=false;
Text := strText;
end; }
//图片文件不存在,直接打印文本并退出
if not fileexists(strPic)then
begin
PrintRichEdit(strCaption,rtf);
exit;
end;
abmp:=TBitmap.Create;
ajpeg:= TJpegImage.Create;
try
if ExtractFileExt(strPic)='.jpg' then
begin
bCreateNew:=true;
ajpeg.LoadFromFile(strPic);
abmp.Assign(ajpeg);
strTemp:=ExtractFilePath(strPic)+'0099www.bmp';
abmp.SaveToFile(strTemp);
for i:=1 to 30000 do
application.ProcessMessages;
end
else
strTemp:= strPic;
finally
abmp.Free;
ajpeg.free;
abmp:=nil;
ajpeg:=nil;
end;
sendmessage(rtf.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));
if not assigned(FRTF)then
begin
showmessage('Error to get Richedit OLE interface');
exit;
end;
//建立一个可以访问全局内存的Byte数组 FLockBytes
//返回ILockBytes接口
if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then
begin
showmessage('Error to create Global Heap');
exit;
end;
//建立一个混合文档存取对象
if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or
STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then
begin
showmessage('Error to create storage');
exit;
end;
formatEtc.cfFormat := 0;
FormatEtc.ptd := nil;
FormatEtc.dwAspect := DVASPECT_CONTENT;
FormatEtc.lindex := -1;
FormatEtc.tymed := TYMED_NULL;
FRTF.GetClientSite(FClientSite);
//从文件中创建一个OLE对象
if OleCreateFromFile(GUID_NULL,PWideChar(WideString(strTemp)),IID_IUnknown,0,@formatEtc,
FClientSite,FStorage,FOLE)<>S_OK then
begin
showmessage('Error');
exit;
end;
//现在的FOLE还是一个IUnKnown接口,将其转换为一个 IOleObject接口
FTemp:=FOLE;
FTemp.QueryInterface(IID_IOleObject, FOle);
OleSetContainedObject(FOle, TRUE);
//step 2
reobject.cbStruct := sizeof(TReObject);
FOLE.GetUserClassID(xt);
ReObject.clsid := xt;
reobject.cp := ULong(REO_CP_SELECTION);
reobject.dvaspect := DVASPECT_CONTENT;
reobject.dwFlags := ULong(REO_RESIZABLE) or ULong(REO_BELOWBASELINE);
reobject.dwUser := 0;
reobject.poleobj := FOle;
reobject.polesite := FClientSite;
reobject.pstg := FStorage;
reobject.sizel.cx := 0;
reobject.sizel.cy := 0;
FRTF.InsertObject(reobject);
PrintRichEdit(strCaption,rtf);
finally
if bCreateNew then
Deletefile(strTemp);
FRTF:=nil;
FOLE:=nil;
end;
end;
================================================================
我是中国鹰派!
拒绝日货!Top
7 楼simpledevelop(阳光灿烂)回复于 2002-10-08 12:48:44 得分 0
从//step 2开始,和我用VC中实现的方法一样,不过在delphi中IRichEditOle;
IOLEObject;
tagFORMATETC;
ISTORAGE;
IOLECLIENTSITE;
ILockBytes;
TReObject;
这些接口不知道在哪个单元文件中?Top
8 楼simpledevelop(阳光灿烂)回复于 2002-10-08 13:21:37 得分 0
xzhifei(飞) :TReObject结构是你自己定义的吗Top
9 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-10-08 13:30:08 得分 0
NO!
不瞒你说,我只是粘过来的,不要告诉别人啊!!
================================================================
我是中国鹰派!
拒绝日货!打倒小日本!Top
10 楼simpledevelop(阳光灿烂)回复于 2002-10-25 12:46:44 得分 0
www.richedit.com 做得非常好,谁能实现和它差不多的功能Top




