复制 ctrl+c ,粘贴 crrl+v 不就行了吗?

解决方案 »

  1.   

    Delphi本身附带的Richedit是1.0版,不支持插入图象。要实现此功能,就必须使用Richedit2.0,例如RxRichedit或Richedit98。
      

  2.   

    代码: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;
      

  3.   

    用CANVAS自己画一张上去。要是想图片文字互相不影响,那就连文字也一起画上去。