首页 > 代码库 > 窗口消息处理对象的传递

窗口消息处理对象的传递

在前面已经定义好窗口的消息处理类,虽然拥有处理能力了,但还没有放到回调函数里进行相应的调用,那还是达不到目标,还需要下面两个细节的处理,才可以嵌入到消息处理过程里。我们来顺着消息类的传递路径来进行分析它的具体过程,这样理解起来会更顺畅一些,更符常人的思维。具体的过程如下图所示:

从上图可以看到,使用Controller类来创建窗口处理消息的实例对象ctrl,然后把它传送给WinMaker的实例对象,也就是传送给创建窗口的函数Create,通过操作系统的创建窗口的消息WM_NCCREATE带给回调函数PyWndProc,在PyWndProc函数里响应消息WM_NCCREATE时,就把Controller类对象取出来,把它绑定到这个对应窗口里,这一步是通过WIN32API函数SetWindowLongW来实现的。以后所有窗口的消息,都会根据窗口的句柄来获取绑定到这个窗口处理的消息处理对象,而获取这个窗口消息处理类的对象是通过函数GetWindowLongW来获取的,这样后面就可以通过窗口消息处理类的函数MyWndProc来处理自己窗口需要处理的消息了。在这里可以看到,回调函数PyWndProc是提供给所有窗口进行消息处理的,但它根据窗口句柄来获取窗口的消息处理对象来处理各个窗口的消息。经过这样设计之后,就可以实现不同的窗口采用不同的类来处理消息,把相应的事件局限某一个窗口范围内,让处理窗口消息的代码更加清晰,维护性更好。


窗口消息处理对象的传递