动画编程代码(代码生成动画)

http://www.itjxue.com  2023-01-28 07:15  来源:未知  点击次数: 

怎么样通过VC实现动画应用

在VC程序中插入微型动画

---- 下面利用CImageList类保存数幅画面,利用Draw函数在一定的时间间隔播放出来,形成了类似GIF动画的效果。该方法可以在Window的客户区内、工具条上、状态条上播放动画。这里还给出了利用SetIcon函数在窗口标题栏上播放动画的方法。

---- (一)、原理

----

在VC中有一个CImageList类可以以图像列表的方式管理图像,图像列表中的图像大小相同,索引以0为开始,每个图像都可以单独引用。Microsoft

的API提供了一系列的函数,您可以利用这些函数创建、销毁图像列表,可以显示图像、增加和删除图像,替代、合并和拖动图像。

---- CImageList 类提供了Windows图像列表通用控件功能。下面对本文用到的函数简要说明如下:

BOOL Create( int cx, int cy, UINT nFlags, int nInitial, intnGrow );

---- 该函数用于创建一个图像列表。 cx,cy

是每个图像的宽度和高度;nFlags是图像列表的类型,其值仅可包含一个ILC_COLOR值。其详细取值参见VC在线帮助。nInitial为图像列表最初含有的图像数目;nGrow为当图像数量需要改变时,每次动态增长的图像数。

BOOL Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle );

---- 该函数用于显示一个图像。pdc为目标设备上下文的指针;nImage为要显示的图像索引;pt为图像显示的位置;nStyle为图像显示风格,详见在线帮助。

HICON ExtractIcon( int nImage );利用该函数可以得到一函数的句柄:int Add( HICON hIcon );该函数把一个图像加入图像列表中。

---- (二)、编程与实现

----

首先,建立图表资源。在VC6.0中利用资源编辑器,建立几幅图表,IDI_ICON1、IDI_ICON2、IDI_ICON3......在编辑图标时选择Custom,将图标设置成大小为64X32。由于Windows的各个部件不完全相同,其实现方法也不完全相同,下面对在窗口不同位置显示动画的方法分别加以介绍。

---- 1. 在View类客户区绘制动画

---- 在类的定义文件中加入下列变量:

POINT pt1;//图像显示的位置int m_Play; //将要显示图像的索引void CreateImageList();//创建图像列表的函数CImageList m_ImageList1;//图像列表对象int m_ImageNumber; //图像列表中图像的总数目首先初始化pt1.m_Play、m_ImageNumber:CImageView::CImageView(){// TODO: add construction code herept1.x =1;pt1.y =1;m_Play=0;m_ImageNumber=0;}CreateImageList()的实现如下:void CImageView::CreateImageList(){m_ImageList1.Create (64,32,ILC_COLOR,5,2);HICON hIcon = ::LoadIcon(AfxGetResource-Handle(),MAKEINTRESOURCE(IDI_ICON1));m_ImageList1.Add(hIcon);m_ImageNumber++;hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2));m_ImageList1.Add(hIcon);m_ImageNumber++;hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON3));m_ImageList1.Add(hIcon);m_ImageNumber++;//把您要播放的所有资源加入图像列表。}在OnCreate函数中设置计时器,并创建图像列表:int CImageView::OnCreate(LPCREATESTRUCTlpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereCreateImageList();SetTimer(1,500,NULL);return 0;}响应ON_TIMER消息,显示动画:void CImageView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();if(m_Play m_ImageNumber)m_Play=0;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);m_Play++;ReleaseDC(pDC);CView::OnTimer(nIDEvent);}

---- 最后别忘了在OnDestroy函数中,增加在窗口撤销时中止定时器的代码。

---- 2. 在状态条上显示动画

---- 由于状态条也是窗口,所以也可以在其上显示动画。在CMainFrame类中可以看到下列代码:

protected: // control bar embedded membersCStatusBar m_wndStatusBar;

---- 所以为了在状态条上显示动画,其编程代码应在CMainFrame类中加入。首先创建资源文件和图像列表类,具体方法和代码见View类客户区绘制动画一节,此处不再重复。下面给出ON_TIMER的响应函数:

void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif(m_Play m_ImageNumber)m_Play=0;//如果图画为最后一个,显示第一幅图片CDC *pDC=this- m_wndStatusBar. GetDC();ASSERT(pDC!=NULL);pt1.x=1;pt1.y =1;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);m_Play++;CFrameWnd::OnTimer(nIDEvent);}

---- 上述代码将在状态条左上方播放动画。

---- 3. 在工具栏上播放动画

---- 由于工具栏的性质与状态条差不多,其播放动画的方法也相似,下面给出ON_TIMER的响应函数:

void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif(m_Play m_ImageNumber)m_Play=0;//如果图画为最后一个,显示第一幅图片CRect rect;CDC *pDC;pDC=this- m_wndToolBar.GetDC();ASSERT(pDC!=NULL);this- m_wndToolBar.GetClientRect(rect);//获得显示有效区域pt1.x =rect.right -64; //将显示位置定在最右边pt1.y=1;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);m_Play++;CFrameWnd::OnTimer(nIDEvent);}

---- 上述代码将在工具栏右上方播放动画。但如仔细观察,动画的位置并不是靠近窗口最右边,这是因为工具栏的窗口有边界,采用如下方法,可以把画面移到窗口右边:

pDC=GetDC ();//获得CMainFrame的画图设备指针ASSERT(pDC!=NULL);this- GetClientRect(rect);pt1.x =rect.right-64 ;pt1.y=rect.top+3 ;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);这是因为工具栏占据的位置属于CMainFrame的客户区。

---- 4. 使图标变成动画

---- 在CWnd类中有一个函数:

HICON SetIcon( HICON hIcon, BOOL bBigIcon);可以改变窗口的图标,所以您可以通过使用该函数不断地改变图标使图标动起来,效果像GetRight一样。 在OnTimer函数中加入下列代码:SetIcon(m_ImageList1.ExtractIcon(m_Play),FALSE);

---- 就可以使图标动起来。当然为了使程序工作得更好,您最好重建一套图标资源。

怎么用C语言编程实现一个简单的动画

1.可以考虑用Turbo C的绘图函数(附加graphic.h库)或者用opengl+glut等来实现。 2.前者一般就是纯粹的画点画线。网上也能找到教程。3.主要说一下后者。可以导入图片,并且二维、三维动画都可以做,甚至是用来开发游戏。后者可以用vc6.0或者vs2005来开发。跨平台。参考教程: 看你的描述要做比较偏数学的东西,那你自己得弄明白如何去实现绘制算法。要实现的动画本身而搭的基本框架不会很复杂的,可能100行代码都不用。4.另外还有opencv、GDI之类的可能更适合二维图像处理库,但我自己不是很了解了,你也可以查一查用哪种绘图库比较适合你。

求一简单的C语言动画程序。

C语言动画程序

#include math.h

#include stdio.h

#include graphics.h

#include dos.h

#define pi 3.1415926535

double ca3mm1(double m1,double m2);

double ca3fm1(double cosine,double sine);

double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang);

double ca6fm2(double a4m ,double a4f,double a5m , double a5f);

char inbox(int x,int y,int x1,int y1);

char buf();

main()

{

double m=3.0;

double xo=100.0,yo=200.0,a1=30.0,t1=pi;

double xc=xo+m*a1,yc=yo;

double a2=8.0,a3,a4=25.0,a5=30.0,a6=20.0,a7=35.0;

double t2,t3,t4,t5,t6,t7;

double xo1=xo+m*150,yo1=yo;

double xc1=xo1-m*a1,yc1=yo1;

double i,j,k;

double l1;

double n=116.1,nt;

initscreen();

setfillstyle(SOLID_FILL,DARKGRAY);

bar(0,0,640,480);

mybutton(10,10,"BEGIN",1,0);

mybutton(500,10,"EXIT",1,0);

line(0,69,640,69);

mouseinit();

changemousecross();

setmousexy(320,20);

mouseshow();

setmousearea(0,0,640,60);

do{

if(inbox(10,10,70,26)button()==1)

{mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }

if(inbox(500,10,555,26)button()==1)

{mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }

if(buf()==56)

for(i=0;i10000;i++){

switch (buf()){

case 18:{

mousehide();

mybutton(500,10,"EXIT",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(500,10,"EXIT",1,7);

mouseshow();

exit(0);

}

case 48: {

mousehide();

mybutton(10,10,"BEGIN",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(10,10,"BEGIN",1,7);

mouseshow();

goto run;

}

default:break;

}

}

}while(1);

run:

drawjijia(xo,yo,1);

drawjijia(xc,yc,1);

drawjijia(xo1,yo1,1);

drawjijia(xc1,yc1,1);

setwritemode(1);

do{

for(i=0;i360.0;i+=1.0)

{

t2=i;

a3=ca3mm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));

t3=ca3fm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));

a4=a3;

t4=t3;

t5=ca5fm2(a6,a5,a4,t4,0);

t6=ca6fm2(a4,t4,a5,t5);

t7=t6-90.0;

l1=xc1-xc-2*m*a7*cos(t7*pi/180);

nt=(asin(l1/2/(n/2))*180/pi)-90.0;

drawline(xo,yo,a2,t2,m,LIGHTGRAY);

drawline(xo+m*a2*cos(t2*pi/180),yo-m*a2*sin(t2*pi/180),a5,t5,m,LIGHTGRAY);

drawline(xc,yc,a6,t6,m,LIGHTGRAY);

drawline(xc,yc,a7,t7,m,LIGHTGRAY);

drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);

drawline1(xo1+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((180-t2)*pi/180),a5,t5,m,LIGHTGRAY);

drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);

drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);

for(j=-1;j20;j++)

{ drawline(xc+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN);

drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,DARKGRAY);

}

delay(300);

drawline(xo,yo,a2,t2,m,LIGHTGRAY);

drawline(xo+m*a2*cos(t2*pi/180.0),yo-m*a2*sin(t2*pi/180.0),a5,t5,m,LIGHTGRAY);

drawline(xc,yc,a6,t6,m,LIGHTGRAY);

drawline(xc,yc,a7,t7,m,LIGHTGRAY);

drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);

drawline1(xo1+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((180-t2)*pi/180),a5,t5,m,LIGHTGRAY);

drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);

drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);

for(j=-1;j20;j++)

{ drawline(xc+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN);

drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,DARKGRAY);

}

setwritemode(0);

if(inbox(500,10,555,26)button()==1)

{mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }

if(buf()==56)

for(k=0;k10000;k++){

switch (buf()){

case 18:{

mousehide();

mybutton(500,10,"EXIT",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(500,10,"EXIT",1,7);

mouseshow();

exit(0); }

default:break;

}

}

setwritemode(1);

}

}while(1);

}

drawline(double xo,double yo,double mo,double fujiao,double m,int color)

{

double x,y;

x=(xo+m*mo*cos(fujiao*pi/180));

y=(yo-m*mo*sin(fujiao*pi/180));

setcolor(color);

line (xo,yo,x,y);

}

drawline1(double xo,double yo,double mo,double fujiao,double m,int color)

{

double x,y;

x=(xo-m*mo*cos(fujiao*pi/180));

y=(yo-m*mo*sin(fujiao*pi/180));

setcolor(color);

line (xo,yo,x,y);

}

drawjijia(double x,double y,int shang)

{

setcolor(RED);

if (shang==1){

circle(x,y,3);

line(x-3.0,y+3.0,x-15.0,y+20.0);

moveto(x-15,(int)(y+20));

lineto((int)(x+15),(int)(y+20));

moveto((int)(x+15),(int)(y+20));

lineto(x+3,y+3);}

setcolor(RED);

if (shang==0){

circle((int)x,(int)y,3);

line (x-3,y-3,x-15,y-20);

moveto(x-15,y-20);

lineto(x+15,y-20);

moveto(x+15,y-20);

lineto(x+3,y-3);

}

}

double ca3mm1(double m1,double m2)

{

double temp;

temp = sqrt(m1*m1 + m2*m2);

return(temp);

}

double ca3fm1(double cosine,double sine)

{

float temp;

if (sine 0 cosine 0)

temp = atan(sine / cosine) * 180 / pi;

if (sine 0 cosine 0)

temp = (atan(sine / cosine) + pi) * 180 / pi;

if (sine 0 cosine 0)

temp = (atan(sine / cosine) + pi) * 180 / pi;

if (sine 0 cosine 0)

temp = (atan(sine / cosine) + 2 * pi) * 180 / pi;

return(temp);

}

double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang)

{

double temp,sine1,cosine1;

cosine1 = (a6m *a6m - a4m *a4m - a5m*a5m) / (2 * a4m * a5m);

sine1 = sqrt(1 - cosine1 *cosine1);

if (shang==0)

sine1 = sine1*(-1);

if (sine1 0 cosine1 0)

temp = a4f + (atan(sine1 / cosine1) * 180 / pi);

if (sine1 0 cosine1 0)

temp = a4f + ((atan(sine1 / cosine1) + pi) * 180 / pi);

if (sine1 0 cosine1 0)

temp = a4f + ((atan(sine1 / cosine1) + pi) * 180 / pi);

if (sine1 0 cosine1 0)

temp = a4f + ((atan(sine1 / cosine1) + 2 * pi) * 180 / pi);

return(temp);

}

double ca6fm2(double a4m ,double a4f,double a5m , double a5f)

{

double temp,sine1,cosine1;

sine1 = a4m * sin(a4f * pi / 180) + a5m * sin(a5f * pi / 180);

cosine1 = a4m * cos(a4f * pi / 180) + a5m * cos(a5f * pi / 180);

if (sine1 0 cosine1 0)

temp = (atan(sine1 / cosine1) * 180 / pi);

if (sine1 0 cosine1 0)

temp = ((atan(sine1 / cosine1) + pi) * 180 / pi);

if (sine1 0 cosine1 0)

temp = ((atan(sine1 / cosine1) + pi) * 180 / pi);

if (sine1 0 cosine1 0)

temp = ((atan(sine1 / cosine1) + 2 * pi) * 180 / pi);

return(temp);

}

initscreen()

{

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(gd,gm,"");

}

用vb编写一个简单动画程序,实现以下功能1) 红色小球自动从图片框的左侧移动到右侧,反复运行。

控件:picture1,image1(存放红色球图片)代码:Private Sub Form_Load()

Timer1.Interval = 100

End SubPrivate Sub Timer1_Timer()

Image1.Left = Image1.Left + 100

If Image1.Left = Picture1.Width Then

Image1.Left = 0

End If

End Sub

Java编程实现一个能循环地自左向右移动的动画程序。

效果图

参考代码

import?java.awt.*;

import?java.awt.event.*;

import?javax.swing.*;

public?class?MoveTextFrame?extends?JFrame?{

JLabel?jl;//文字标签

int?speed=2;//移动速度

public?MoveTextFrame()?{

jl?=?new?JLabel("文字动画");

jl.setForeground(Color.RED);

add(jl);

setSize(380,?100);//窗口大小

setLocationRelativeTo(null);//窗口居中

setResizable(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

//设置定时器,?每隔25毫秒,改变一次文字标签的位置

Timer?t?=?new?Timer(25,?new?ActionListener()?{

public?void?actionPerformed(ActionEvent?e)?{

int?x?=?jl.getX()+speed;//计算移动后的位置

if(x=390){//如果超过就指定像素,就重新从左边开水移动

x=-30;

}

jl.setLocation(x,?jl.getY());//更新位置

//repaint();

}

});

t.start();

}

public?static?void?main(String[]?args)?{

new?MoveTextFrame();

}

}

C语言设计一个简单的图形动画,用turboc2运行,怎样编写使图形动起来的代码???

1、首先,打开vc6.0,建立程序编写页面,建立C语言环境,声明两个整数型变量。

2、随后,打出新的前三行,由于规律不明显,就用printf语句手动输入,要仔细观察模版。

3、观察可得,中间三行相同,就可以使用for循环,循环三行,每行的个数要仔细计算,模版很重要。

4、随后的七列逐渐减少,同样使用for循环进行循环七列递减的运算,这样还剩下最后一列。

5、最后一列,只有一个符号,相同于前三行,就是用printf语句直接编写最后一行。

6、这样就完成了程序的编写,这样就可以进行编译了,可以看到编译结果0错误,0警告,就可以运行程序了。

7、运行成功,看到程序运行框中出现了清晰的心图形,成功编程。

(责任编辑:IT教学网)

更多

推荐Painter教程文章