Java-如何在应用程序中嵌入并执行swf文件?
目前知道的方法,都是在应用程序中使用一个web控件,加载一个网页,在网页中再加载swf文件,这样会有一个swf文件在外部。
不知道有没有办法直接把swf文件嵌入到应用程序中执行?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
目前知道的方法,都是在应用程序中使用一个web控件,加载一个网页,在网页中再加载swf文件,这样会有一个swf文件在外部。
不知道有没有办法直接把swf文件嵌入到应用程序中执行?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
可以把swf文件放到资源中,在需要执行swf文件时,
1 把swf从资源中加载到内存中
2 把swf的内容传给flash 控件,然后开始播放。
具体的方法是:从flash对象中获取IID_IPersistStreamInit,用这个接口来把swf的文件内容传递给flash控件
IUnknown* u = _flash.GetControlUnknown();
if(u != NULL)
{
IPersistStreamInit* psi;
HRESULT hr = u->QueryInterface(IID_IPersistStreamInit, reinterpret_cast<void**>(&psi));
if(SUCCEEDED(hr))
{
HRSRC res = FindResource(NULL, MAKEINTRESOURCE(IDR_SWF), "SWF");
HGLOBAL h = LoadResource(NULL, res);
unsigned int len = SizeofResource(NULL, res);
if(! load_movie_from_stream(psi, reinterpret_cast<unsigned char*>(LockResource(h)), len))
{
}
psi->Release();
}
}
bool load_movie_from_stream(IPersistStreamInit* psi, unsigned char* data, unsigned int len)
{
bool successful = false;
bool compressed = false;
unsigned char* buffer = NULL;
unsigned int movie_size;
ULARGE_INTEGER size, cb;
LARGE_INTEGER li;
memmove(&movie_size, data + 4, 4);
__try
{
//compressed?
if(memcmp(data, "CWS", 3) == 0)
{
compressed = true;
unsigned long d_len;
buffer = new unsigned char[movie_size];
memmove(buffer, data, 8);
buffer[0] = 'F';
int r = uncompress(buffer + 8, &d_len, data + 8, len - 8);
if(r != Z_OK)
{
__leave;
}
}
else
{
buffer = data;
}
//save movie template
psi->GetSizeMax(&size);
HGLOBAL h1 = GlobalAlloc(GMEM_MOVEABLE, size.LowPart);
IStream* s1;
CreateStreamOnHGlobal(h1, FALSE, &s1);
psi->Save(s1, TRUE);
//insert movie into template
HGLOBAL h2 = GlobalAlloc(GMEM_MOVEABLE, size.LowPart + movie_size);
IStream* s2;
CreateStreamOnHGlobal(h2, FALSE, &s2);
//magic flag. "gUfU" means no movie loaded, "fUfU" means movie loaded
s2->Write("f", 1, NULL);
li.HighPart = 0;
li.LowPart = 1;
s1->Seek(li, SEEK_SET, NULL);
cb.HighPart = 0;
cb.LowPart = 3;
s1->CopyTo(s2, cb, NULL, NULL);
//write movie size
s2->Write(&movie_size, 4, NULL);
//write movie
s2->Write(buffer, movie_size, NULL);
cb.HighPart = 0;
cb.LowPart = size.LowPart - 4;
s1->CopyTo(s2, cb, NULL, NULL);
//load movie
li.HighPart = 0;
li.LowPart = 0;
s2->Seek(li, SEEK_SET, NULL);
psi->Load(s2);
s1->Release();
s2->Release();
GlobalFree(h1);
GlobalFree(h2);
successful = true;
}
__finally
{
if(compressed && buffer != NULL)
{
delete[] buffer;
}
}
return successful;
}
个人看法是,在应用程序中内嵌flash控件不如用网页加载外部swf。因为内嵌控件会导致可执行文件增加好几兆的播放器大小,而网页加载只是多一个临时文件,可以设置该文件隐藏,用户体验也不差。
使用shockwave flash object控件就可以实现,这个控件在安装flash的时候就装到你的系统上了。
在VC中的使用方法:
添加shockwave flash
object控件。建立对话框应用程序后,在主菜单里选择“工程->添加工程->components
and controls”菜单选项,这时会弹出一个components
and controls
gallery文件选择对话框,里面有两个文件夹,一个是registered
activex controls,一个是visual c++
components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。在里面选择shockwave
flash
object(如果你系统上没这个控件,这里面就找不到了,可以去download个下来安装),点击insert将它插入工程。因为在vc中插入工程的控件要通过一个类来操作,所以这时vc会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后vc会自动把这个类加入工程里面。
生成一个该控件的对象。将shockwave flash object控件成功插入自己的工程后,在vc对话框编辑器的controls面板上就会多出图标,这个图标就是刚加入的控件的图标了。呵,这样接下来怎么用就再清楚不过了吧。和使用BUTTON、EDIT等其它windows控件一样,把它拉到对话框上,给它关联一个对象,对象的类就是我们刚才插入控件的时候所产生的类。我们可以使用这个类的成员函数来操纵这个对象,来进行flash动画的控制以及和自己的程序进行交互等操作了。这里假设关联的对象名为:m_Player。
使用成员函数LoadMovie和Play来导入并播放动画。 m_Player.LoadMovie(0,
strMovieUrl);该函数用来将动画导入程序中,strMovieUrl为要播放的flash路径,要用绝对路径。
m_Player.Play();调用该函数开始播放动画。在初始化对话框的函数里面加入这两个函数调用即可。
如果需要和SWF程序交互还可以重载shockwave flash object控件的事件,在事件里返回SWF中的处理结果。
接口说明
Play()
播放动画
StopPlay()
停止动画
IsPlaying()
动画是否正在播放(true,false)
GotoFrame(frame_number)
<coding-6 lang="other">
跳转到某帧(frame_number+1)
TotalFrames()
获取动画总帧数
CurrentFrame()
回传当前动画所在帧数-1
Rewind()
使动画返回第一帧
SetZoomRect(left,top,right,buttom)
放大指定区域
Zoom(percent)
改变动画大小
Pan(x_position,y_position,unit)
使动画在x,y方向上平移
PercentLoaded()
返回动画被载入的百分比(0-100)
LoadMovie(level_number,path)
加载动画
TGotoFrame(movie_clip,frame_number)
<coding-15 lang="other">
movie_clip跳转到指定帧数
TGotoLabel(muvie_clip,label_name)
<coding-16 lang="other">
movie_clip跳转到指定标签
TCurrentFrame(movie_clip)
<coding-17 lang="other">
回传movie_clip当前帧-1
TCurrentLabel(movie_clip)
回传movie_clip当前标签
TPlay(movie_clip)
播放movie_clip
TStopPlay(movie_clip)
停止movie_clip的播放
GetVariable(variable_name)
获取变量
SetVariable(variable_name,value)
变量赋值
TCallFrame(movie_clip,frame_number)
call指定帧上的action
TCallLabel(movie_clip,label)
call指定标签上的action
TGetProperty(movie_clip,property)
获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)
设置movie_clip的指定属性
过程比较繁琐,需要做到以下几步,才可以完整的实现一个FLASH
实现activex容器方法,也就是实现以下几个接口
<coding-1 lang="other">
IOleClientSite
IOleInPlaceSiteWindowless
IOleInPlaceFrame
IStorage
</coding>
2. 从flash.ocx导入flash接口IShockwaveFlash
3. 实现IShockwaveFlash::_IShockwaveFlashEvents接口,以便响应flash事件
4. 实现IOleObject等接口,把IShockwaveFlash挂接到IOleObject中,以便可以正确响应IOleObjeW分发下来的事件,如绘制消息、鼠标键盘消息等。
5. IShockwaveFlash::put_movie来播放swf文件
另外,第1步做的事情,可以用WTL::CAxDialogImpl来直接实现。
如果用VS的话很简单选中swf文件在属性的“生成操作”一项里选“嵌入的资源”
然后代码中像这样就可以取到二进制
Assembly assem = Assembly.GetExecutingAssembly();
assem.GetManifestResourceStream("命名空间.xxx.swf");
另外内嵌swf和嵌入播放器是两回事,如果发现用户没安装播放器提示他下载安装就行了