分类:
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里直接处理相比,不知是谁更好?