现在有一个RTF 文件.
里面有一些内容. 版式已经排好.字体..字体形色也都设置好了.
现在我想转化成若干张bmp图片(256*64大小的)
图片底色为黑色.内容为RTF文件里面的内容(版式.字体.字体颜色.字体大小都要一致). 当一张图片显示不了.在生成另外的图片.
现在我的大致思路是先在内存中建个TBitmap.在从RTF文件中读出内容.把canvas设好.在画出来.!但读出一行内容后不知道分析他的字体.颜色.大小等等.
里面有一些内容. 版式已经排好.字体..字体形色也都设置好了.
现在我想转化成若干张bmp图片(256*64大小的)
图片底色为黑色.内容为RTF文件里面的内容(版式.字体.字体颜色.字体大小都要一致). 当一张图片显示不了.在生成另外的图片.
现在我的大致思路是先在内存中建个TBitmap.在从RTF文件中读出内容.把canvas设好.在画出来.!但读出一行内容后不知道分析他的字体.颜色.大小等等.
var
bmp: TBitmap;
begin
RtfToBitmap('c:\xx.bmp', Form1.Handle, 256, 64, bmp);
end;
试试这个
Dialogs, StdCtrls, ComCtrls, RxRichEd;
需要这些单元
RxRichEd
是什么控件?
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内容太多或者被隐藏了,就抓不到了。目前我还没有办法得到完美解决效果。关注你的问题。
谢谢楼上的兄弟.
不过我们也是存在你这问题!
当内容很多时.我们分屏的时候出现行重复.!
代码如下.你帮我看看!
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;
还是没人啊?
csdn的高手快出现啊!