现在有一个RTF 文件.
  里面有一些内容. 版式已经排好.字体..字体形色也都设置好了.
现在我想转化成若干张bmp图片(256*64大小的)
      图片底色为黑色.内容为RTF文件里面的内容(版式.字体.字体颜色.字体大小都要一致). 当一张图片显示不了.在生成另外的图片.
    现在我的大致思路是先在内存中建个TBitmap.在从RTF文件中读出内容.把canvas设好.在画出来.!但读出一行内容后不知道分析他的字体.颜色.大小等等.

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
        bmp: TBitmap;
    begin
        RtfToBitmap('c:\xx.bmp', Form1.Handle, 256, 64, bmp);
    end;
    试试这个
      

  2.   

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, RxRichEd;
    需要这些单元
      

  3.   


      RxRichEd 
                是什么控件? 
      

  4.   

    procedure   ScreenShot(hWindow:   HWND;   bm:   TBitmap);   
    var
          Left,   Top,   Width,   Height:   Word;
          R:   TRect;
          dc:   HDC;
          lpPal:   PLOGPALETTE;
    begin
          if   not   IsWindow(hWindow)   then   Exit;   
          GetWindowRect(hWindow,   R);
          Left   :=   R.Left;
          Top   :=   R.Top;
          Width   :=   R.Right   -   R.Left;
          Height   :=   R.Bottom   -   R.Top;   
          bm.Width   :=   Width;   
          bm.Height   :=   Height;
          dc   :=   GetDc(0);
          if dc=0 then Exit;
          if   (GetDeviceCaps(dc,   RASTERCAPS)   and   
              RC_PALETTE   =   RC_PALETTE)   then   begin   
              GetMem(lpPal,   SizeOf(TLOGPALETTE)   +(255   *   SizeOf(TPALETTEENTRY)));   
              FillChar(lpPal^,SizeOf(TLOGPALETTE)   +(255   *   SizeOf(TPALETTEENTRY)),#0);   
              lpPal^.palVersion   :=   $300;   
              lpPal^.palNumEntries   :=   GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);   
              if   (lpPal^.PalNumEntries   <>   0)   then   begin   
                  bm.Palette   :=   CreatePalette(lpPal^);   
              end;   
              FreeMem(lpPal,   SizeOf(TLOGPALETTE)   +   (255   *   SizeOf(TPALETTEENTRY)));
          end;   
          BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,Left,Top,SRCCOPY);   
          ReleaseDc(0,   dc);   
    end;procedure   TForm1.Button1Click(Sender:   TObject);
    var b:   TBitMap;
    begin
     b   :=   TBitmap.Create;
     ScreenShot(RichEdit1.Handle,   b);
     Image1.Picture.Bitmap   :=   b;
     b.Free;
    end;
    上面的代码可以实现,不过缺点是如果RichEdit1内容太多或者被隐藏了,就抓不到了。目前我还没有办法得到完美解决效果。关注你的问题。
      

  5.   


      谢谢楼上的兄弟.
      不过我们也是存在你这问题! 
       当内容很多时.我们分屏的时候出现行重复.!
      代码如下.你帮我看看!
     var bmp:Tbitmap;
          IM,i:Integer;
    begin
        bmp:=tbitmap.Create;
        bmp.Height :=RichEdit1.Height;
        bmp.Width  :=RichEdit1.Width;  // 下翻:RichEdit1.Perform(WM_VSCROLL,SB_PAGEDOWN,0);
      // 上翻:RichEdit1.Perform(WM_VSCROLL,SB_PAGEUP,0);    SendMessage(RichEdit1.Handle,WM_VSCROLL,SB_TOP,0);
        RichEdit1.SelStart := 0;
        RichEdit1.SelLength:=0;
        RichEdit1.SetFocus; //   if iM = 65536 then SendMessage(RichEdit1.Handle,EM_SCROLL, SB_top,0);
      //如果返回值大于65536,则返回值与65536的差值就是滚动的行数    iM := 65537; //赋初值
        i:=3;
        while iM > 65536 do
        begin      //? 是否有问题呢
          bitblt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,FrmPublishMessage.Canvas.Handle,RichEdit1.Left,RichEdit1.Top,srccopy);
          bmp.SaveToFile(ExtractFilePath(application.ExeName )+'DISP'+formatfloat('0',i)+'.bmp');      sleep(1000);
          iM := RichEdit1.Perform(EM_SCROLL, SB_PAGEDOWN ,0);
          RichEdit1.SelStart := 0;
          RichEdit1.SelLength:=0;
          RichEdit1.SetFocus;
          showmessage(inttostr(im-65536));
          if im=65536 then break;
          i:=i+1;
        end;
        bmp.Free;
      

  6.   


     还是没人啊?
     csdn的高手快出现啊!
      

  7.   

    有一种取打印御览的方法, delphi盒子上面有