【背景】最近在使用Shockwave Flash Object插件播放swf视频时,需要对视频进行显示和隐藏的操作。但是缺遇到了问题,这里跟大家一起分享,希望我的方法能够解决大家类似的问题,并探讨问题的原因。
【方法】我尝试的方法有两个:
1.显示隐藏插件;
2.通过控件窗口大小;
下面说一说我使用这两个方法过程中遇到的问题。
方法一:
MFC的控件显示和隐藏,大家都知道的常用方法时ShowWindow(int cmdShow),这也是我首先想到和使用的。
显示控件:GetDlgItem(IDC_SHOCKWAVEFLASH)->ShowWindow(TRUE);
隐藏控件:GetDlgItem(IDC_SHOCKWAVEFLASH)->ShowWindow(FALSE);
但却没有任何的效果,我的系统是Win10,使用VS2010进行开发。
这是我产生的疑问,是不是环境发生了不知道的变化,再试试其他的控件。
这时用自带的静态文本控件进行了测试,显示和隐藏控制正常。
方法一的问题:对Shockwave Flash Object插件使用ShowWindow没有作用。
方法二:
隐藏控件:m_flashPlayer.MoveWindow(0,0,0,0,TRUE);
显示控件:m_flashPlayer.MoveWindow(0,0,MY_WIDTH,MY_HEIGHT,TRUE);
这种方法需要配合flash播放的暂停和开始。
但也遇到了问题,再MoveWindow时,程序运行有时莫名的卡死。
经过多次尝试仍无找到视频卡死的原因。
方法二问题:MoveWindow时造成Shockwave Flash Object插件播放swf视频卡死。
这个问题无限循环中,没有结束条件,至到再次使用MoveWindow。
在尝试透明flash的背景时,用Button按钮做背景透明测试,发现了一个现象。
拖入Button控件后,使用GetDlgItem(IDC_SHOCKWAVEFLASH)->ShowWindow(FALSE);
此时控件隐藏的效果发生了。
就这样我找到了解决问题的方法。
解决方法:
第一、添加一个按钮控件;
第二、显示;
GetDlgItem(IDC_BUTTON1)->ShowWindow(TRUE); //显示该控件
第三、将该控件移除显示区域;
GetDlgItem(IDC_BUTTON1)->MoveWindow(-5,-5,5,5,TRUE);
第四、按照逻辑需要进行插件的显示和隐藏操作。
使用这种方法的具体原因,可能和控件窗口的消息机制有关系。希望大家指点。