标题:flash在C#中的应用
只看楼主
梦心
Rank: 4
来 自:福建平和
等 级:贵宾
威 望:13
帖 子:1910
专家分:0
注 册:2007-5-11
结帖率:100%
 问题点数:0 回复次数:8 
flash在C#中的应用
很多光盘上的程序,比如电脑迷光盘,开头总有一段动画,用来展现企业品牌和LOGO之用。这个动画是Flash做的,而且嵌入到程序中简直做到无缝融合,因为右键点击它也不会有那特有而烦人的Flash右键菜单。
因此将Flash融合到WinForm中能够增强程序的多媒体效果和炫丽的外观。现在我们就来看看在C#桌面程序中如何插入Flash视频,而且去掉烦人的右键菜单。

首先要插入Flash就必须使用Flash控件,在工具栏右键选择“选择项…”,然后在“COM组件”面板下点击“浏览”按钮,在本机电脑C:\WINDOWS\system32\Macromed\Flash\目录里选择Flash8.ocx(也有可能是Flash9F.ocx,版本不同所致),然后点击确定就可以了。但到这里还没有完,因为要使用Flash控件必须注册它。
在CMD里面输入如下:
regsvr32 C:\WINDOWS\system32\Macromed\Flash\Flash8.ocx
系统会提示注册成功,这个时侯就可以在VS2008里面使用该控件了!
打开VS2008,新建一个Windows程序,然后把刚才我们选择的Flash控件Shockwave Flash Object拖到窗体中,这时窗体中会出现一个白色的矩形框,Name属性我们设置为Myflash,在里面可以播放我们需要的swf文件。

注意到该控件主要有几个属性:
Name属性,这个是所有对象都会有的。
Menu属性,这个是Flash菜单项,默认值为true,也就是右键的时候会出现完整的Flash菜单,如果设置为False,则只出现最简的菜单(设置与关于)。
Move属性,这个属性是用来指定要播放的Flash文件的。
Playing属性,指定是否装在影片之后马上播放。
Quality属性,设置影片的质量。
Scalemode属性,设置影片的缩放模式。
Visible属性,设置影片控件的可视与否。

接下来我们在窗体中放置一个按钮,Text属性设置为LoadSwf。双击添加事件代码如下:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Flash文件|*.swf";
DialogResult dr = ofd.ShowDialog();
if (dr == DialogResult.OK)
{               
    Myflash.Movie = ofd.FileName;
    Myflash.Play();
}   
这样当程序运行的时候点击按钮会要我们选择一个SWF文件,选择好后确定就自动播放了!
当然,我们还可以添加一些按钮,分别为Play,Pause
Play按钮的播放功能如下:
This.Myflash.Play();
Pause按钮的暂停功能如下:
This.Myflash.StopPlay();

这里就不再啰嗦了,各位园友可以自行去研究一些常用的功能。下面我们主要来讲解如何消去烦人的Flash右键菜单!
消去Flash右键菜单有两种方法(本人愚笨,到目前只发现这两种):

方法一:
这个方法比较复杂,也比较繁琐,主要是用到API函数的调用。代码如下:

#region 去掉Flash右键菜单,API函数的声明
        private const int GWL_WNDPROC = -4;
        public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);        
        private IntPtr OldWndProc = IntPtr.Zero;
        private FlaWndProc Wpr = null;
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
        private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam) {
            if(msg == 516)   //516就是对应鼠标的右键,当然你也可以用0X0204右键鼠标的16进制编码
                return (IntPtr)0;   //什么都不做
            return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
        }
      #endregion
将以上代码放在窗体声明字段的地方。
注:要调用API函数就必须引用一个命名空间:
using System.Runtime.InteropServices;
然后在窗体的载入事件里面添加如下代码:
private void Flash_Load(object sender, EventArgs e)
{
   this.Wpr = new FlaWndProc(this.FlashWndProc);
   this.OldWndProc = SetWindowLong(Myflash.Handle, GWL_WNDPROC, Wpr);  //关联flash控件
}
如此则大功告成,看看是不是把Flash右键菜单给去掉了!!

方法二:
这个方法很简单,也很灵活,主要用到继承和重写等面向对象的核心内容。
首先声明一个类,让它去继承AxShockwaveFlashObjects.AxShockwaveFlash,该类是实例化Flash控件生成的类。该类中包含各种Flash的事件和属性,在这里我们只对右键菜单的事件感兴趣,因此我们去重写该事件。
类的代码如下:
public class FlashRightKey : AxShockwaveFlashObjects.AxShockwaveFlash
    {
        //定义一个公共类FlashRightKey(类名自己定义)来继承AxShockwaveFlashObjects.AxShockwaveFlash(在实例化Shockwave Flash Object控件后生成)类
        protected override void WndProc(ref Message m) //重载WndProc方法(此方法即消息处理机制)
        {
            if (m.Msg == 0X0204) //0×0204即鼠标右键的16进制编码
                return; //返回并不输出
            else
                base.WndProc(ref m); //如果不是右键的话则返回正常的信息
        }
}

类写好了,我们要在Flash控件里面使用它,必须在实例化Flash控件的时候用如下代码(写在Flash.Designer.cs文件相应的地方):
private FlashRightKey MyFlash2;
this.MyFlash2 = new Namespace.FlashRightKey();

注:Namespace为工程项目的命名空间。
剩下的就和不用我多说了,大功告成,实现了Flash控件去掉右键菜单。

以上代码在 XP+VS2008+Flash8播放器 调试通过。
本文也只是抛砖引玉,至于如何获取点击事件以及和其他控件的通信则是比较高深一点的知识了,各位朋友互相勉励,想更高深的知识挺进!
搜索更多相关主题的帖子: 右键 flash 
2008-11-18 08:26
梦心
Rank: 4
来 自:福建平和
等 级:贵宾
威 望:13
帖 子:1910
专家分:0
注 册:2007-5-11
得分:0 

欧也~~~~终于通过审核成为原创咯~~~hoho..........

我清高和我骄傲的倔强,在风中大声的唱:我不听,我不听~~做我自己最特别,呼呼~~啦啦~~~
我的博客园地址: [url]http://[/url]
2008-11-20 11:47
谁与争瘋
Rank: 2
等 级:论坛游民
帖 子:360
专家分:14
注 册:2008-11-18
得分:0 
恭喜恭喜  哈哈



支持原创 打击摘抄
支持盗版 打击黑屏
2008-11-20 15:26
hnht7163
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-11-20
得分:0 
学习中,感觉非常好。谢谢
2008-11-20 16:51
huangwei89
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2008-10-17
得分:0 
学习一下,谢谢
2008-12-02 19:49
Vseen
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-8-12
得分:0 
我以前也做过FLASH,主要是学校要进行一次比赛,比赛过程中的题目用用到falsh.时日太久了.
我想想.你的右键屏蔽的做法,第二种到是没见过.学习了.
但是有个问题想问一下,如何截取鼠标或键盘在falsh里的消息?例如单击flash按钮?例如全屏falsh?

我那时候目的是为了在题目播放完之后,自动退出全屏.我用了最土的方法,就是new一个form,然后falsh的dock是fill,然后隐藏一个button,这个button事件是退出当前窗口.但只能按Exc.因为我把button设置为this的取消按钮.可是这些方法很让人郁闷.网上关于falsh怎么那么少啊?!
2008-12-03 09:14
FlyBee
Rank: 1
来 自:云南玉溪
等 级:新手上路
帖 子:113
专家分:0
注 册:2007-12-11
得分:0 
学习一下。。。支持原创

http://bbs./index.php?fromuid=8348
2008-12-03 09:30
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
得分:0 
还真没用过...试试去

飘过~~
2008-12-03 10:53
iyth61525
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-5-19
得分:0 
谢谢啊
2008-12-03 18:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-244902-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.668333 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved