关于在有窗体背景图片的情况下label文本滚动问题

sghff110 2009-12-12 10:53:20
把label.caption放入timer控件的事件中来实现文字滚动效果满意,但当form.paint事件中为窗体添加一幅jpg图片作背景后,label的移动就慢得可怜!好像很吃力的样子。无论用双缓冲,还是把timer的interval设为1,都显得很慢。是否有办法解决?(我不想使用滚动文本的现有三方控件,因为它们无法显示背景)
...全文
101 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqyely 2009-12-13
  • 打赏
  • 举报
回复
学习下。
Frank.WU 2009-12-13
  • 打赏
  • 举报
回复
用 DrawText() 或者 TextOut() ,计算 Top 点坐标,应该避免使用移动控件这种非得已采用的方法来实现。
hjkto 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sghff110 的回复:]
to hjkto:
奇怪了。我用delphi7.请您把窗体的windowState设为wsMaximized.然后对DrawJpeg(Canvas.Handle, '.\2.jpg');一句用//注释方式禁用和使用,反复比较一下,差别很大啊。
[/Quote]

我也用d7
在DrawJpeg(Canvas.Handle, '.\2.jpg')注释前后,label的速度是有一些差别
注释后就快了
sghff110 2009-12-13
  • 打赏
  • 举报
回复
to hjkto:
奇怪了。我用delphi7.请您把窗体的windowState设为wsMaximized.然后对DrawJpeg(Canvas.Handle, '.\2.jpg');一句用//注释方式禁用和使用,反复比较一下,差别很大啊。
hjkto 2009-12-13
  • 打赏
  • 举报
回复
不好意思,刚才没看到后边
以下代码我已经测试了,移动非常正常,不慢。你试试吧

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,jpeg;

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure DrawJpeg(Dc: HDC; FileName: String);
var
jpegimage: TJPEGImage;
gra: TGraphic;
canvas: TCanvas;
begin
jpegimage := TJPEGImage.Create;
try
jpegimage.LoadFromFile(FileName);
gra := jpegimage;
Canvas := TCanvas.Create;
try
canvas.Handle := Dc;
Canvas.Draw(0, 0, gra);
finally
canvas.Free;
end;
finally
jpegimage.Free;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
if Label1.top >- Label1.height then
Label1.top:= Label1.top-1
else
Label1.top:=form1.height-30 ;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval :=5;
label1.Caption :='str';
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
DrawJpeg(Canvas.Handle, '.\2.jpg');
end;

end.

hjkto 2009-12-13
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);

begin
if Label1.top >- Label1.height then
Label1.top:= Label1.top-1
else
Label1.top:=form1.height-30 ;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval :=5;
label1.Caption :='str';
end;

end.


测试你的代码,并没有你所说的移动很慢
我这里非常快
hjkto 2009-12-13
  • 打赏
  • 举报
回复
mark
sghff110 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hexpate 的回复:]
你是怎么移动的?
[/Quote]

const
str:string='1234'
+#13#13#10+'4567';
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Label1.top >- Label1.height then
Label1.top:= Label1.top-1
else
Label1.top:=form1.height-30 ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval :=5;
label1.Caption :=str;
end;
有没有其它思路解决这个问题?
sghff110 2009-12-13
  • 打赏
  • 举报
回复
to sailxia:大侠: DrawText() 或者 TextOut()方法能否显示整段的文本(或载入一个完整的txt文件)?在我的印象中两行字符就需要两行代码,那一百行……?
Hexpate 2009-12-13
  • 打赏
  • 举报
回复
你是怎么移动的?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧