• 花点时间了解消息,句柄和窗口


    消息、句柄和窗口

    一,为什么我要花时间研究这些东西

      对于我个人来说我不想做码农,不想只知道拖控件,使用控件有的时候要了解一下底层,不知道你们有没有想过这样的一个问题,我们在C#中使用的的event事件是怎么触发这个事件呢?事件无非就是对委托的封装,在类内不管用public还是protected进行修饰,再类外都是private,只能在类外+=或者-=对事件进行注册或者注销。这能说明什么呢?这只能说明你已经将事件进行了绑定,说白了就是将方法的地址使用一种参数的形式进行了传递,从一个类传递到另一个类中,然后对这个方法进行实现。如果我们建一个Windows应用程序的时候,我们在重绘窗口是会复写函数Onpaint(),复写之后这个方法又是怎样进行控制的呢?

    二、原因何在?

      Windows应用程序是事件驱动的,也就是说,Windows应用程序将等待系统传递输入,然后,应用程序的对输入作出响应,将控件返回到系统上。系统和应用程序通过“Windows消息”通信。无论何时用户移动鼠标或者单击键盘时,系统就将消息发送到应用程序。应用程序有一个特殊的函数(称为“窗口过程”)处理所接受的信息,以使对用户的输入作出响应。这个函数传统上称WndProc(),一般不必这样称呼它。可是,用户交互作用并不只是创建应用程序要处理的消息,另一个示例是电源管理。恰好系统进入休眠模式之前,将消息发送到所有开放应用程序。如果应用程序并不准备进入休眠模式,他可以将消息发送回系统,说“此时不要进入睡眠模式”

      消息路由有两种类型。一种是将消息发送到称为消息队列的“先进先出”队列中。对于所创建的每个用户界面线程来说,有一个系统消息队列和一个特定线程队列。当用户移动鼠标是,相关信息放到系统消息队列中。系统检查该消息,以确定建议那个窗体处理该消息,然后将消息发送到窗口的WndProc()函数进行处理。鼠标和键盘消息就是排队消息的示例。路由消息的其他方式,系统将消息直接发送到窗口过程中。通常情况下会发送不排队消息通知直接影响窗口的事件。诸如重新设置大小以及窗口激活类的消息,将一部排队消息的形式发送。

      每个应用程序可能由几个窗体或者窗口组成。每个窗口都有一个窗口过程,来处理发送给它的消息。窗口过程将检查每条消息,确定对消息进行哪些处理工作。将消息发送到窗口过程的进程,称作“消息泵”。消息泵位于WinMain()函数中,二WinMain()是应用程序的入口点(类似于C#中的Main()方法)。消息有两种类型:系统定义的消息和应用程序定义的消息。系统定义的消息是系统预定义的消息。应用程序定义的消息当然由应用程序定义。为了标示消息,有四个参数与他一起发送

      1.窗口句柄

      2.消息标识符

      3.两个消息参数值,通常称作lParam和wParam

      窗口句柄是一个long型的值,用于操作系统标示特殊的窗口。所创建的每个窗口都有一个句柄与它相关联,这种句柄有时称作hWnd。hWnd是在创建该窗口时由系统产生的,只要该窗口不被销毁,它就保持为常量该消息所发送的句柄,是该消息窗口的句柄。

      消息标识符是一个标识消息内同的指定变量。所处理的常见消息是WM_PAINT消息。这是一个系统定义的消息,告诉该窗口它要重新绘制其自身。系统定义的消息分为30个不同的类别。每个类别都是由该消息的两个或者三个字符前缀定义的。就WM_PAINT消息而言,WM表示普通的窗口消息。其他类别包括用于编辑控件的EM、用于常用对话框的CDM,一集用于选项卡空间的TCM。每个消息标识符都是有一个在Windows SDK 中定义的相应符号标识符。

      lParam和wParam这两个消息参数几乎可以包含任何事物。他们可以包括位标志、整型值、对象引用、结构引用、对于回调函数的引用等。如果消息不使用参数,一般就将其设置为null。

     

     

  • 相关阅读:
    前端代码异常日志收集与监控
    基于window.onerror事件 建立前端错误日志
    MySQL数据类型和常用字段属性总结
    MySQL中char(36)被认为是GUID导致的BUG及解决方案
    dl,dt,dd,ul,li,ol区别
    泛型
    EF里Guid类型数据的自增长、时间戳和复杂类型的用法
    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
    EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/dwlsxj/p/Winform.html
Copyright © 2020-2023  润新知