RxRichEdit,Rich98插入图像完全解决方案[Delphi]!

uses 
  RichEdit;//RxRichEdit 
 
//RxRichEdit 
type 
  TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte; 
    cb: Longint; var pcb: Longint): DWORD; 
  stdcall; 
 
  TEditStream = record 
    dwCookie: Longint; 
    dwError: Longint; 
    pfnCallback: TEditStreamCallBack; 
  end; 
//RxRichEdit 
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte; 
  cb: Longint; var pcb: Longint): DWORD; stdcall; 
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; 
 
//RxRichEdit 
procedure PutRTFSelection(RichEdit: TRxRichEdit; SourceStream: TStream); 
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; 
 
function BmpToRTF(Pict: TBitmap): string; 
var//RichEdit98 RxRichEdit 
  bi, bb, rtf: string; 
  bis, bbs: Cardinal; 
  achar: ShortString; 
  hexpict: string; 
  I: Integer; 
begin 
  Pict.PixelFormat := pf8bit; // 我这里用256色地图像 
  GetDIBSizes(Pict.Handle, bis, bbs); 
  SetLength(bi, bis); 
  SetLength(bb, bbs); 
  GetDIB(Pict.Handle, Pict.Palette, PChar(bi)^, PChar(bb)^); 
  rtf := '{/rtf1{/pict/dibitmap' + #13#10; //RTF头+个回车 
  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; 
 
//---RxRichedit 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  Temp: TStringStream; 
begin 
  Temp := TStringStream.Create(BmpToRTF(Image1.Picture.Bitmap)); 
  try 
    PutRTFSelection(RxRichEdit1, Temp); 
  finally 
    Temp.Free; 
  end; 
end; 
 
//---Richedit98 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  RichEdit981.RTFSelText := BmpToRTF(Image1.Picture.Bitmap); 
end; 
插入静态Jpeg,Gif(TGifimage)可以转成TBitmap格式,动态需要自己写Gif Ole
不用第三方控件,让richEdit支持图片与表格换行 DELPHI 6 提供的RICHEDIT是1.0,并不支持图片,对复杂表格也会乱成一团,如何在DELPHI原有控件的基础上做少量修改,使之支持显示图片与正确显示表格,其实只需要几行就好了,方法如下: 找到richEdit控件所在单元ComCtrls.pas (在SOURCE\VCL) //第一步 procedure TCustomRichEdit.CreateParams(var Params: TCreateParams); const // RichEditModuleName = 'RICHED32.DLL';//原来语句 // RichEditClassName = 'RICHEDIT'; //原来语句 RichEditModuleName = 'Msftedit.dll'; //改后语句 RichEditClassName = 'RichEdit50W'; //改后语句 //第二步 procedure TCustomRichEdit.CreateWnd; .... //加入一行要放在 CreateWnd 因为此时 HANDLE已建立 Perform(EM_SetOleCallback, 0, Longint(TRichEditOleCallback.Create(TRichEdit(self)) as IRichEditOleCallback)) ; //第三步 procedure TCustomRichEdit.WMRButtonUp(var Message: TWMRButtonUp); begin inherited; // RichEd20 does not pass the WM_RBUTTONUP message to defwndproc, // so we get no WM_CONTEXTMENU message. Simulate message here. // if Win32MajorVersion < 5 then //是原有1.0的要去掉 Perform(WM_CONTEXTMENU, Handle, LParam(PointToSmallPoint( ClientToScreen(SmallPointToPoint(Message.Pos))))); end; //第四步 procedure TRichEditStrings.Insert(Index: Integer; const S: string); .... //要去掉后面两名 // 1.0 uses, 2.0 will error happened 2011 // if RichEdit.SelStart (Selection.cpMax + Length(Str)) then //是原有1.0的要去掉 // raise EOutOfResources.Create(sRichEditInsertError); //是原有1.0的要去掉
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值