各位前辈好,我想在form1中加入ImageList,ComboBoxEx和Richedit。ImageList中添加了许多表情图片,ComboBoxEx用于显示ImageList中图片,通过选择ComboBoxEx中的表情,让该表情显示在Richedit中。
   现在的问题是,1、Richedit可以显示图片吗?
                 2、Richedit可以显示图片的话,如何在Richedit中显示ComboBoxEx选择的表情图 
                    片呢?
                 3、我查看了相关资料,说RxRichEdit可以用来显示图片,那要是采用RxRichEdit
                    又该如何实现?
谢谢各位前辈指导~期待你们的回答!

解决方案 »

  1.   

    用RichEdit比较麻烦,用RxRichEdit就可以了。function ConvertBitmapToRTF(const Bitmap: TBitmap): string;
    var
      bi, bb: string;
      bis, bbs: Cardinal;
      achar: string[2];
      Buffer: string;
      I: Integer;
    type
      PWord = ^Word;
    begin
      GetDIBSizes(Bitmap.Handle, bis, bbs);
      SetLength(bi, bis);
      SetLength(bb, bbs);
      GetDIB(Bitmap.Handle, Bitmap.Palette, PChar(bi)^, PChar(bb)^);
      SetLength(Buffer, (Length(bb) + Length(bi)) * 2);
      i := 1;
      for bis := 1 to Length(bi) do
      begin
        achar := IntToHex(Integer(bi[bis]), 2);
        PWord(@Buffer[i])^ := PWord(@achar[1])^;
        inc(i, 2);
      end;
      for bbs := 1 to Length(bb) do
      begin
        achar := IntToHex(Integer(bb[bbs]), 2);
        PWord(@Buffer[i])^ := PWord(@achar[1])^;
        inc(i, 2);
      end;
      Result := '{\rtf1 {\pict\dibitmap ' + Buffer + ' }}';
    end;procedure InsertBitmapIntoRxRichEdit(const Bitmap: TBitmap; const RxRichEdit:
      TRxRichEdit); overload;
    begin
      RxRichEdit.SelText := ConvertBitmapToRTF(Bitmap);
      RxRichEdit.SelLength := 0;
      RxRichEdit.SelStart := RxRichEdit.SelStart + 1;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var Items:TComboExItem;
        i:integer;
    begin
      ComboBoxEx1.Style:=csExDropDownList;
      for i:=0 to ImageList1.Count-1 do
        begin
          Items:=ComboBoxEx1.ItemsEx.Add;
          Items.Caption:=IntToStr(i);
          Items.ImageIndex:=i;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var Image:TBitmap;
    begin
      if ComboBoxEx1.ItemIndex<>-1 then
         begin
           Image:=TBitmap.Create;
           ImageList1.GetBitmap(ComboBoxEx1.ItemIndex,Image);
           InsertBitmapIntoRxRichEdit(Image,RxRichEdit1);
           Image.Free;
         end;
    end;
      

  2.   

    liangqingzhi(老之)前辈你好,我现在在研究你的程序,我想问function ConvertBitmapToRTF(const Bitmap: TBitmap): string;函数的作用是把Bitmap转换成RTF格式的吧,这个函数的代码您能给出详细的解释吗?我有点看不懂~~~
      

  3.   

    liangqingzhi(老之)前辈你好,你的程序我试过了,可以实现哦!谢谢你!
    但是procedure InsertBitmapIntoRxRichEdit(const Bitmap: TBitmap; const RxRichEdit:
      TRxRichEdit); overload;过程中,把; overload删了才可以运行,要不会一直提示“Invalid compiler directive:'OVERLOAD'”
      

  4.   

    呵呵,这个函数可不是我写的,完整的请参看这个地址:
    http://dev.csdn.net/develop/article/15/15089.shtm
    主要是用GetDIB把设备有关位图转换成设备无关位图
      

  5.   

    本来有好几个函数的重载,只贴了两个,OVERLOAD去掉就行
      

  6.   

    谢谢liangqingzhi(老之)前辈~~