你说你是想在一个CANVAS上同时出现两个或多个以上的
图片特技效果,那根本不用多线程,看看下面的代码,我用来实现下雪特级的动画
具体代吗到http://mypage.xueyou.com/~codehunter上下载
/*★★★★★★★★★★★★★★★★
★ copyright codehunter 2001★
★ 名字:杨华 ★
★E-Mail:codehunter@sohu.com★
★★★★★★★★★★★★★★★★*/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//设置窗口画布的画刷为透明
this->Canvas->Brush->Style=bsClear;
//设置窗口客户区的大小为图片大小
this->ClientWidth=Image1->Width;
this->ClientHeight=Image1->Height;
//设置定时器为30毫秒
Timer1->Interval=30;
//初始化雪花
InitSnows();
//初始化两个内存图片
ImgBK=new Graphics::TBitmap();
ImgBK->Assign(Image1->Picture->Graphic);
SrcImg=new Graphics::TBitmap();
SrcImg->Assign(Image1->Picture->Graphic);
//初始化字幕
StringList = new TStringList();
StringList->Add("★★★★★★★★★★★★★★★★");
StringList->Add("★★★要想人爱我必先我爱人★★★");
StringList->Add("★ copyright codehunter 2001 ★");
StringList->Add("★★★★★★★★★★★★★★★★");
StringList->Add("");
StringList->Add("可爱的丽丽");
StringList->Add("看到这个程序你开心吗");
StringList->Add("我想你一定很开心");
StringList->Add("因为这是我爱你的具体行动呀");
StringList->Add("虽然我没有什么美丽的玫瑰送给你");
StringList->Add("也没有精美的礼物送给你");
StringList->Add("我只能敲击键盘敲出漂亮的代码");
StringList->Add("敲出美丽的程序");
StringList->Add("用心去敲击");
StringList->Add("用心去做那似乎平淡的东西");
StringList->Add("但是其中却包含着最珍贵的东西");
StringList->Add("那就是");
StringList->Add("爱你");
StringList->Add("");
StringList->Add("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
StringList->Add("");
StringList->Add("不知道你想怎么补偿我对你所做的一切");
StringList->Add("也许你会说声谢谢你杨华");
StringList->Add("也许你会说杨华我喜欢你");
StringList->Add("但是这些我都不要");
StringList->Add("我只要你真心给我一个吻");
StringList->Add("心甘情愿的给我");
StringList->Add("");
StringList->Add("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
StringList->Add("");
StringList->Add("之所以选择雪");
StringList->Add("是因为洁白无暇的雪象征着");
StringList->Add("我和你纯洁的爱和真挚的友谊");
StringList->Add("难道不是吗丽丽");
StringList->Add("真的希望有一天");
StringList->Add("丽丽能像图片上那个女孩那样");
StringList->Add("依偎在心爱的人怀里");
StringList->Add("而那个人就是我");
StringList->Add("");
StringList->Add("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
StringList->Add("");
StringList->Add("但是现实总是残酷");
StringList->Add("我和你可能会因为种种原因");
StringList->Add("不能在一起");
StringList->Add("但是我不怕");
StringList->Add("我想我一定能吻你");
StringList->Add("而且我一定要吻你");
StringList->Add("并且要吻你250分钟");
StringList->Add("因为我定义的雪花总共有250朵");
StringList->Add("丽丽请答应我吻你的请求");
StringList->Add("完");
StringList->Add("");
StringList->Add("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
}
//---------------------------------------------------------------------------
//初始化雪花的函数
void TForm1::InitSnows()
{
randomize();
int temp;
for(int i=0;i<MAXSNOWS;i++)
{
snows
.sp.x=rand()%this->Width;
snows.sp.y=-rand()%this->Height;
snows.ssize=rand()%MAXSNOWSIZE;
temp=rand()%255;
if(temp<230) temp=255;
snows.scolor=(TColor)RGB(temp,temp,temp);
}
}
//---------------------------------------------------------------------------
//画雪花的函数
void __fastcall TForm1:rawSnows(TCanvas *DCanvas,snow p)
{
DCanvas->Brush->Color=p.scolor;
DCanvas->Pen->Style=psClear ;
DCanvas->Ellipse(p.sp.x,p.sp.y,p.sp.x+p.ssize,p.sp.y+p.ssize);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
this->Canvas->Draw(0,0,SrcImg);//将画好的帧画到窗口上
SrcImg->Canvas->Draw(0,0,ImgBK);//用背景重画帧
static int y=this->Height;
if(y<-750) y=this->Height;//字幕行数决定750这个值
y--;
DrawText(SrcImg->Canvas,SrcImg->Width,y);//将文本画在新的帧上
randomize();
int temp;
for(int i=0;i<MAXSNOWS;i++)
{
if(snows.sp.y>this->Height)
{
snows.sp.y=0;
snows.sp.x=rand()%this->Width;
}
snows.sp.y+=4;
temp=rand()%100;
if(temp<50)
snows.sp.x++;
else
snows.sp.x--;
DrawSnows(SrcImg->Canvas,snows);
}
}
//---------------------------------------------------------------------------
//显示字幕的函数
void __fastcall TForm1:rawText(TCanvas *DCanvas,int x,int y)
{
DCanvas->Brush->Style =bsClear;
DCanvas->Font->Name="宋体";
DCanvas->Font->Size=9;
DCanvas->Font->Color=clWhite;
int dx;
x/=2;
TEXTMETRIC ReturnResults;
GetTextMetrics(DCanvas->Handle,&ReturnResults);
for(int i=0;i< StringList->Count;i++)
{
y+=15;
if(y>40&&y<240)
{
dx=x-(ReturnResults.tmAveCharWidth*StringList->Strings.Length())/2;
DCanvas->TextOutA(dx,y,StringList->Strings);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//最后将申请的资源释放
delete ImgBK;
delete SrcImg;
delete StringList;
}
//end.