一个VC和Flash通信的问题

时间:2021-11-03 04:56:13
我做了个FLASH界面,里面放了几个按钮,然后点击一个按钮就出现一个FLASH背景框,这个背景框也是FLASH的,我现在想点击一个按钮然后出现这个背景框,这个背景框出现后再出现VC的对话框(Dialog),我是这样做的,通过fscommand来发送命令给VC,代码如下
FLASH的

private function btnClicked(e:Event):void {
trace(e.type);
switch(e.type) {
case "but1clicked":
loadSwf(0);
trace("sdssd1");
fscommand('bt','1');
break;
case "but2clicked":
loadSwf(1);
trace("sdssd2");
fscommand('bt','2');
break;
case "but3clicked":
loadSwf(2);
trace("sdssd3");
fscommand('bt','3');
break;
case "but4clicked":
loadSwf(3);
trace("sdssd4");
fscommand('bt','4');
break;
case "but5clicked":
loadSwf(4);
fscommand('bt','5');;
break;
case "but6clicked":
loadSwf(5);
trace("sdssd6");
fscommand('bt','6');
break;

}
}


然后VC的

void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) 
{

 if( 0 == strcmp(command,"bt") )
{
if( 0 == strcmp(args,"1") )
{
Dialog1 D1;
D1.DoModal();
}
else if(0 == strcmp(args,"2"))
{
  Dialog2 D2;
  D2.DoModal();
}
                else if(0 == strcmp(args,"3"))
{
  Dialog3 D3;
  D3.DoModal();
}
                else if(0 == strcmp(args,"4"))
{
  Dialog4 D4;
  D4.DoModal();
}
                else if(0 == strcmp(args,"5"))
{
  Dialog5 D5;
  D5.DoModal();
}
                else if(0 == strcmp(args,"6"))
{
  Dialog6 D6;
  D6.DoModal();
}
}
}


现在是点击一个按钮可以弹出Dialog,可是那个FLASH的背景框确实在弹出Dialog后再出现,而且一定要是关闭掉Dialog后才能出现,这是什么原因呀,FLASH代码中我已经把trace放在了fscommand前面了啊,应该是出现背景框更先吧,为什么现在反掉了呀,有什么办法么,麻烦各位了,谢谢

15 个解决方案

#1


两者对话框可能不一样,VC的是模态对话框,可能有影响

#2


有没有可以解决的办法呢

#3


我断点了下,好像VC加载了FLASH的那个Dialog一打开,你还没按按钮它就进入了FSCOMMAND这个方法中

#4


有人帮忙不,大侠们快来啊,谢谢了

#5


loadSwf(0);
trace("sdssd1");
fscommand('bt','1');
loadswf 和fscommand是同步执行的。你的loadSwf是自定义函数吗? 你应该保证loadswf确实执行完了再调用fscommand,有没有类似onloadcomplete的事件? 看一看

#6


loadSwf(0);是用来加载xml文件的,因为对flash不是很熟悉,本来要是能加个标志位的话就可以解决,但是塔这个loadSwf(0);不知道怎么加

#7


我把代码改了下,如下,还是不行,大家帮忙看看

package {
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class main extends MovieClip {


private var _xml:XML;
private var _arr:Array;
private var _loader:Loader = new Loader;
private var _swfmv:MovieClip = null;

public function main():void {
init();
}
public function init():void {
var urlloader:URLLoader = new URLLoader();
urlloader.addEventListener(Event.COMPLETE,xmlHandle);
urlloader.load(new URLRequest("configXml/swfdata.xml"));
}
private function xmlHandle(e:Event):void {
_xml = new XML(e.target.data);

_arr =  new Array;
for each(var swf in _xml.swfes.swf) {
var obj:SwfObj = new SwfObj;
obj.id = swf.@id;
obj.name = swf.@name;
obj.url = swf.@url;
_arr.push(obj);
}

stage.addEventListener("but1clicked", btnClicked);
stage.addEventListener("but2clicked", btnClicked);
stage.addEventListener("but3clicked", btnClicked);
stage.addEventListener("but4clicked", btnClicked);
stage.addEventListener("but5clicked", btnClicked);
stage.addEventListener("but6clicked", btnClicked);

}

private function btnClicked(e:Event):void {
trace(e.type);
switch(e.type) {
case "but1clicked":
loadSwf(0);
break;
case "but2clicked":
loadSwf(1);
trace("sdssd2");
fscommand('bt','2');
break;
case "but3clicked":
loadSwf(2);
trace("sdssd3");
fscommand('bt','3');
break;
case "but4clicked":
loadSwf(3);
trace("sdssd4");
fscommand('bt','4');
break;
case "but5clicked":
loadSwf(4);
fscommand('bt','5');;
break;
case "but6clicked":
loadSwf(5);
trace("sdssd6");
fscommand('bt','6');
break;

}
}

private function loadSwf(n:int):void {
_loader.unloadAndStop();
_loader = new Loader;
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadSwfHandle);
_loader.load(new URLRequest(_arr[n].url));
if(0 == n)
{
fscommand('bt','1');
}
}

private function loadSwfHandle(e:Event):void {
if (_swfmv) {
removeChild(_swfmv);
}
_swfmv = e.target.content;
_swfmv.x = 390 - _swfmv.width/ 2;
_swfmv.y = 360 - _swfmv.height/ 2;
//trace(this.numChildren);
addChild(_swfmv);

}
}



}



loadSwf方法在下面,然后我就改了第一个的代码,把fscommand放到了loadSwf这个方法的下面,做了个if判断,传递0的时候表示按了第一个按钮,然后全部显示完再发送fscommand命令,结果还是先弹出dialog来,很奇怪,求解

#8


问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。

#9


引用 8 楼 ringphone 的回复:
问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。


可以帮我改一下么,谢谢了,感觉你的很有道理

#10


引用 8 楼 ringphone 的回复:
问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。


我通过 CWnd   *pWnd=CWnd::FindWindow("Dialog1",NULL);获取到句柄,然后怎么PostMessage啊,谢谢

#11


void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)里面,检测到事件,PostMessage一个自定义消息给自己,CMyFlashTestDlg增加这个自定义消息的处理,在这个消息里弹出对话框。

#12


其实你可以这样:
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
   PostMessage(MYWM_CUSTOM,0,atoi(args));
}

然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。

#13


引用 12 楼 ringphone 的回复:
其实你可以这样:
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
   PostMessage(MYWM_CUSTOM,0,atoi(args));
}

然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。……

这个方法好,谢谢了

#14


结贴呀

#15


??已经结过了啊,很早就结了的啊

#1


两者对话框可能不一样,VC的是模态对话框,可能有影响

#2


有没有可以解决的办法呢

#3


我断点了下,好像VC加载了FLASH的那个Dialog一打开,你还没按按钮它就进入了FSCOMMAND这个方法中

#4


有人帮忙不,大侠们快来啊,谢谢了

#5


loadSwf(0);
trace("sdssd1");
fscommand('bt','1');
loadswf 和fscommand是同步执行的。你的loadSwf是自定义函数吗? 你应该保证loadswf确实执行完了再调用fscommand,有没有类似onloadcomplete的事件? 看一看

#6


loadSwf(0);是用来加载xml文件的,因为对flash不是很熟悉,本来要是能加个标志位的话就可以解决,但是塔这个loadSwf(0);不知道怎么加

#7


我把代码改了下,如下,还是不行,大家帮忙看看

package {
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class main extends MovieClip {


private var _xml:XML;
private var _arr:Array;
private var _loader:Loader = new Loader;
private var _swfmv:MovieClip = null;

public function main():void {
init();
}
public function init():void {
var urlloader:URLLoader = new URLLoader();
urlloader.addEventListener(Event.COMPLETE,xmlHandle);
urlloader.load(new URLRequest("configXml/swfdata.xml"));
}
private function xmlHandle(e:Event):void {
_xml = new XML(e.target.data);

_arr =  new Array;
for each(var swf in _xml.swfes.swf) {
var obj:SwfObj = new SwfObj;
obj.id = swf.@id;
obj.name = swf.@name;
obj.url = swf.@url;
_arr.push(obj);
}

stage.addEventListener("but1clicked", btnClicked);
stage.addEventListener("but2clicked", btnClicked);
stage.addEventListener("but3clicked", btnClicked);
stage.addEventListener("but4clicked", btnClicked);
stage.addEventListener("but5clicked", btnClicked);
stage.addEventListener("but6clicked", btnClicked);

}

private function btnClicked(e:Event):void {
trace(e.type);
switch(e.type) {
case "but1clicked":
loadSwf(0);
break;
case "but2clicked":
loadSwf(1);
trace("sdssd2");
fscommand('bt','2');
break;
case "but3clicked":
loadSwf(2);
trace("sdssd3");
fscommand('bt','3');
break;
case "but4clicked":
loadSwf(3);
trace("sdssd4");
fscommand('bt','4');
break;
case "but5clicked":
loadSwf(4);
fscommand('bt','5');;
break;
case "but6clicked":
loadSwf(5);
trace("sdssd6");
fscommand('bt','6');
break;

}
}

private function loadSwf(n:int):void {
_loader.unloadAndStop();
_loader = new Loader;
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadSwfHandle);
_loader.load(new URLRequest(_arr[n].url));
if(0 == n)
{
fscommand('bt','1');
}
}

private function loadSwfHandle(e:Event):void {
if (_swfmv) {
removeChild(_swfmv);
}
_swfmv = e.target.content;
_swfmv.x = 390 - _swfmv.width/ 2;
_swfmv.y = 360 - _swfmv.height/ 2;
//trace(this.numChildren);
addChild(_swfmv);

}
}



}



loadSwf方法在下面,然后我就改了第一个的代码,把fscommand放到了loadSwf这个方法的下面,做了个if判断,传递0的时候表示按了第一个按钮,然后全部显示完再发送fscommand命令,结果还是先弹出dialog来,很奇怪,求解

#8


问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。

#9


引用 8 楼 ringphone 的回复:
问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。


可以帮我改一下么,谢谢了,感觉你的很有道理

#10


引用 8 楼 ringphone 的回复:
问题在于FLASH的背景框是非阻塞的,VC的对话框是模态的话弹出来就阻塞了FLASH的运行,你弹出对话框不能在FLASH的事件里处理,而是在收到事件后PostMessage给VC主窗口一个自定义消息,主窗口在这个自定义消息里弹出对话框,就不会阻塞FLASH的运行了。


我通过 CWnd   *pWnd=CWnd::FindWindow("Dialog1",NULL);获取到句柄,然后怎么PostMessage啊,谢谢

#11


void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)里面,检测到事件,PostMessage一个自定义消息给自己,CMyFlashTestDlg增加这个自定义消息的处理,在这个消息里弹出对话框。

#12


其实你可以这样:
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
   PostMessage(MYWM_CUSTOM,0,atoi(args));
}

然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。

#13


引用 12 楼 ringphone 的回复:
其实你可以这样:
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
   PostMessage(MYWM_CUSTOM,0,atoi(args));
}

然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。……

这个方法好,谢谢了

#14


结贴呀

#15


??已经结过了啊,很早就结了的啊