大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> VC中利用FLASH制作图声并茂的动画程序

VC中利用FLASH制作图声并茂的动画程序

时间: 2021-07-31 作者:daque

作家:齐云媒介:         flash是一种功效宏大的矢量动画,不妨创造出百般奢侈的影戏功效,运用特殊普遍!这也赋予咱们一个开拓:即使在vc步调中不妨播放flash动画,将为步调出色不少,并且很多本来不易实行的功效,此刻都不妨轻快实行! 像金山词霸的安置步调主要控制界面就运用了flash,功效十分好。正文中笔者将创造一个完备的多媒介软硬件,将少许要害性本领引见给大师,并供给十足代码供大师参考。 正文运用到的要害性本领: (1)运用vb创造ms agent播放模块。 (2)将该播放模块、flash动画文献swf与其它需要资源打包到步调中,并在运转时机动开释。 (3)经过vc和vb的通讯实行多个各别模块的程序实行。 (4)flash的播放,并实行制止右键菜单的弹出。 底下引见简直的实行: (1)运用vb创造ms agent播放模块。 这边先插入ms agent模块。而后在form_load里举行agent控件的初始化; private sub form_load()      agent1.characters.load ("dot")      底下就可进动作画操纵了.      agent1.characters.character("dot").show      咱们可用如次语句实行少许举措      agent1.characters.character("dot").play "congratulate"      agent1.characters.character("dot").speak "您好!"      agent1.characters.character("dot").moveto  x,y ‘x,y 位屏幕坐标。 ...... 因为咱们用的是dot.acs,咱们不许假设旁人的机子上有这个文献。以是我将这个文献复制到winnt(windows)\msagent\chars目次下, 用来复制的vc代码如次: char *a = new char [255]; char *b = new char [255]; getcurrentdirectory(255,a); cstring *str = new cstring(a); cstring *sou = new cstring; //////////////////////////////////////// (*sou)=*str+cstring("\\dot.acs"); getwindowsdirectory (b,255); cstring  *des =new cstring(b) ; (*des)+=cstring ("\\msagent\\chars"); createdirectory (des->getbuffer (10),null); *des+=cstring ("\\dot.acs"); //afxmessagebox (*des); //afxmessagebox (*sou); copyfile (sou->getbuffer (10),des->getbuffer (10),false); //这个是为了制止在load顶用全路途。 (2)实行了文献打包,将过多的模块调整到一道,制止文献的繁冗 开始咱们将各个模块动作资源介入资源中。设置平头标识和典型。那些资源文献打包将在步调运转的功夫解出。 以次是从资源开释到文献的因变量: int res2file(lpctstr lpname,lpctstr lptype,lpctstr filename) { //输出:lpname 为资源名,可用makeintresource()宏将整型变为字符串。 //lptype  为串典型名 //filename  为开释出的文献名。 //输入:胜利1,波折0 hrsrc myres = findresource (null,lpname,lptype); hglobal gl = loadresource (null,myres); lpvoid lp = lockresource(gl);//归来指向资源外存的地方的南针。 // create_always为尽管文献存不生存都爆发新文献。 handle fp = createfile(filename ,generic_write,0,null,create_always,0,null); if (!fp) return false; dword a; //sizeofresource 获得资源文献的巨细 if(!writefile (fp,lp,sizeofresource(null,myres),&a,null)) return false; closehandle(fp); freeresource(gl); return true; } 以次是挪用的本领: res2file (makeintresource(idr_zf),"swf","zf.swf"); res2file (makeintresource(idr_zg),"swf","zg.swf"); res2file (makeintresource(idr_dot),"acs","dot.acs"); res2file (makeintresource(idr_share),"dll","share.dll"); res2file (makeintresource(idr_talk),"dll","talk.dll"); res2file (makeintresource(idr_swflash),"ocx","swflash.ocx"); (3)经过vc和vb的通讯实行多个各别模块的程序实行 在步调中咱们须要挪用vb模块并等候它实行结束再连接咱们的vc步调,这就波及到vc与vb之间的通信题目,在这边我运用事变来处置这个题目,请看如次代码: createevent(null,false,false,"lsbeven"); 而后,挪用ms agent 动画 process_information pi; startupinfo si={0}; si.cb=sizeof(si); char *a =new char [255]; getcurrentdirectory (255,a); cstring *str=new cstring(a); //afxmessagebox (*des); //afxmessagebox (*sou); *str+=cstring("\\talk.e\0"); bool fret=createprocess(null,       str->getbuffer (5),      null,      null,       false,   0,      null,      null,     &si,       &pi); 结果,用waitforsingleobject (heven,40000)等候事变被触发。(40s超时) 接下来的题目便是怎样在vb中实行实行后触发这个事变。因为在vb中运用api很搀杂,为了供给大略起见我用vc做了share.dll实行setvalue,而后在vb中举行挪用来激活事变。 在setvalue中挪用如次两个因变量来激活事变。 openevent(dword dwaccess,//存取办法 bool binherithandle,//能否能被接受 lpctstr lpname)//名字 setevent (handle hevent); vb顶用变量锁本领实行在未出来提醒“点我呀!”前对左键点击的失效,在表露完提醒后,当用户点击就挪用setvalue来激活事变。 agent1_click(byval characterid as string, byval button as integer, byval shift as integer, byval x as integer, byval y as integer) if  b ==ture      then  setvalue endif (4)flash的播放,并实行制止右键菜单的弹出 1. 控键备案: hmodule   hmod=loadlibrary ("swflash.ocx"); farproc   p=getprocaddress (hmod,"dllregisterserver"); (*p)(); 2.在工程中插入 flash 控件。因为在不准则窗口中在举行flash控件的扶助会使步调过于不明显。所以另开独力的窗口来表露flash。 void transparentwnd::ontimer(uint nidevent) {   switch (nidevent)   { case 1: { killtimer (nidevent); dochange(makeintresource(idb_main2)); //创造视,动作默许视 if (!m_wndview.create(null, null, afx_ws_default_view, crect(260, 30,630, 370), this, afx_idw_pane_first, null))        trace0("failed to create view window\n"); centerwindow (); showwindow (sw_show); } break; default: break;   } } bool transparentwnd::oncmdmsg(uint nid, int ncode, void* pextra, afx_cmdhandlerinfo* phandlerinfo) { if(m_wndview.oncmdmsg(nid, ncode, pextra, phandlerinfo)) return true;//即使是command动静则视类先处置。 return cwnd::oncmdmsg(nid, ncode, pextra, phandlerinfo); } void transparentwnd::onsetfocus(cwnd* poldwnd) { //即使有视类则视类赢得中心。 if(m_wndview.m_hwnd !=null) m_wndview.setfocus(); } 底下在cchildview中设置 cshockwaveflash  myflash; ///变换窗口特性 bool cchildview::precreatewindow(createstruct& cs) {    if (!cwnd::precreatewindow(cs))        return false;    cs.dwexstyle |= ws_ex_clientedge;    cs.style &= ~ws_border;    cs.lpszclass = afxregisterwndclass(cs_hredraw|cs_vredraw|cs_dblclks,        ::loadcursor(null, idc_arrow), hbrush(color_windowtext), null);    return true; }   bool cchildview::onerasebkgnd(cdc* pdc) {    return true;//不让window机动刷屏 } //底下加入遏制局部 int cchildview ::oncreate (lpcreatestruct lpcreatestruct) {     if(cwnd::oncreate(lpcreatestruct)==-1)         return -1;     myflash.create(null,ws_child|ws_visible,crect(0,0,0,0), this, 1024);     settimer (1,0,null);     settimer (2,12000,null);     crect m_rect;     getclientrect (&m_rect );     myflash.movewindow (&m_rect);//使flash 控件占满所有视地区     return 0; } char *a = new char [512]; getcurrentdirectory (100,a); cstring  *s=new cstring(a); myflash.loadmovie (0,*s+cstring("\\zf.swf"));//这边确定要为全路途 myflash.play();//播放flash动画 (5)两个高档话题 5.1 在vc顶用com接口对ms agent 举行操纵 #include "stdafx.h" #include <ole2.h> #include <agtsvr.h> #include <agtsvr_i.c> #include <tchar.h> const lpwstr kpwszcharacter =l"dot.acs"; int apientry winmain(hinstance hinstance,            hinstance hprevinstance,         lpstr     lpcmdline,       int       ncmdshow) { iagent *pagent; if (failed(oleinitialize(null)))      return -1; hresult hres=cocreateinstance (clsid_agentserver,           null,            clsctx_local_server,            iid_iagent,            (lpvoid*)&pagent); //底下的代码挪用iagent::load()本领来装入一个动画人物的数据 //因为agent效劳器在本人的外存空间中运转,以是传递的字符串变量须要用sysallocstring()来调配外存 variantarg  vpath; variantinit(&vpath); //初始化ole变量 vpath.vt = vt_bstr; //指明变量典型为unicode的字符串 vpath.bstrval=sysallocstring(lpcharacter); //lpcharacter 为动画人物数据的寄存路途 long __rpc_far   lcharid,lrequestid; hres=pagent->load(vpath,&lcharid,&lrequestid);//装入数据人物id在lcharid中归来 idispatch  *pdcharacter; hres=pagent->getcharacter(lcharid,&pdcharacter); //获得 lcharid的idispatch接口南针挪用idispatch::queryinterface()本领 //不妨获得iagentcharacter的接口南针: iagentcharacter  *pcharacter; hres=pdcharacter->queryinterface(iid_iagentcharacter,            (lpvoid*)&pcharacter); pdcharacter->release(); //开释idispath 经过iagentcharacter接口就不妨挪用动画人物扶助的百般本领了: hres = pcharacter->show(false,&lrequestid); //表露动画人物 hres = pcharacter->moveto(320,240,100,&lrequestid);//挪动动画人物到屏幕中心 bstr bszspeak = sysallocstring(l"hello world!");//调配字符串 hres = pcharacter->speak(bszspeak,null,&lrequestid);//让动画人物谈话 sysfreestring(bszspeak);//开释字符串所占外存 // 步调在退出之前须要把创造的agent东西开释: if(pcharacter){     pcharacter->release();//开释iagentcharacter接口     pagent->unload(lcharid); //卸载动画人物数据 } pagent->release(); //开释agent东西 variantclear(&vpath); //废除ole变量 } 载入ms agent演练源代码(vc)11.1k 5.2 同步题目还可用旗号灯来实行 在vc 中举行启用时第一步就创造旗号量,值为0。在启用vb创造的步调,而后vc中举行p操纵. vb创造的步调中 在退出时运用v操纵。实行同步。 p (s): s - - if s<0 then 挂起当进步程 对应:win32 api :waitforsingleobject  v(s):    s++ if s<=0 then 在s的等候部队中叫醒一过程 对应:win32 api :releasesemaphore  (6)跋文 本步调写于6月份,其时是一个伙伴的华诞,它是动作一个礼品送给她的。发端的功夫,只供给了大略的窗口界面厥后,在看了几位能手的杰作后,将它矫正了一下。并蓄意和大师一道计划,将它越发完备。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.