`
hyshucom
  • 浏览: 809996 次
文章分类
社区版块
存档分类
最新评论

在VC++中使用Flash界面

 
阅读更多
最近的一个项目,想通过在VC中嵌入Flash的方式实现程序界面。以前曾经做过Flex的B/S项目,知道一些Flash和IE浏览器之间的工作方式。可是接触了以ActiveX方式实现的Flash编程时,自然而然想当然的走了很多的弯路。很多貌似很复杂的问题,在绕了很多的圈子之后才发现,原来实现起来往往只需要一行代码。项目还需进行,特意在此把心得记录下来。
一、Flash同VC之间的数据通讯。
同大多数的ActiveX控件一样,VC为Flash实现了一个CWnd的包装:CShockwaveFlash,该类实现了Flash ActiveX控件的所有功能。在AS3问世之前,Flash同宿主之间的通讯只有FSCommand一种方式,而且是异步的,更没有返回值可言。因为项目中需要VC为Flash提供大量的数据库查询,返回结果通过XML进行传递。因此,FSCommand无疑是不方便的。
AS3推出的外部API调用方式:ExternalInterface,极大的简化了编程方式。ExternaleInterface是同步的调用,并可以返回调用结果。需要说明的是,同步调用是以牺牲性能为代价的,因为这涉及到大量的CPU周期占用)。我曾经在Flex项目中,利用ExternalInterface实现了IFrame在Flash的嵌入调用,从而达到在Flash中显示HTML的问题。
CShockwaveFlash为ExternalInterface提供了一个事件接收器(event sink):FlashCall。FlashCall事件只有一个参数:request,而且我们会发现,在Flash中通过ExternalInterface的调用,是通过XML的方式进行封装,然后传递到request中的。为了获得调用的方法名和参数,你必须解析request封装的XML包。
不过奇怪的是,处理FlashCall事件的是一个void方法。要返回数据,你需要调用SetReturnValue方法。返回的数据也必须是XML格式,且必须符合Flash的规范。如果要返回XML结果集,把XML封装到<string></string>中,然后在Flash中通过new XML(str)的方式动态生成。
二、屏蔽Flash的右键菜单
这是个恼人的问题,我不希望用户在软件界面中弹出Flash右键菜单。在VC中,虽然Flash控件提供了SetMenu方法,通过传入FALSE屏蔽大部分的菜单项,但遗憾的是,“关于”和“设置”菜单无法去掉。
为了实现这个功能,我查阅了大量的资料。按照一般的想法,右键菜单的生成应该经过某种消息处理的流程。我先是重载了CShockwaveFlash类的WndProc方法,并在其中跟踪消息流,结果造成IDE死机。我做出了一个错误的决定,我认为这个消息一定可以在其它地方截获,于是我又费了很大的周折,特意实现了自己的CControlSite类,结果依然让人失望。
后来下载了一个Delphi下的TShockwaveFlashEx组件,才发现该组件是通过截获组件的WM_RBUTTONDOWN消息实现的菜单屏蔽。这就是说,让用户的右键消息干脆不传到Flash控件中去。简单而直接的方法。
在VC中实现起来更简单些。直接从CShockwaveFlash派生自己的类(不建议直接修改CShowwaveFlash类),然后捕获WM_RBUTTONDOWN消息,直接在消息处理函数中注释掉父类的方法调用。然后修改Flash对象的类型为你的派生类即可。
甚至可以更简单些。直接在对话框中响应WM_MOUSEACTIVATE消息,然后在处理函数中判断message参数的值,如果是WM_RBUTTONDOWN,则返回MA_ACTIVATEANDEAT(激活控件,吃掉消息。http://msdn2.microsoft.com/en-us/library/ms645612.aspx)。
三、调整窗口大小时防止Flash控件闪烁
在Dialog的WM_SIZE响应中,把Flash控件布满整个窗口。可是这个简单的实现却造成了Flash界面的频繁闪烁。在Delphi的TShockwaveFlashEx组件中,作者是通过覆盖组件的CreateWnd方法实现的,在对话框Resize事件中,调用这个重载的CreateWnd方法。
可是,在VC中如何实现呢?为此,我在google上苦苦搜索了好几天。关于ActiveX控件闪烁的问题,网上有很多的解决方案。很多方案都是建议同时重载控件和对话框擦除背景事件,然后写一些代码防止控件重绘自身。也有一些方法是通过GDI的思路,在内存中通过bitblt的方式避免闪烁。看到最后很伤心,怎么会这么麻烦呢。
今天在网上找到一篇文章:解决Windows 程序界面闪烁问题的一些经验,文中讲到造成界面闪烁的第二个原因:

复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。我们知道父窗口上被子窗口挡住的部分其实没必要重画的。

解决方法:给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。如果同级窗口之间有重叠,那么需要再加上 WS_CLIPSIBLINGS 风格

我赶紧到项目中把Flash对话框的窗口风格加上WS_CLIPCHILDREN,编译后运行,成功了!感谢作者,让我终于睡了一个安稳觉。
四、DEBUG状态是总是报Assertion失败。
这个问题困扰了我一整天。我的系统上安装了Flex SDK,因此,注册的Flash控件是调试版。不知什么原因,在每次关闭对话框之后,系统总是报cmdtarget.cpp文件中的控件引用值不为1错误,从而造成断言失败。
我以为是代码的问题,重建了一个项目,什么代码都没写。运行,关闭,断言错误。因为之前的VC出现了一个奇怪的问题:打开对话框命令总是出现非法操作。反复重装VC都不能解决,最后在网上看到可能是安装的visio 2003冲突,卸载visio 2003后问题解决。我开始怀疑是不是我之前的折腾把系统搞乱掉了。我又重装了一次VC,再次编译运行,问题再次出现。我都快疯了。
在没疯之前,我决定到同事的电脑上试一下。生成的程序运行没有问题。把我生成的代码拷贝过去运行,没有问题。我突然意识到,是不是Flash控件的问题。卸载重装后,问题解决。我的天!
(待续。。。)
分享到:
评论

相关推荐

    VC++MFC使用+Flash+美化你的程序

    VC++MFC中使用Flash美化你的程序界面,有源代码

    vc++使用flash来美化程序

    vc++使用flash来美化程序,直接放一个flash进去在控件中播放,适用于登录界面,公司信息界面等

    用VC++实现FLASH的UI启动画面

    介绍ActiveX控件在VC++应用程序的使用方法并通过使用Shockwave Flash Object控件实现了FLASH的UI启动画面,开发了一套友好美观的应用程序界面。

    使用VC++6.0生成的弹出式欢迎界面

    该示例使用VC++6.0为开发环境,添加Flash控件,生成一个很好的欢迎界面

    vc++ 应用源码包_3

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_1

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    在VC中使用 Flash 美化你的程序

    这篇文章讲解了如何用FLASH美化MFC程序的界面

    vc++ 应用源码包_2

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_6

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    VC++的UI设计实例

    介绍ActiveX控件在VC++应用程序的使用方法并通过使用Shockwave Flash Object控件实现了FLASH的UI启动画面,开发了一套友好美观的应用程序界面

    vc++ 应用源码包_5

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    USB,动态库原码,VC++

    上位机提供了动态库及源码,如果写应用界面可直接调用动态库即可,无须对底层做过多了解,但这些也只属于一个初始框架,希望哪位有VC++经验而且有兴趣的,可以细化并提供出一个更好的供广大爱好者使用。 USB,...

    vc++ 开发实例源码包

    FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本...

    vc++ 应用源码包_13

    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。...全屏幕播放flash的动画启动界面.rar 任务栏终级编程.rar 三种方法来检索处理器信息.zip 深入解剖远程管理软件编写.zip

    VC2008做的漂亮界面

    VC2008做的漂亮界面,基于FLASH动画设计

    STM32的USB上位机(VC++源码).rar

    前些时间玩了把STM32,原来想做一个USB接口的单片机,FLASH编程器,感觉不错,但这段时间停了,特发上来和大家分享 代码涉及USB上位机(VC++源码),动态库(VC++源码),STM32下位机, 如果正在学习USB相关的可以...

    cgjoy-PngMergeHelper.zip

    尤其是可用在VC++2010的Ribbon界面快速布局透明图标,速度超快。 一些桌面和手机游戏中的一些动画效果需要使用很多帧图像,通过快速轮动播放来实现,少则几帧,多则几十帧,为了方便管理图片和减少图片文件总的大小...

    VC++制作浮动的工具栏窗口

    VC++实现一个支持鼠标拖动的浮动工具栏窗口,如测试运行图所示,鼠标拖动浮动窗口,可自由移动位置,其形状会自动变化,根据位置的不同,自动吸附,并且自动变换大小和形状,很智能的工具栏窗口,在Flash软件、...

    VC++ 用按钮推拉展开工作区的大小

    内容索引:VC/C++源码,界面编程,按钮 做网页设计的还有经常编程的朋友都知道,在Dreamweaver、Flash、VB等软件中有一种推拉窗口的按钮,点击后会使窗口尺寸发生变化,要么是展开、要么是折叠,本VC++按钮就是模拟的...

    zhaozhiyong.rar_VC 界面_vc 动画_个人网_个人网站_网站

    精美个人网站,包含有flash动画,VC++等作品的展示,有比较好的后台管理界面

Global site tag (gtag.js) - Google Analytics