200分救命!!!!!!!!!!!(200分)

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

ANTIDEAD

Unregistered / Unconfirmed
GUEST, unregistred user!
image1.canvas.textout,在Ttimer中输出移动字,在有背景的情况下,输出会覆盖掉背景,问题是如何重绘?(给点代码吧!)
 
前面加一句:

SetBkMode(Handle,TRANSPARENT);
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x-1;
tt:=tt-1;
if x<-160 then
x:=image1.Height+20;
tt:=x+80;

image1.canvas.Font.size:=18;
image1.canvas.Font.color:=$1200ffff;
SetBkMode(canvas.Handle,TRANSPARENT);
image1.canvas.TextOut(10,x,'ok 字幕移动演示');
to :卷起千堆雪tyn ,handle指那一个句并,handle,form1.handl,image1.canvas.handle(不行),image1.picture.bimmap.handle(不行),image1.picture.handle(死)
msdn上说,指一个dc,delphi藏在哪里了?急!!

 
我测试了一下,
image1.canvas.Font.size:=18;
image1.canvas.Font.color:=$1200ffff;
SetBkMode(image1.canvas.Handle,TRANSPARENT);
~~~~~~~~~~~~~~~~~~~~肯定的
image1.canvas.TextOut(10,x,'ok 字幕移动演示');

但效果...................
 
to sonie
image1.canvas.TextOut(10,x,'ok 字幕移动演示');这句是在一副bmp图上输出的(image1.picture:=1.bmp),
字从背景划过时,背景被白色覆盖了,使用 image1.canvas.Handle 不能重绘背景图,我的问题是怎样重绘被覆盖的背景,多谢帮忙!
 
to sonie
你有效果好的方法,告诉我,也行。
 
把你的IMAGE拷贝一份,现在IMAGE1是隐藏的,IMAGE2是画图的,然后:

TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer; //Timer.Interval设置为200
Image2: TImage;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
FTextAng: Integer;
public
{ Public declarations }
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
W,H, X,Y,CX,CY,R: Integer;
S :String;
Rct : TRect;
begin
with Image2 do
begin
CX := Width div 2;
CY := Height div 2;
R :=20;
S := 'Hello';
W := Canvas.TextWidth(S);
H := Canvas.TextHeight(S);
X := CX+Round(Cos(FTextAng*PI/180)*R);
Y := CY+Round(Sin(FTextAng*PI/180)*R);
Rct := Rect(X,Y,X+W,Y+H);
Canvas.CopyRect(Rct,Image1.Canvas,Rct);//重画背景,从IMAGE1中COPY

FTextAng := FTextAng+10;
X := CX+Round(Cos(FTextAng*PI/180)*R);
Y := CY+Round(Sin(FTextAng*PI/180)*R);
Canvas.TextOut(X,Y,S);
end;
end;

可能比较闪烁,那就把Image2.Stretch 设为TRUE吧(难看?再把AUTOSIZE设置为TRUE)。
 
在FormActivate中添加getformimage()事件即可!
 
Image1----as a backsurface
..itime := gettickcount
..form1.canvas.draw(Image1)
..showmessage(inttostr(gettickcount-ittime))
 
to huzz:
如何去处字后的白底,光要字。
to yb_unique:
getformimage event 在哪?form 和 image 都没有。
to wlmmlw:
好象不能动,能详细些吗?
 
简单,加一句:
Image2.Canvas.Brush.Style := bsClear;
 
procedure TForm1.Timer1Timer(Sender: TObject);

var
W,H, X,Y,CX,CY,R: Integer;
S :String;
Rct : TRect;
begin

with Image2 do
begin
CX := Width div 2;
CY := Height div 2;
R :=20;
S := ' █';
W := Canvas.TextWidth(S);
H := Canvas.TextHeight(S);
Image2.Canvas.Brush.Style := bsClear;
X := CX{+Round(Cos(FTextAng*PI/180)*R)};
Y := CY{+Round(Sin(FTextAng*PI/180)*R)};
Rct := Rect(X,Y,X+W,Y+H);
Canvas.CopyRect(Rct,Image1.Canvas,Rct);//重画背景,从IMAGE1中COPY

FTextAng := FTextAng+2;
X := CX-FTextAng{Round(Cos(FTextAng*PI/180)*R)};
Y := CY{+Round(Sin(FTextAng*PI/180)*R)};
Canvas.TextOut(X,Y,S);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Ftextang:=0;
timer1.interval:=50;
end;


to huzz:
是画图太慢吗?
 
接受答案了,谢谢各位!特别感谢huzz.
 
多人接受答案了。
 
后退
顶部