在程序中有一TImage控件读入了一张图片,这个图片比较大,我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,请问一下该怎么实现呀?分不够还可以再加的!请写出代码!
24 个解决方案
#1
用移动image的效果不是更简单?
#2
顶一下^_^
#3
移动image达不到预期的效果呀~~~
#4
是不是要读数据库的图片的?
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点
#5
我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,
是要拆分?要不用几个组件,设置显示的位置
是要拆分?要不用几个组件,设置显示的位置
#6
用重画的方法
#7
自已顶一下,怎么重画???
#8
用stream,指定它的position
#9
小弟初学,请说具体点好吗?最好写出代码!解决了问题点数全部送上!
#10
小弟这里又遇到一个问题,在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码,在Delphi中用TStrings的LoadFormFile就只能读取第一个这个十六进制编码以前的数据,这个十六进制编码和该文件以后的数据都没有读入!请问一下该怎么解决呀????请写出代码,问题点数另开贴送上!
#11
在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码
-------------
这只是形式上的十六进制,其实不是。
-------------
这只是形式上的十六进制,其实不是。
#12
StretchBlt
#13
用CopyRECT就搞定啦,先定义一个Image保存大图片,再定义 一个用来显示
#14
还是不太明白,请写一个实例代码好吗?自已顶上~
#15
不要急,等我睡一觉先:)
#16
TO:
xzhifei(饭桶超人(抵制日货))
帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!
xzhifei(饭桶超人(抵制日货))
帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!
#17
bitblt & sleep // ok ?
#18
刚写了个.
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image2: TImage;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
procedure clearScreen(color: TColor);
procedure Fill;
end;
var
Form1 : TForm1;
pDc : TBitmap; //当前;
bDc : TBitmap; //缓冲;
bbb : boolean; //当前目标;
imageIndex : integer;
implementation
{$R *.dfm}
procedure TForm1.Fill;
begin
if bbb then
Canvas.Draw(0, 0, pdc)
else
Canvas.Draw(0, 0, bdc);
bbb := not bbb;
end;
procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
begin
if bbb then
bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy)
else
bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy);
end;
procedure TForm1.clearScreen(color: TColor);
begin
if bbb then
begin
pDc.Canvas.Brush.Color := clBlack;
pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
end
else
begin
bDc.Canvas.Brush.Color := clBlack;
bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not self.Showing then
exit;
clearScreen(clblack);
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
inc(imageIndex, 1);
if imageindex>=45 then imageindex:=0;
fill;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
pdc := tbitmap.Create;
bdc := tbitmap.Create;
pdc.Width := clientwidth;
pdc.Height := clientheight;
pdc.PixelFormat := pf16bit;
bdc.Width := clientwidth;
bdc.Height := clientheight;
bdc.PixelFormat := pf16bit;
imageIndex := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
pdc.free;
bdc.free;
end;
end.
代码很简陋,就不写注解了
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image2: TImage;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
procedure clearScreen(color: TColor);
procedure Fill;
end;
var
Form1 : TForm1;
pDc : TBitmap; //当前;
bDc : TBitmap; //缓冲;
bbb : boolean; //当前目标;
imageIndex : integer;
implementation
{$R *.dfm}
procedure TForm1.Fill;
begin
if bbb then
Canvas.Draw(0, 0, pdc)
else
Canvas.Draw(0, 0, bdc);
bbb := not bbb;
end;
procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
begin
if bbb then
bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy)
else
bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy);
end;
procedure TForm1.clearScreen(color: TColor);
begin
if bbb then
begin
pDc.Canvas.Brush.Color := clBlack;
pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
end
else
begin
bDc.Canvas.Brush.Color := clBlack;
bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not self.Showing then
exit;
clearScreen(clblack);
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
inc(imageIndex, 1);
if imageindex>=45 then imageindex:=0;
fill;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
pdc := tbitmap.Create;
bdc := tbitmap.Create;
pdc.Width := clientwidth;
pdc.Height := clientheight;
pdc.PixelFormat := pf16bit;
bdc.Width := clientwidth;
bdc.Height := clientheight;
bdc.PixelFormat := pf16bit;
imageIndex := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
pdc.free;
bdc.free;
end;
end.
代码很简陋,就不写注解了
#19
谢谢 S.F.(吃青春饭的) 不过好像还是不行呀~运行时整个窗口都是黑色一片~~
#20
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
调整这个的参数;分别是获取x/y位置的w/h大小的图;
我给你发一个包也可以;留个email.
调整这个的参数;分别是获取x/y位置的w/h大小的图;
我给你发一个包也可以;留个email.
#21
太谢谢S.F.(吃青春饭的) 了。我的E_Mail是:newwhua@163.com
2002106@qq.com
2002106@qq.com
#22
自已顶上.....
等待 S.F.(吃青春饭的) 老兄中......
等待 S.F.(吃青春饭的) 老兄中......
#23
已发送,请查收
#24
哈,已收到,谢谢S.F.(吃青春饭的)
#1
用移动image的效果不是更简单?
#2
顶一下^_^
#3
移动image达不到预期的效果呀~~~
#4
是不是要读数据库的图片的?
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点
#5
我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,
是要拆分?要不用几个组件,设置显示的位置
是要拆分?要不用几个组件,设置显示的位置
#6
用重画的方法
#7
自已顶一下,怎么重画???
#8
用stream,指定它的position
#9
小弟初学,请说具体点好吗?最好写出代码!解决了问题点数全部送上!
#10
小弟这里又遇到一个问题,在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码,在Delphi中用TStrings的LoadFormFile就只能读取第一个这个十六进制编码以前的数据,这个十六进制编码和该文件以后的数据都没有读入!请问一下该怎么解决呀????请写出代码,问题点数另开贴送上!
#11
在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码
-------------
这只是形式上的十六进制,其实不是。
-------------
这只是形式上的十六进制,其实不是。
#12
StretchBlt
#13
用CopyRECT就搞定啦,先定义一个Image保存大图片,再定义 一个用来显示
#14
还是不太明白,请写一个实例代码好吗?自已顶上~
#15
不要急,等我睡一觉先:)
#16
TO:
xzhifei(饭桶超人(抵制日货))
帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!
xzhifei(饭桶超人(抵制日货))
帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!
#17
bitblt & sleep // ok ?
#18
刚写了个.
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image2: TImage;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
procedure clearScreen(color: TColor);
procedure Fill;
end;
var
Form1 : TForm1;
pDc : TBitmap; //当前;
bDc : TBitmap; //缓冲;
bbb : boolean; //当前目标;
imageIndex : integer;
implementation
{$R *.dfm}
procedure TForm1.Fill;
begin
if bbb then
Canvas.Draw(0, 0, pdc)
else
Canvas.Draw(0, 0, bdc);
bbb := not bbb;
end;
procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
begin
if bbb then
bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy)
else
bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy);
end;
procedure TForm1.clearScreen(color: TColor);
begin
if bbb then
begin
pDc.Canvas.Brush.Color := clBlack;
pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
end
else
begin
bDc.Canvas.Brush.Color := clBlack;
bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not self.Showing then
exit;
clearScreen(clblack);
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
inc(imageIndex, 1);
if imageindex>=45 then imageindex:=0;
fill;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
pdc := tbitmap.Create;
bdc := tbitmap.Create;
pdc.Width := clientwidth;
pdc.Height := clientheight;
pdc.PixelFormat := pf16bit;
bdc.Width := clientwidth;
bdc.Height := clientheight;
bdc.PixelFormat := pf16bit;
imageIndex := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
pdc.free;
bdc.free;
end;
end.
代码很简陋,就不写注解了
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image2: TImage;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
procedure clearScreen(color: TColor);
procedure Fill;
end;
var
Form1 : TForm1;
pDc : TBitmap; //当前;
bDc : TBitmap; //缓冲;
bbb : boolean; //当前目标;
imageIndex : integer;
implementation
{$R *.dfm}
procedure TForm1.Fill;
begin
if bbb then
Canvas.Draw(0, 0, pdc)
else
Canvas.Draw(0, 0, bdc);
bbb := not bbb;
end;
procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
destx, desty: integer);
begin
if bbb then
bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy)
else
bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
srccopy);
end;
procedure TForm1.clearScreen(color: TColor);
begin
if bbb then
begin
pDc.Canvas.Brush.Color := clBlack;
pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
end
else
begin
bDc.Canvas.Brush.Color := clBlack;
bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not self.Showing then
exit;
clearScreen(clblack);
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
inc(imageIndex, 1);
if imageindex>=45 then imageindex:=0;
fill;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
pdc := tbitmap.Create;
bdc := tbitmap.Create;
pdc.Width := clientwidth;
pdc.Height := clientheight;
pdc.PixelFormat := pf16bit;
bdc.Width := clientwidth;
bdc.Height := clientheight;
bdc.PixelFormat := pf16bit;
imageIndex := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
pdc.free;
bdc.free;
end;
end.
代码很简陋,就不写注解了
#19
谢谢 S.F.(吃青春饭的) 不过好像还是不行呀~运行时整个窗口都是黑色一片~~
#20
drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
调整这个的参数;分别是获取x/y位置的w/h大小的图;
我给你发一个包也可以;留个email.
调整这个的参数;分别是获取x/y位置的w/h大小的图;
我给你发一个包也可以;留个email.
#21
太谢谢S.F.(吃青春饭的) 了。我的E_Mail是:newwhua@163.com
2002106@qq.com
2002106@qq.com
#22
自已顶上.....
等待 S.F.(吃青春饭的) 老兄中......
等待 S.F.(吃青春饭的) 老兄中......
#23
已发送,请查收
#24
哈,已收到,谢谢S.F.(吃青春饭的)