论文部分内容阅读
摘要:文章给出VC和Flash之间一种基于自定义字符串的双向消息互传机制,并应用该机制用VC和Flash联合实现进度条的效果。
关键词:Shockwave Flash Object控件;VC;通讯;双向消息互传; ActionScript
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31634-01
Messages Exchanging Between VC and Flash
LIU Dong1,HUANG Yong2
(1.Institute of Educational Software of Guangzhou University,Guangzhou 510006,China;2.Institute of Educational Software of Guangzhou University,Guangzhou 510006,China)
Abstract:This paper introduces a mechanism of messages exchanging based on user-defined strings between VC and Flash. As an application of the mechanism, author gives a progress bar example.
Key words:Shockwave Flash Object control;VC;Communication;Messages Exchanging;ActionScript
1 问题的提出
Flash动画以其独特的优势(制作简单,易学易用,表现力较强,生成的文件小等)目前已经广泛应用于网络以及各种媒体,我们现在随处可以见到很多制作精美的动画,我们知道在程序设计和软件开发中要想实现类似的效果是相当困难的,需要很多图形图像方面的知识和技巧,把Flash制作的动画整合在应用软件中显然是一个不错的想法,在VC(其他编程语言也一样)中可以使用shockwave flash object控件来达到目的。但有时我们不仅仅是在程序中播放动画,还需要做一些交互,比如:我们想知道动画播放的进度、使用者在动画中单击了哪个按钮等等,本文在VC和Flash之间消息互传方面进行了一些研究,探索出一种基于字符串的双向消息互传机制,并给出一个应用范例。
2 消息双向互传的实现原理
要想实现双向的消息互传,需要满足如下条件:1.有一个发送方和接收方都能理解的消息定义;2.双方均有接收和发送消息的能力; 3.必须定时(及时)查询消息的到来。第一个条件比较容易满足,可以自定义一些字符串作为消息。下面分别从VC和Flash的角度解释该机制的实现原理。
2.1 VC中消息的接收、发送和查询
在VC中插入shockwave flash object控件之后,可以让它像普通的windows控件一样来接收并处理消息。这个控件有一个消息:FSCommand,为它添加消息处理函数如OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)。此函数有两个参数,均为字符串,对应于Flash的ActionScript中fscommand()命令中的两个参数。可以只用其中的一个,也可两个都用,根据实际情况来定,VC会为这个控件设置一个定时器,一旦Flash动画有消息发送过来VC会及时收到,这样就实现了消息的接收。还有另外一种方式就是:利用Shockwave Flash Object控件提供的一个方法GetVariable(),可以得到Flash ActionScript中变量的值。因此我们可以通过设置一个定时器不断调用GetVariable()来查询变量的值,这样也可以实现消息的接收,但这种方法比较麻烦,所以我们这里采用前者。
Shockwave Flash Object控件提供另外一个方法SetVariable(),可以随时设置Flash ActionScript中的变量的值,有两个参数,均为字符串。这样就等于是发送消息给Flash了。
2.2 Flash中消息的接收、发送和查询
在Flash中发送消息也很方便,使用函数fscommand(command:String, parameters:String),该函数可以使swf文件与Flash Player 或承载 Flash Player 的程序(如 Web 浏览器、可承载ActiveX控件的程序等)进行通讯。
Flash接收消息就略微麻烦一点,需要定义一个String类型的变量用于接收VC对其值的设置,同时还要使用SetInterval()函数定义一个定时器,不断地查询该变量的值以便Flash及时做出响应。
3 应用消息互传机制实现进度条
理解了消息互传机制的原理之后,我们应用该机制实现一个进度条实例。基本想法是:用Flash制作一个进度条,在VC中设置进度条的百分比使得进度条的长度发生变化;当进度为100%时Flash动画发送“success”消息通知VC,VC弹出消息框作出响应。
3.1Flash方面的制作与编程
Flash方面的制作包括三层,最下面一层是一个影片剪辑起个名字叫progress_mc,这个影片根据需要可简单也可复杂,这里只要知道有一个外框,还有一个进度条Inside_mc;第二层是百分比文字提示,有一个动态文本框,起个变量名txt_per;第三层用作action层,程序如下:
stop();
var perLoaded:String="0";
progress_mc.Inside_mc._xscale = 0; //让初始进度为0
function setPercent() //用于执行进度条的变化
{if(Number(perLoaded)>100)
{//如果进度超过100,就向VC发送消息
fscommand("progress","success");
}
else
{//设置进度条的长度和文本框的文字提示
progress_mc.Inside_mc._xscale = Number(perLoaded);
txt_per = perLoaded+"%";
}
}
//设置每0.1秒查询一次perLoaded值的变化
var perID:Number = setInterval(setPercent,100);
制作完毕后保存并发布为progress.swf。
3.2VC方面的制作与编程
在VC中建立一个基于对话框的应用程序,插入一个Flash控件、两个按钮(开始和停止)。为Flash控件添加一个成员变量CShockwaveFlash类型的m_ctrlFlash和一个整型变量percent,在构造函数中将percent初始化为0.
在对话框的初始化函数BOOL CFlashProgressDlg::OnInitDialog()中添加代码如下:
char dir[MAX_PATH];
char ch = '\\';
char DirName[MAX_PATH];
char * location;
unsigned intLength;
::GetModuleFileName(NULL,dir,MAX_PATH);
location = strrchr(dir,ch);
Length = location - dir;
strncpy(DirName,dir,Length);
DirName[Length] = '\0';
strcat(DirName,"\\progress.swf");//得到progress.swf的完整路径
m_ctrlFlash.LoadMovie(0,DirName);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
为Flash控件添加一个消息处理函数如下:
void CFlashProgressDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{if(strcmp(command,"progress")==0)
{ //如果收到Flash的消息,说明下载成功,弹出对话框
if(strcmp(args,"success") == 0)
{this->MessageBox("下载完成!");
KillTimer(1);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
}}}
添加定时器函数如下:
void CFlashProgressDlg::OnTimer(UINT nIDEvent)
{CString strPercent;
strPercent.Format("%d",percent++);
m_ctrlFlash.SetVariable("perLoaded",strPercent);
CDialog::OnTimer(nIDEvent);}
为开始和停止按钮添加消息处理函数如下:
void CFlashProgressDlg::OnButtonPause()
{KillTimer(1);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);}
void CFlashProgressDlg::OnButtonStart()
{SetTimer(1,100,NULL);
if(percent>100)percent = 0;
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);}
以上程序在VC6.0和Flash 8.0下调试通过。本文中所涉及的所有源程序均可通过链接http://lyld3618.go1.icpcn.com/download/flashprogress.rar下载。
4 结束语
根据以上提供的原理和方法,我们就建立了一种VC和Flash之间双向消息互传机制,需要说明的是这种机制是基于自定义字符串的,可根据实际需要和复杂程度定义多种消息,消息的种类越多,相应的比较判断就越复杂。通过这种方法,就可以把Flash动画应用于我们的程序中,让程序更生动直观也更加精美。
参考文献:
[1]David J.Kruglinski.等.Visual C++6.0技术内幕[M].北京:北京希望电子出版社,2002.
[2]Flash8.0 帮助文件.
关键词:Shockwave Flash Object控件;VC;通讯;双向消息互传; ActionScript
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31634-01
Messages Exchanging Between VC and Flash
LIU Dong1,HUANG Yong2
(1.Institute of Educational Software of Guangzhou University,Guangzhou 510006,China;2.Institute of Educational Software of Guangzhou University,Guangzhou 510006,China)
Abstract:This paper introduces a mechanism of messages exchanging based on user-defined strings between VC and Flash. As an application of the mechanism, author gives a progress bar example.
Key words:Shockwave Flash Object control;VC;Communication;Messages Exchanging;ActionScript
1 问题的提出
Flash动画以其独特的优势(制作简单,易学易用,表现力较强,生成的文件小等)目前已经广泛应用于网络以及各种媒体,我们现在随处可以见到很多制作精美的动画,我们知道在程序设计和软件开发中要想实现类似的效果是相当困难的,需要很多图形图像方面的知识和技巧,把Flash制作的动画整合在应用软件中显然是一个不错的想法,在VC(其他编程语言也一样)中可以使用shockwave flash object控件来达到目的。但有时我们不仅仅是在程序中播放动画,还需要做一些交互,比如:我们想知道动画播放的进度、使用者在动画中单击了哪个按钮等等,本文在VC和Flash之间消息互传方面进行了一些研究,探索出一种基于字符串的双向消息互传机制,并给出一个应用范例。
2 消息双向互传的实现原理
要想实现双向的消息互传,需要满足如下条件:1.有一个发送方和接收方都能理解的消息定义;2.双方均有接收和发送消息的能力; 3.必须定时(及时)查询消息的到来。第一个条件比较容易满足,可以自定义一些字符串作为消息。下面分别从VC和Flash的角度解释该机制的实现原理。
2.1 VC中消息的接收、发送和查询
在VC中插入shockwave flash object控件之后,可以让它像普通的windows控件一样来接收并处理消息。这个控件有一个消息:FSCommand,为它添加消息处理函数如OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)。此函数有两个参数,均为字符串,对应于Flash的ActionScript中fscommand()命令中的两个参数。可以只用其中的一个,也可两个都用,根据实际情况来定,VC会为这个控件设置一个定时器,一旦Flash动画有消息发送过来VC会及时收到,这样就实现了消息的接收。还有另外一种方式就是:利用Shockwave Flash Object控件提供的一个方法GetVariable(),可以得到Flash ActionScript中变量的值。因此我们可以通过设置一个定时器不断调用GetVariable()来查询变量的值,这样也可以实现消息的接收,但这种方法比较麻烦,所以我们这里采用前者。
Shockwave Flash Object控件提供另外一个方法SetVariable(),可以随时设置Flash ActionScript中的变量的值,有两个参数,均为字符串。这样就等于是发送消息给Flash了。
2.2 Flash中消息的接收、发送和查询
在Flash中发送消息也很方便,使用函数fscommand(command:String, parameters:String),该函数可以使swf文件与Flash Player 或承载 Flash Player 的程序(如 Web 浏览器、可承载ActiveX控件的程序等)进行通讯。
Flash接收消息就略微麻烦一点,需要定义一个String类型的变量用于接收VC对其值的设置,同时还要使用SetInterval()函数定义一个定时器,不断地查询该变量的值以便Flash及时做出响应。
3 应用消息互传机制实现进度条
理解了消息互传机制的原理之后,我们应用该机制实现一个进度条实例。基本想法是:用Flash制作一个进度条,在VC中设置进度条的百分比使得进度条的长度发生变化;当进度为100%时Flash动画发送“success”消息通知VC,VC弹出消息框作出响应。
3.1Flash方面的制作与编程
Flash方面的制作包括三层,最下面一层是一个影片剪辑起个名字叫progress_mc,这个影片根据需要可简单也可复杂,这里只要知道有一个外框,还有一个进度条Inside_mc;第二层是百分比文字提示,有一个动态文本框,起个变量名txt_per;第三层用作action层,程序如下:
stop();
var perLoaded:String="0";
progress_mc.Inside_mc._xscale = 0; //让初始进度为0
function setPercent() //用于执行进度条的变化
{if(Number(perLoaded)>100)
{//如果进度超过100,就向VC发送消息
fscommand("progress","success");
}
else
{//设置进度条的长度和文本框的文字提示
progress_mc.Inside_mc._xscale = Number(perLoaded);
txt_per = perLoaded+"%";
}
}
//设置每0.1秒查询一次perLoaded值的变化
var perID:Number = setInterval(setPercent,100);
制作完毕后保存并发布为progress.swf。
3.2VC方面的制作与编程
在VC中建立一个基于对话框的应用程序,插入一个Flash控件、两个按钮(开始和停止)。为Flash控件添加一个成员变量CShockwaveFlash类型的m_ctrlFlash和一个整型变量percent,在构造函数中将percent初始化为0.
在对话框的初始化函数BOOL CFlashProgressDlg::OnInitDialog()中添加代码如下:
char dir[MAX_PATH];
char ch = '\\';
char DirName[MAX_PATH];
char * location;
unsigned intLength;
::GetModuleFileName(NULL,dir,MAX_PATH);
location = strrchr(dir,ch);
Length = location - dir;
strncpy(DirName,dir,Length);
DirName[Length] = '\0';
strcat(DirName,"\\progress.swf");//得到progress.swf的完整路径
m_ctrlFlash.LoadMovie(0,DirName);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
为Flash控件添加一个消息处理函数如下:
void CFlashProgressDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{if(strcmp(command,"progress")==0)
{ //如果收到Flash的消息,说明下载成功,弹出对话框
if(strcmp(args,"success") == 0)
{this->MessageBox("下载完成!");
KillTimer(1);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
}}}
添加定时器函数如下:
void CFlashProgressDlg::OnTimer(UINT nIDEvent)
{CString strPercent;
strPercent.Format("%d",percent++);
m_ctrlFlash.SetVariable("perLoaded",strPercent);
CDialog::OnTimer(nIDEvent);}
为开始和停止按钮添加消息处理函数如下:
void CFlashProgressDlg::OnButtonPause()
{KillTimer(1);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);}
void CFlashProgressDlg::OnButtonStart()
{SetTimer(1,100,NULL);
if(percent>100)percent = 0;
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);}
以上程序在VC6.0和Flash 8.0下调试通过。本文中所涉及的所有源程序均可通过链接http://lyld3618.go1.icpcn.com/download/flashprogress.rar下载。
4 结束语
根据以上提供的原理和方法,我们就建立了一种VC和Flash之间双向消息互传机制,需要说明的是这种机制是基于自定义字符串的,可根据实际需要和复杂程度定义多种消息,消息的种类越多,相应的比较判断就越复杂。通过这种方法,就可以把Flash动画应用于我们的程序中,让程序更生动直观也更加精美。
参考文献:
[1]David J.Kruglinski.等.Visual C++6.0技术内幕[M].北京:北京希望电子出版社,2002.
[2]Flash8.0 帮助文件.