最近看了入门经典里的委托和事件,一时摸不着头脑,看的我晕乎乎的。想自己动手写一个窗体的单击事件:
代码如下:
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吗?

解决方案 »

  1.   

    this.ClickEvent += new ClickDelegate(MyForm_Click)
    按理说也是可以的,但你的ClickEvent在什么时候触发呢?
    Click事件应该是系统默认事件另外,你可以捕捉WM_CLICK消息来触发自定义的ClickEvent
      

  2.   

    ClickEvent这个事件是在MyClickEvent事件里引发的,如果你不注册Form的Click,你该怎样触发呢?this.ClickEvent += new ClickDelegate(MyForm_Click);只是说这个事件如果发生了则执行MyForm_Click,但是没有给它引发的机会。
      

  3.   

    那是因为你没有能够触发这个事件的行为,上面的代码为什么能够成功呢,因为你点击窗体,可以触发窗体的Click事件,但是无法触发你的ClickEvent事件,即你的ClickEvent无法捕获你点击窗体这个行为
      

  4.   

    你的代码我在VS2008的环境中执行没有任何问题.
    取消你的一段注释:
     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());
            }
        }
      

  5.   

    如何捕捉自定义的事件呢,ZengHD大哥能稍稍讲解下吗。
      

  6.   

    using System;
    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);
            } 
        }
    }
      

  7.   

    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);
            }
    最后这些代码看不明白,在研究研究,谢谢各位了!!!
      

  8.   

    wndproc是control的一个方法,用来处理传入窗口的消息,
      

  9.   

    谢谢xhueducls的解释,真的很感谢大家的热心帮助。