Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1029671
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类:

2006-01-28 17:50:44

如何定义自己的事件并且使这一事件可以用 += 注册事件?

 

定义自己的事件类,这样可以传递自己需要的参数,当然也可用系统的事件类。

namespace win2

{

    public class MyEventArgs: EventArgs

    {

        public MyEventArgs(

            Message e)

        {

            this.Windows_Message = e.Msg;

        }

        public readonly int Windows_Message;

    }

}

 

第二步定义自己的委托对象

public delegate void MyEventHandler(object sender,MyEventArgs e);

 

前两步是在namespace win2中进行的

第三步要在需要的类中定义,如Form1中

//ClsoeWindow是偶自定义的事件。

public event MyEventHandler CloseWindow;

 

第四步偶添加了一方法。此方法当定义的事件发生时被调用。

//此方法可被重载,类似于双击菜单时,在VS2005的窗口设计器自动产生的单击事件处理方法一样,当然如没有双击的话,父类的同名方法会被调用,依次类推。这一点好象对事件处理很方便哦。参数应最少要包括要传递的事件。返回值这里用 void,好象没有用哦。

protected virtual void OnCloseWinow(MyEventArgs e)

        {

            if(CloseWindow!=null)

            {

                CloseWindow(this,e);

            }

        }

 

第5步偶添加了要注册的事件处理程序,也就是当事件发生时,第四步的方法会调用所有注册的事件处理程序,偶这用一个代表了,多个也是这样的方法。参数和返回值要的委托对象保持一致。

public void CW(object sender,MyEventArgs e)

        {

            MessageBox.Show("OK,注册的程序CW被调用了");

        }

 

第6步偶在一菜单单击事件中实施注册动作

private void openToolStripMenuItem_Click(object sender, EventArgs e)

        {

            MessageBox.Show("下面要登记事件处理方法CW()");

            this.CloseWindow += new MyEventHandler(this.CW);

        }

 

第7步偶想在哪儿激活此事件呢?偶定义 CloseWindow 是想对应 WM_CLOSE 消息,系统已经有了自已的Clsoe()方法来关闭窗口。不过在哪里处理WM_CLOSE消息呢?偶想到了WndProc,重载它。

protected override void WndProc(ref Message m)

        {

    //关于WM_ 消息在VS2005的VC++目录的include目录的winuser.h文件中有。

            const int WM_CLOSE = 0x0010;

            if (m.Msg.Equals(WM_CLOSE))

            {

                MyEventArgs e = new MyEventArgs(m);

    //偶是在这里处理的,不知NET类库里是怎样处理的

                OnCloseWinow(e);

            }           

            base.WndProc(ref m);

        }

 

下面是操作分析:

 

偶是先在菜单中单击以执行第6步中代码

 

当WM_CLOSE消息发出,第7步中的

if (m.Msg.Equals(WM_CLOSE))

 条件为真

MyEventArgs e = new MyEventArgs(m);

OnCloseWinow(e);

会被调用。

 

第四步中OnCloseWindow(e)会调用

CloseWindow(this,e);

(只有一种情况不会,如果没有在第6步中的菜单中单击,就不会发生事件注册。如果没有一个注册的事件处理方法,CloseWindow!=null 条件语句为false。自然不会再执行CloseWindow(this,e);了)

 

因为偶先做好了(第6步的代码已执行),所以ClsoeWindow(this,e)会调用

public void CW(object sender,MyEventArgs e)

        {

            MessageBox.Show("OK,注册的程序CW被调用了");

        }

这时就会见到此对话框了。

 

 

下面是全部源码:

Form1.cs:

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace win2

{

    public delegate void MyEventHandler(object sender,MyEventArgs e);

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        public event MyEventHandler CloseWindow;

 

        public void CW(object sender,MyEventArgs e)

        {

            MessageBox.Show("OK,注册的程序CW被调用了");

        }

        protected virtual void OnCloseWinow(MyEventArgs e)

        {

            if(CloseWindow!=null)

            {

                CloseWindow(this,e);

            }

 

 

        }

                protected override void WndProc(ref Message m)

        {

            const int WM_CLOSE = 0x0010;

            if (m.Msg.Equals(WM_CLOSE))

            {

                this.Text = "WM_CLOSE";

                MyEventArgs e = new MyEventArgs(m);

                OnCloseWinow(e);

            }           

            base.WndProc(ref m);

        }

 

        private void openToolStripMenuItem_Click(object sender, EventArgs e)

        {

            MessageBox.Show("下面要登记事件处理方法CW()");

            this.CloseWindow += new MyEventHandler(this.CW);

        }

    }

}

 

MyEventArgs.cs

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

 

namespace win2

{

    public class MyEventArgs: EventArgs

    {

        public MyEventArgs(

            Message e)

        {

            this.Windows_Message = e.Msg;

        }

        public readonly int Windows_Message;

    }

}

 

相关内容:

DOTNET框架程序设计 第11章 事件 有详细分析。不过还是没见DOTNET是在哪里调用类似上面的OnCloseWindow的。类似的有OnClick,OnMouseMove等。因为不知道

所以在WndProc里处理吧。象本文的方法只是学习用,不知有没实际价值?

 

疑问:

创建自己的Form类,加入一些常见的事件如WM_CLOSE的对应事件,与在WndProc里直接处理相比,不知是谁更好?

阅读(1564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~