分享

模拟C#按钮事件触发过程

 *我爱阳光* 2010-12-29

以下是模拟我们点击鼠标,然后执行事件函数的整个过程。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 模拟按钮事件触发过程
{
    /// <summary>   
    /// 事件委托   
    /// </summary>   
    /// <param name="sender"></param>   
    /// <param name="e"></param>   
    public delegate void EventHandle(object sender, EventArgs e);  
    class Program   
    {       
        static void Main(string[] args)       
        {          
            Button btn = new Button();          
            btn.Click += new EventHandle(btn_Click);         
            Trigger(btn,EventArgs.Empty);//相当于鼠标点击触发 
            Console.Read(); 
        }     
        static void btn_Click(object sender, EventArgs e)     
        {        
            Button btn = (Button)sender;          
            btn.Text = "模拟按钮点击事件";           
            Console.WriteLine(btn.Text);     
        }       
        /// <summary>      
        ///
        /// 用户单击了窗体中的按钮后,Windows就会给按钮消息处理程序(WndPro)发送一个WM_MOUSECLICK消息      
        ///
        /// </summary>       
        /// <param name="btn"></param>      
        /// /// <param name="e"></param>       
            static void Trigger(Button btn, EventArgs e)   
             {          
                btn.OnClick(e);    
             }   
        }   
        /// <summary>   
        /// 模拟Button   
        /// </summary>  
        public class Button   
        {       
            private string txt;       
            public string Text      
            {           
                get { return txt; } 
                set { txt = value; }   
            }       
            public event EventHandle Click;//定义按钮点击事件
            /// <summary>      
            /// /// 事件执行方法      
            /// /// </summary>       
            /// <param name="sender"></param>      
            /// /// <param name="e"></param>     
            void ActionEvent(object sender, EventArgs e)       
            {          
                if (Click == null)       
                Click += new EventHandle(Err_ActionEvent);         
                Click(sender, e);//这一部执行了Program中的btn_Click方法
            }      
            void Err_ActionEvent(object sender, EventArgs e)  
            {          
                throw new Exception("The method or operation is not implemented.");    
            }     
            public void OnClick(EventArgs e)    
            {         
                ActionEvent(this, e);      
            }         
        }
}
 
用户单击了窗体中的按钮后,Windows就会给按钮消息处理程序(WndPro)发送一个WM_MOUSECLICK消息,对于.NET开发人员来说,就是按钮的OnClick事件。

从客户的角度讨论事件:
       事件接收器是指在发生某些事情时被通知的任何应用程序、对象或组件(在上面的Demo中可以理解为Button类的实例btn)。有事件接收器就有事件发送器。发送器的作用就是引发事件。发送器可以是应用程序中的另一个对象或者程序集(在上面的Demo中可以理解为程序集中的program引发事件),实际在系统事件中,例如鼠标单击或键盘按键,发送器就是.NET运行库。注意,事件的发送器并不知道接收器是谁。这就使得事件非常有用。
      现在,在事件接收器的某个地方有一个方法(在Demo中位OnClick),它负责处理事件。在每次发生已注册的事件时执行事件处理程序(btn_Click)。此时就要用到委托了。由于发送器对接收器一无所知,所以无法设置两者之间的引用类型,而是使用委托作为中介,发送器定义接收器要使用的委托,接受器将事件处理程序注册到事件中,接受事件处理程序的过程成为封装事件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多