zoukankan      html  css  js  c++  java
  • WinForm中的事件触发机制学习

    在一个Form窗体中拖个按钮,双击后系统自动生成代码:

     private void button1_Click(object sender, EventArgs e)
            {
             
            }
    

     同时在窗体的InitializeComponent()方法中自动生成代码:

    this.button1.Click += new System.EventHandler(this.button1_Click);
    

    当Form程序运行起来后点击按钮时,就会触发按钮的Click事件,并通过委托System.EventHandler来实现对button1_Click(object sender, EventArgs e)方法的调用。

    但是,为什么点击按钮时,就会触发Click事件呢?要弄明白这个问题,就需要了解windows的消息机制了.

    Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理

    1 什么是消息(Message)

    消息就是通知和命令。在.NET框架类库中的System.Windows.Forms命名空间中微软采用面向对象的方式重新定义了Message。新的消息(Message)结构的公共部分属性基本与早期的一样,不过它是面向对象的。

    公共属性:

    HWnd     获取或设定消息的处理函数

    Msg       获取或设定消息的ID号

    Lparam   指定消息的LParam字段

    Wparam  指定消息的WParam字段

    Result    指定为响应消息处理函数而向OS系统返回的值

    2 消息驱动的过程

    所有的外部事件,如键盘输入、鼠标移动、按动鼠标都由OS系统转换成相应的消息发送到应用程序的消息队列。每个应用程序都有一段相应的程序代码来检索、分发这些消息到对应的窗体,然后由窗体的处理函数来处理。

    二、C#中的消息的封装

    C#对消息重新进行了面向对象的封装,在C#中消息被封装成了事件。

    System.Windows.Forms.Application类具有用于启动和停止应用程序和线程以及处理Windows消息的方法。 调用Run以启动当前线程上的应用程序消息循环,并可以选择使其窗体可见。调用Exit或ExitThread来停止消息循环。C#中用Application类来处理消息的接收和发送的。消息的循环是由它负责的。

    对于一个可视控件来说,是不断的在接受系统发送的消息的。比如鼠标悬停在某控件上,就是一个消息,移出这个控件又是一个消息。事件里编写的代码,和方法里写的代码,最主要的不同就在于前者是不知道何时触发,而后者是自己调用运行到那里就执行的。那谁来决定某个事件何时触发呢?那就是消息。

    在Form类中,有一个 protected override void DefWndProc(ref Message m)方法,该方法重写了Control中的DefWndProc方法,通过该方法,我们就能截获到Windows系统发送给Form的消息内容,其中m.Msg属性可以获得消息的id,用来分辨是哪个操作触发了消息.根据Message中的内容,就可以确定触发Form中哪个控件的哪个事件,从而完成整个事件的触发过程。

    参考资料:

    C#消息机制

    C#使用消息(SendMessage)进行跨进程操作

    SendMessage参数大全

  • 相关阅读:
    LeetCode:33. Search in Rotated Sorted Array
    重拾 ACM-HDU 2000-2009
    hdu 1022 数据结构 stack模拟
    画椭圆
    声控灯
    VC++调用R语言
    Setup Factory打包时注册com dll
    折腾树莓派的一些总结
    老调重弹
    制作cpprefernce.chm
  • 原文地址:https://www.cnblogs.com/arthur20101108/p/3159290.html
Copyright © 2011-2022 走看看