我用VC实现了一个多文本编辑器,能够插入位图,继续写下去还可以插入任何COM控件,不知Delphi是怎样来实现边个功能,希望大家多多指教

解决方案 »

  1.   

    不就是richedit;请大家去 http://www.new7wonders.com/c/voting.php 投长城一票
      

  2.   

    to newyj(老鬼) :我早就投过了,可不可提供一下思路,是怎样把BMP插进出的
      

  3.   

    请问有没有办法在RichEdit类控件中画图?想使用RichEdit控件完成类似图文混排的功能,如Word中的文本框,还有Wps2000等。
    但发现RichEdit没有Canvas属性(即使有,也不知道是否能够正常显示)。
    delphi有实现的可能吗?
      

  4.   


    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;
    ================================================================
    我是中国鹰派!
    拒绝日货!
      

  5.   

    从//step 2开始,和我用VC中实现的方法一样,不过在delphi中IRichEditOle;
    IOLEObject;
    tagFORMATETC;
    ISTORAGE;
    IOLECLIENTSITE;
    ILockBytes;
    TReObject;
    这些接口不知道在哪个单元文件中?
      

  6.   

    xzhifei(飞) :TReObject结构是你自己定义的吗
      

  7.   

    www.richedit.com 做得非常好,谁能实现和它差不多的功能