Canvas的bug? TextOut文字不能完整显示问题 (100分)

  • 主题发起人 主题发起人 majorsoft
  • 开始时间 开始时间
M

majorsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中动态设置image1.width以至image1的长度略大于画出来的字符串长度。
...
edt_content.Font.Size:=32;
image1.width:=round(edt_content.Font.Size*(length(edt_content.Text) div 2 +1 ) *1.2);//字体大小*1.2=字体长度

with image1.Canvas do
begin
Brush.Color:=clBlack;
FillRect(rect(0,0,image1.Width,image1.height));
Font.Color:=clYellow;
Font.Size:=edt_content.Font.Size;
Textout(0,0,edt_content.Text);
end;
end;
我用下面的程序来测试image1的长度,发现 image1的长度是够的,但字符串不能完整地显示,不知道是Canvas的bug,还是程序写法有问题?
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
statusBar1.Panels[1].Text:='move on image'+inttostr(x)+':'+inttostr(y);
end;
 
宽度应该这样估算的
image1.Canvas.TextWidth('W')*1.2*字数
 
同意楼上的,自己不会用表乱说BUG,会被874滴
 
image1.width:= Image1.Canvas.TextWidth(Edit1.text);
 
我敢断定:
其中确实有Bug.不行大家把font.size设大些,输入长串的汉字来测试看看。
用原来的办法,我测试的时候发现image1.width已经足够大了,但textout的时候还是不完整。

下面的方法确实没问题(推荐使用):
const
fFntSize=32;
...
edt_content.Font.Size:=fFntSize;
image1.Canvas.Font.Size:=edt_content.Font.Size;//设置一样的字体大小
image1.width:=image1.Canvas.TextWidth(edt_content.Text);
ps:
Canvas.TextWidth()
Returns the width, in pixels, of a string rendered in the current font.
to 52free:
>>宽度应该这样估算的
>>image1.Canvas.TextWidth('W')*1.2*字数
这样是错误的。
 
我用Delphi的时间不长,还有很多东西都没用过,缺乏经验
老实说我还是第一次用canvas.textWidth,想不到还有如此好的对象方法.感谢jobsxy(他在QQ中推荐了这个办法)。
哎!又走弯路了。
让大家见笑了,笑过之后还请多多指教!
 
宽度应该这样估算的
image1.Canvas.TextWidth('W')*1.2*字数
首先这是估算!!!!

你如果说不准确,或有宽字符的误差情有可说
说是错误可能只能是你认为的错误
 
to 52free. 你的办法估算是可以的,但实际上会出问题。
还有个问题
若在设计期时,若image.width设置的比较小时,无论你在程序中设置多大的长度,
textout只会在设计期的设定的大小区域内显示(我估计原来的方法也是这个原因)。
大家试试,我敢断定这是bug

 
我只有在设计期把image1.width设置得很大,
在程序中把image1设小,还是有用的
 
宽度应该这样估算的
image1.Canvas.TextWidth('W')*1.2*字数 是 低级错误

TCanvas没有Bus,
真的不明白你干吗在Image上写字!!!
乱七八糟!
 
to xuxiaohan,
你仔细地按上面的办法测试过吗?没有的话,请不要乱下结论。因为我确实发现了这个问题。
--理论上讲任何软件是有bug的,只是有大有小,有轻有重而已。

在image输出字符,image中还有图片。
我用来演示文字滚动效果,还有百叶窗等各种效果,就象都市中那些广告一样,你有更好的办法吗?
 
To: majorsoft

你在 image.Width := xxx; 的时候再加一句 image.Picture.Graphic.Width := xxx; 如何?
 
to cqbaobao,
谢谢
textout是输出到image1.picture.Graphic上的。
Graphic.width等于设计期的image1.width.
但image1.width变了,graphic.width并没有变,我想是Tcanvas一个小bug吧。

 
还有一种方法取得字符的信息
GetTextMetrics

BOOL GetTextMetrics(
HDC hdc, // handle of device context
LPTEXTMETRIC lptm // address of text metrics structure
);

Parameters
hdc
Identifies the device context.
lptm
Points to the TEXTMETRIC structure that is to receive the metrics.

typedef struct tagTEXTMETRIC { // tm
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BCHAR tmFirstChar;
BCHAR tmLastChar;
BCHAR tmDefaultChar;
BCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;

BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
 
其实可以把这个看成是灵活性的体现,
一般情况下组件封装的功能越多、状态越多,
那么使用组件的时候,可能花的代码就越少,就越方便,
但是它的性能通常会有所下降,这需要一个平衡。

当然,如果你一定要把你不习惯的东西都叫 Bug 的话,那。。。。。。
 
说的有道理,我错了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
636
import
I
后退
顶部