消息、句柄和窗口
一,为什么我要花时间研究这些东西
对于我个人来说我不想做码农,不想只知道拖控件,使用控件有的时候要了解一下底层,不知道你们有没有想过这样的一个问题,我们在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。