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的事件? 看一看
trace("sdssd1");
fscommand('bt','1');
loadswf 和fscommand是同步执行的。你的loadSwf是自定义函数吗? 你应该保证loadswf确实执行完了再调用fscommand,有没有类似onloadcomplete的事件? 看一看
#6
loadSwf(0);是用来加载xml文件的,因为对flash不是很熟悉,本来要是能加个标志位的话就可以解决,但是塔这个loadSwf(0);不知道怎么加
#7
我把代码改了下,如下,还是不行,大家帮忙看看
loadSwf方法在下面,然后我就改了第一个的代码,把fscommand放到了loadSwf这个方法的下面,做了个if判断,传递0的时候表示按了第一个按钮,然后全部显示完再发送fscommand命令,结果还是先弹出dialog来,很奇怪,求解
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
可以帮我改一下么,谢谢了,感觉你的很有道理
#10
我通过 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参数再去弹出相应对话框。
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
PostMessage(MYWM_CUSTOM,0,atoi(args));
}
然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。
#13
这个方法好,谢谢了
#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的事件? 看一看
trace("sdssd1");
fscommand('bt','1');
loadswf 和fscommand是同步执行的。你的loadSwf是自定义函数吗? 你应该保证loadswf确实执行完了再调用fscommand,有没有类似onloadcomplete的事件? 看一看
#6
loadSwf(0);是用来加载xml文件的,因为对flash不是很熟悉,本来要是能加个标志位的话就可以解决,但是塔这个loadSwf(0);不知道怎么加
#7
我把代码改了下,如下,还是不行,大家帮忙看看
loadSwf方法在下面,然后我就改了第一个的代码,把fscommand放到了loadSwf这个方法的下面,做了个if判断,传递0的时候表示按了第一个按钮,然后全部显示完再发送fscommand命令,结果还是先弹出dialog来,很奇怪,求解
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
可以帮我改一下么,谢谢了,感觉你的很有道理
#10
我通过 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参数再去弹出相应对话框。
void CMyFlashTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
PostMessage(MYWM_CUSTOM,0,atoi(args));
}
然后CMyFlashTestDlg处理这个MYWM_CUSTOM自定义消息,根据lParam参数再去弹出相应对话框。
#13
这个方法好,谢谢了
#14
结贴呀
#15
??已经结过了啊,很早就结了的啊