如何将几段文字(含英、中文)显示到Canvas上: (100分)

  • 主题发起人 主题发起人 zouming
  • 开始时间 开始时间
Z

zouming

Unregistered / Unconfirmed
GUEST, unregistred user!
要求:1、在一行里能够按相等间隔显示,如果是英文(含数字),能进行紧缩显示。
2、能进行分段、分行显示。
3、效果和word接近。
 
自己慢慢画,用DrawText
 
用DrawText慢慢画
 
但如何识别中英文
 
Ord(Char)>128
 
如果是一个个字符进行显示,是用textout()还是用drawtext()好?
 
哪里有源码?
 
参考我这段代码,效率可能不是很高 [:)]
procedure DrawCanvasText(Canvas: TCanvas;
Rect: TRect;
Str: String;
BkColor: TColor;
TabWidth: Integer = 8);
var
i, j: Integer;
tmpStr, tmpStr1: String;
sX,sY: Integer;
Len: Integer;
WriteEnable: Boolean;
begin
if Str='' then
Exit;
Str:=StringReplace(Str,#13#10,#13,[rfReplaceAll]);
if RightStr(Str,1)<>#13 then
Str:=Str+#13;
with Rect,Canvasdo
begin
Brush.Style:=bsSolid;
Brush.Color:=BkColor;
FillRect(Rect);
Brush.Style:=bsClear;
sY:=Top;
Len:=Length(Str);
WriteEnable:=False;
i:=0;
while(i<=Len)do
begin
Inc(i);
if Str=#13 then
WriteEnable:=True
else
begin
if Str=#9 then
tmpStr:=tmpStr+StringOfChar(' ',TabWidth)
else
begin
tmpStr:=tmpStr+Str;
if Byte(Str)>=$A0 then
begin
tmpStr:=tmpStr+Str[i+1];
Inc(i);
end;
end;

if (TextWidth(tmpStr)>Right-Left) and (not (Str in [#9,' '])) then
begin
WriteEnable:=True;
if tmpStr[Length(tmpStr)]>=Char($A0) then
begin
tmpStr1:=Copy(tmpStr,Length(tmpStr)-1,2);
tmpStr:=Copy(tmpStr,1,Length(tmpStr)-2);
end
else
begin
for j:=Length(tmpStr)-1do
wnto 1do
begin
if (tmpStr[j]=' ') or (tmpStr[j]>=Char($A0)) then
begin
tmpStr1:=Copy(tmpStr,j+1,Length(tmpStr)-j);
tmpStr:=Copy(tmpStr,1,j);
break;
end;
end;
if j=0 then
begin
tmpStr1:=Str;
tmpStr:=Copy(tmpStr,1,Length(tmpStr)-1);
end;
end;
end;
end;

if WriteEnable then
begin
WriteEnable:=False;
if (sY+TextHeight(tmpStr+' ')>Bottom) then
Exit;
sX:=Left;
if tmpStr<>'' then
TextRect(Rect,sX,sY,tmpStr);
sY:=sY+TextHeight(tmpStr+' ');
if tmpStr1<>'' then
begin
tmpStr:=tmpStr1;
tmpStr1:='';
end
else
tmpStr:='';
end
end;
end;
end;
 
有源码者分高,谁还有源码?
 
textout /drawtext 有什么区别(在windows里调用什么核心函数)?
 
textout只能简单的显示文本
而drawtext可以带格式的显示,比如说居中对齐.....
 
请问extTextOut()如何使用,有实例吗?
 
1。只是等间距,那宋体等字体是等宽字体,没有问题,如果是自定义间距,还不太清楚。
2。DrawText完全可以分行、分段显示
3。与Word差不多。这个比较复杂,主要是字距,行距的问题。不过,用DrawTextEx
可能有些帮助。
 

Similar threads

D
回复
0
查看
838
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部