在扩展RichEdit或RichTextBox控件中插入位图

阅读:728次   时间:2003-08-15 00:00:00   字体:[ ]
    将位图作为一个对象插入工作得很好,但是用户可以打开和编辑它,并且图象必须是一个已存在的文件。用剪贴板工作得更好,但是它将擦掉以前的内容。因为我的工程要求图象不可编辑而且不能动剪贴板,我必须求助于编辑RTF。如果你有Rxlib,或是使用Microsoft RichTextBox控件(和VB5+一起的),这个方法可能对你有用。请原谅程序的笨拙。因为我不喜欢装载大图象带来的延迟,非常欢迎提出优化它的建议。

function BitmapToRTF(pict: TBitmap): string; 
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; 

    这个函数返回一段可以被导入到RxRichEdit或RichTextBox选择的RTF流。

    这对我来说似乎工作得很好:

{假设SS是TStringStream,RE是TRxRichEdit,BMP是一存有图片的TBitmap。} 
SS := TStringStream.Create(BitmapToRTF(BMP)); 
RE.PlainText := False; 
RE.StreamMode := [smSelection]; 
RE.Lines.LoadFromStream(SS); 
SS.Free; 

    如果你不知道RxRichEdit是什么并想知道,你可以在这里获得有关资料: http://www.rxlib.com/ 
    
    如果你不知道RTF(RichText Format)是什么,你可以在这里读到一点东西:http://chesworth.com/pv/file_format/rtf.txt 


关于本站 - 广告服务 - 会员指南 - 联系方法
Copyright ©2003-2011 源码天空 All Rights Reserved