| flash5 编程高级教程系列之一(自制弹出式对话框) 这个教程是面对已经有编程经验的高级用户的,里面的一些细节问题我就不在一一讲解了,我只讲解我里面的一些主要的编程思想和编程技巧。而它的应用是面向一切flash学习着的,有了这个源文件,你就可以有自己的flash对话框了,记住了,一定建立一个自己的flash功能文件夹,把一些好用又难懂的flash源文件来存在里面,已被平时使用阿。
       对于高级用户来说,我在这个例子中用了非常巧妙的编程方法来实现了弹出对话框以及对话框的确定、取消、关闭、拖动等功能,你可以从中学习,并且如果你发现我的程序有什么不足之处或还有更好的方法的时候请于我联系,我们共同商讨解决。 
       对于初级用户来说,你只有会用flash的一些基本功能就可以做成修改成自己的界面,用法非常简单,一看就会,就算是你从来都没有接触过flash,你也可以很快的就能任意的做自己的对话框了。 
       我在教程中及源文件中仅提供对话框的两个样式,如果你需要,还可以自己制作自己的各种各样的对话框,方法见下面的教程。另外,因为教程制作仓卒,所以界面简陋,望大家谅解。
 下面我将介绍制作过程: 
 第一步:制作对话框的实体mc。由于对话框分为各种样式,所有对话框可以有很多帧,每一帧是一种样式的对话框。对话框的样式自己定义,对话框里注要包括背景,标题文本框,确定与取消按钮,关闭按钮,主题文本框等等,这些都可以有自己制作。我的实例中只有两帧,就是只有两个样式的对话框。
 另外在对话框的最上一层为action层,每一帧加一句action:
 stop();
 具体见实例。
 第二步:完成主程序。2-1:获得对话框的函数。具体程序如下:
 // 建立一个新的对话框
 function New_Msg () {
 _root.attachMovie("msg", "msg"+_root.deep, _root.deep);
 _root.deep++;
 return eval("msg"+(_root.deep-1));
 }
 
 其中deep是在主场景下的全局变量,随着对话框的增多而曾加,防止出现深度重叠。
 函数以返回的方式输出对话框mc,其中有着很巧妙的用法,看完后面的就知道了。
 2-2:建立主对话框类及其成员函数。程序如下:
 // 建立对话框功能类function Msg (c_string1, c_string2, c_n) {
 this.string1 = c_string1;
 this.string2 = c_string2;
 this.n = c_n;
 //
 if (_root.deep == null) {
 _root.deep = 10000;
 }
 this.num = _root.deep;
 this.msg = New_Msg();
 If_Deep(this.msg);
 this.msg._visible = 0;
 }
 
     以上为对话框功能的类的定义,其中三个参数分别代表对话框的消息框的文字,主题框的文字和对话框的样式,具体见例子。在这里面有内部object变量就是this.msg就是2-1步中返回的mc,这样能非常方便的对这个mc进行包括删除的操作,设置deep的初值为10000就是保证弹出的对话框一定在最上面。
 Msg.prototype.Show = function (c_x, c_y)
 {
 this.msg._visible = 1;
 //
 this.x = c_x;this.y = c_y;
 if (c_x == null)
 {
 this.x = this.msg._width;
 }
 if (c_y == null)
 {
 this.y = this.msg._height;
 }
 //
 this.mysound = new Sound();
 this.mysound.attachSound("ding");
 this.mysound.start();
 delete this.mysound();
 this.msg.info = this.string1;
 this.msg.message = this.string2;
 this.msg.gotoAndStop(this.n);
 this.msg._x = this.x;
 this.msg._y = this.y;
 this.msg.that = this;
 };
 
     以上为对话框的显示成员函数,它的主要功能是显示对话框。其中可以加上一个声音,这个也可以自己定义的。这里面最巧妙的一句就是最后一句,它的巧妙之处注要用在了对话框的销毁上,你可以自己体会。
 Msg.prototype.Msg_Ok = function (){
 trace("This is Msg_Ok's action.");
 //一下添加自己的功能代码:
 };Msg.prototype.Msg_Cancel = function ()
 {
 trace("This is Msg_Cancle's action.");
 //一下添加自己的功能代码:
 };
 
 以上两个成员函数是点击确定与取消时的功能区,主要有自己添加,对话框的功能就可以在这里面实现。
 Msg.prototype.Del_Msg = function ()
 {
 //    trace("This is Del_Msg's action.");
 removeMovieClip (this.msg);
 };
 
 以上的成员函数为销毁对话框的函数,在这里,可以看到mc作为函数返回值的巧妙之处。
 2-3:完成深度与拖拽的功能函数。程序如下: 
 function If_Deep(c_mc){
 _root.old_mc.msg_bg.gotoAndStop(2);
 c_mc.msg_bg.gotoAndStop(1);
 _root.old_mc = c_mc;
 }
 // 检测鼠标与那个点击那个mcfunction Mouse_Focue (c_mc) {
 if(_root.mymousedown == 1 && c_mc.hitTest(_root._xmouse,_root._ymouse,true))
 {
 If_Deep(c_mc);
 c_mc.swapDepths(_root.deep++);
 c_mc.startDrag (false);
 //        trace(c_mc);
 return true;
 }else{
 c_mc.stopDrag ();
 return false;
 }
 }
 这个函数的功能就是当鼠标在一个对话框上点击的时候,对话框自动显示在最前面,这是对话框最其本的标志。另外还实现了拖拽的功能。其中也有很多技巧,你应该自己想一想,其中_root.deep++(注意这里可千万不能将其颠倒,想想为什么?),另外返回值也有妙用。
 这样,我们的工作就已经完成了大部分了,剩下的就是后补工作了,当然还有很多后补工作需要你自己做了。
 第三步:判断鼠标的按下与放开。在这里面也不是很简单的事,因为flash里只有按钮和mc能判断鼠标,所以在把这部分放到时间轴上是不太可能的事了,有因为鼠标只能在它自己的热区里才能实现,所以我们选择mc,制作一个空的mc为control,并把它放在对话框mc的control层(这是最关键的,想想为什么要放到这里?),在上面加入代码:
 onClipEvent (mouseDown) {
 if(_root.mouse_down_ip != true){
 _root.mymousedown = 1;
 _root.mouse_down_ip = _root.Mouse_Focue(_parent);
 }
 }
 onClipEvent (mouseUp) {
 _root.mymousedown = 0;
 _root.mouse_down_ip = _root.Mouse_Focue(_parent);
 stopDrag();
 }
 在这段程序之中就能看到拖动对话框的函数的返回值有什么作用了吧,如果还不明白,那还得慢慢体会,也可以去掉试一试。
 最后:完成对话框里的几个按钮上的action:4-1:“确定"按钮上的action:
 on (release) {that.Msg_Ok();
 // 一下添加自己的功能代码:
     that.Del_Msg();}
 这里明白2-2程序里最后一句的作用了吧。
 4-2:“取消”按钮上的action:
 on (release) {
 that.Msg_Cancel();
 // 一下添加自己的功能代码:
     that.Del_Msg();}
 啊,都是一样的啊,当然了,就是一样的吗。
 4-3:“关闭”按钮上的action(右上角的):
 on (release) {that.Del_Msg();
 }
 原来就这么简单啊。
 (有关程序的实现,请见例子)
 总结:到现在我们的对话框程序就全部完成了,有人会说,我要是自己做一个专用的早就做好了,你要用这么长时间才能作出来啊,不值啊。问问大家是吗,不是的,我做这一个的确不值,但是要是我要很多,我还要很多此的用呢,到底值不值,大家自己也是能想清楚的。另外如果你的手里已经有了这个程序呢,唉,简单多了,那大家还不该学的学,该收藏的收藏。
 还有,那些想做我那个打字程序的同学们,这是我的第一个教程,也是那里面第一个出现的东西,以后还要注意,余下的程序啊。一定注意!!!^_^ 
 下载源文件下面为源程序:
 
 [Ctrl+A 全部选择 然后拷贝]
 出处:蓝色理想
责任编辑:蓝色
 ◎进入论坛Flash专栏版块参加讨论
	      |