急!急!急!200分吐血赠送——如何在image上显示文本?(200分)

  • 主题发起人 主题发起人 Ares
  • 开始时间 开始时间
A

Ares

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在image上显示文本,代码如下:
var
s,line: string;
b: Tbitmap;
r: Trect;
linelist: Tstringlist;
i: integer;
begin
if o.Execute then
begin
s:=o.FileName;
linelist:=Tstringlist.Create;
linelist.LoadFromFile(s);
line:='';
for i:=0 to linelist.Count-1 do
line:=line+linelist.Strings+#113;
R:=Rect(image1.left,image1.top,image1.left+image1.width,
image1.top+image1.height);
b:=TBitmap.Create;
DrawText(Canvas.Handle,Pchar(line),-1,R,
DT_CALCRECT or DT_WORDBREAK);
Canvas.Brush.Style:=bsClear;
Canvas.Rectangle(R.left,r.top,r.right,r.bottom);
DrawText(b.canvas.Handle,Pchar(s),-1,R,
DT_WORDBREAK);
BitBlt(image1.Picture.Bitmap.canvas.handle,0,0,image1.Width,image1.Height,
B.canvas.handle,0,0,SRCcopy);
b.free;
linelist.Clear;
linelist.free;
end;

但是为什么无法显示呢?请各位指教,200分就做为酬劳吧:)
 
〉〉BitBlt(image1.Picture.Bitmap.canvas.handle,0,0,image1.Width,image1.Height,
B.canvas.handle,0,0,SRCcopy);
现在image1.width和image1.Height是不是还都是0呢?
 
问题很多嘛:
>> b:=TBitmap.Create;
b的width和height未设置, b是一个空Bitmap(没有任何空间可以画图)

>> DrawText(b.canvas.Handle,Pchar(s),-1,R,
>> DT_WORDBREAK);
即使你设置了b.Width, b.Height, 此时将得到一幅白底黑字的图象

>> BitBlt(image1.Picture.Bitmap.canvas.handle,0,0,image1.Width,image1.Height,
B.canvas.handle,0,0,SRCcopy);
假设b设置了空间那么这句的作用会将Image1.Picture.Bitmap整个清成白底黑字(原来
在Image1上的所有图象都会被擦除.

疑问:
为什么不直接在Image1.Picture.Bitmap.Canvas.Handle上直接TextOut? (当然前提是
你的Image1上有图象), 非要绕那么大一个圈子? (而且是错的?)
 
不如放个label, 做成transparent方式的. ^_^

既简单又方便.
 
呵呵,同意 iknow 。跟我一样,属于懒人作风。
 
对不起,因为很紧急,我忘说明了。因为我的文本很长,不能一次显示完全,
所以需要分屏显示。直接写在image或label,我无法控制。有who知道么?
我的code仅是测试而已:)
 
关文本长短什么事? 看你的目的像是要把Image中的图象作为文字的背景吧?
如果是这样, 用个TempBmp保存Image.picture.Bitmap. 每次刷新Image时先BitBlt将
TempBmp中的内容复制到Image.Picture.Bitmap上, 然后再用Image.Picture.Bitmap.Canvas.Handle
直接TextOut, 只要控制好TextOut中的Rect就能达到分屏显示带背景的文字(背景不变)
 
文本很长就加上滚动条
 
你的代码不能显示文字的关键是使用了标志DT_CALCRECT。
使用DT_CALCRECT的DrawText是不会绘制任何东西,只会计算绘制文字所需要的
矩形框大小。详细去看TCutsomLabel的代码吧
 
DrawText(b.canvas.Handle,Pchar(s),-1,R,DT_WORDBREAK);
pchar(s)我写错了,应该是Pchar(line)

to JohnsonGuo:
我使用了两次drawtext,第一次用来计算r的范围,第二次用来显示。

to Iknow
label不能改变部分文本的颜色
 
你的代码我没仔细看,
有一种通过抓屏实现的方法,
有一个例子,不知需要否
 
放一个label吧,真的很方便的。
 
同意CHENLILI
 
哗,还用Bitblt这样落后的方法。。
早问我不就行了? 我已经用此法写了两个程序了。
函数如下。
1, printback; //打印背景
2, mainprint;

mainprint;
...
// 打印一版 (加滚动条也可以啊。)
printback;
设置cavans 的刷子为透明。
cavans.textout()。 // 这里要计算位置,这里是一个循环。

//

好像就这么简单啊! 。。
要例子吗? 。。
 
同意添加一个TLabel,没有必要那么麻烦
 
怎么不回答? 。。哦,可能是大富翁的邮件发送有问题,我怎么收不到邮件了??
 
TO 杀大龙
给我一个例子
thank you !
 
label当然很方便,但是人家就是想画一画。
打龙兄说得好,用不着BitBlt,bitmap.canvas.textout就行了,
我也做过类似e-book的东东,就是这样做的。
 
后退
顶部