最近看了入门经典里的委托和事件,一时摸不着头脑,看的我晕乎乎的。想自己动手写一个窗体的单击事件:
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace YourselfClick
{
public delegate void ClickDelegate(object obj,MyClickEventArgs e); public class MyClickEventArgs : EventArgs
{
public MyClickEventArgs()
{ }
}
class MyForm : Form
{
public event ClickDelegate ClickEvent; public MyForm()
{
this.Text = "My ClickEvent Test.";
this.Click += new EventHandler(MyClickEvent);
//his.ClickEvent += new ClickDelegate(MyForm_Click);
} private void MyForm_Click(object obj, MyClickEventArgs e)
{
this.Text = "You have clicked the MyForm.";
} private void MyClickEvent(object obj, EventArgs e)
{
this.ClickEvent += new ClickDelegate(MyForm_Click);
ClickEvent(this,new MyClickEventArgs());
}
}
}
上面这段代码是可行的
不过我有个问题,如果我在MyForm中定义一个事件变量public event ClickDelegate ClickEvent,之后在构造函数里面写上:this.ClickEvent += new ClickDelegate(MyForm_Click);而不去用窗体本身的Click事件,就不行了,为什么,难道说这样,窗体没法获得我自己定义的ClickEvent吗?
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace YourselfClick
{
public delegate void ClickDelegate(object obj,MyClickEventArgs e); public class MyClickEventArgs : EventArgs
{
public MyClickEventArgs()
{ }
}
class MyForm : Form
{
public event ClickDelegate ClickEvent; public MyForm()
{
this.Text = "My ClickEvent Test.";
this.Click += new EventHandler(MyClickEvent);
//his.ClickEvent += new ClickDelegate(MyForm_Click);
} private void MyForm_Click(object obj, MyClickEventArgs e)
{
this.Text = "You have clicked the MyForm.";
} private void MyClickEvent(object obj, EventArgs e)
{
this.ClickEvent += new ClickDelegate(MyForm_Click);
ClickEvent(this,new MyClickEventArgs());
}
}
}
上面这段代码是可行的
不过我有个问题,如果我在MyForm中定义一个事件变量public event ClickDelegate ClickEvent,之后在构造函数里面写上:this.ClickEvent += new ClickDelegate(MyForm_Click);而不去用窗体本身的Click事件,就不行了,为什么,难道说这样,窗体没法获得我自己定义的ClickEvent吗?
解决方案 »
- RichTextBox如何实现所见即所得打印
- C#如何自动填写网页表单
- Visual Studio 2005的安装问题,请教
- 如何判断一字符串是汉字,字母,数字?
- wpf中怎样将媒体文件写入资源文件中
- C#界面怎样产生类似于excel表的输入文本格式
- 新手初学C#,请高手指点一本经典语法书@@@!!!!!!!!!!
- 菜鸟问题:设计一个用户控件,里面定义枚举,如何在form里面调用
- 项目发布时(vs2008,cs)要包含一个相关的驱动程序(此驱动为exe安装文件),想在安装此项目时一并自动安装驱动程序,可以做到吗?如何做?谢谢
- 简单问题,轻松拿分!一个关于线程终止的问题?
- 哪位大虾能帮我提供一个自动显示题目的模版,不胜感激
- 问大家
按理说也是可以的,但你的ClickEvent在什么时候触发呢?
Click事件应该是系统默认事件另外,你可以捕捉WM_CLICK消息来触发自定义的ClickEvent
取消你的一段注释:
public MyForm()
{
this.Text = "My ClickEvent Test.";
this.Click += new EventHandler(MyClickEvent);
this.ClickEvent += new ClickDelegate(MyForm_Click);
}
点击窗口,窗口的标题也会改变。
所以你的程序主要功能没问题,但有一个地方有问题:
private void MyClickEvent(object obj, EventArgs e)
{
this.ClickEvent += new ClickDelegate(MyForm_Click);
ClickEvent(this,new MyClickEventArgs());
}
这里的
this.ClickEvent += new ClickDelegate(MyForm_Click);
请删除,否则你的MyForm_Click每次点击会执行多次,而且随着点击次数的增加越来越多。
请看我的这段代码,你第一次点击窗口后面显示2,第二次5,第三次9。
public partial class Form1 : Form
{
public event ClickDelegate ClickEvent; public Form1()
{
InitializeComponent();
this.Text = "My ClickEvent Test.";
this.Click += new EventHandler(MyClickEvent);
this.ClickEvent += new ClickDelegate(MyForm_Click); } private int count = 0; private void MyForm_Click(object obj, MyClickEventArgs e)
{
count++;
this.Text = "You have clicked the MyForm." + count.ToString();
} private void MyClickEvent(object obj, EventArgs e)
{
this.ClickEvent += new ClickDelegate(MyForm_Click);
ClickEvent(this, new MyClickEventArgs());
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication13
{
public class MyClickEventArgs : EventArgs
{
public MyClickEventArgs()
{ }
} public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} public delegate void ClickDelegate(object obj, MyClickEventArgs e); private void Form1_Load(object sender, EventArgs e)
{
this.Text = "My ClickEvent Test.";
// this.Click += new EventHandler(MyClickEvent);
this.ClickEvent += new ClickDelegate(MyClickEvent);
} private void MyForm_Click(object obj, MyClickEventArgs e)
{
//this.Text = "You have clicked the MyForm.";
} public event ClickDelegate ClickEvent;
private void MyClickEvent(object obj, EventArgs e)
{
this.Text = "MyClickEvent MyClickEvent MyClickEvent";
} private const int WM_LBUTTONDOWN = 0x0201;
protected override void WndProc(ref System.Windows.Forms.Message e)
{
if (e.Msg == WM_LBUTTONDOWN)
{
if(ClickEvent!=null)
ClickEvent(null,null);
}
base.WndProc(ref e);
}
}
}
protected override void WndProc(ref System.Windows.Forms.Message e)
{
if (e.Msg == WM_LBUTTONDOWN)
{
if(ClickEvent!=null)
ClickEvent(null,null);
}
base.WndProc(ref e);
}
最后这些代码看不明白,在研究研究,谢谢各位了!!!