WinAPI SetWindowLongPtr - 更改windowProc

时间:2016-05-25 09:52:08

标签: c++ windows winapi

MSDN网站上,我发现了以下内容:

  

使用GWLP_WNDPROC索引调用SetWindowLongPtr会创建一个   用于创建窗口的窗口类的子类。一个应用程序   可以子类化系统类,但不应该子类化窗口类   由另一个进程创建。 SetWindowLongPtr函数创建   window子类通过改变与a关联的窗口过程   特定窗口类,导致系统调用新窗口   程序而不是前一程序。申请必须通过任何申请   消息未由新窗口过程处理到前一个   通过调用CallWindowProc的窗口过程。这允许   应用程序来创建一系列窗口过程。

这是否意味着,每次我用SetWindowLongPtr调用GWLP_WNDPROC时,都会创建新的子类,或者如果相同的过程多次作为参数传递,Windows是否足够智能创建子类一次?

1 个答案:

答案 0 :(得分:6)

术语“子类”在winapi中是概念性的。它最初是在1983年设计的,目标是C语言。当然,这对课程没有任何支持。

1983年是软件开发的重要一年,当面向对象的编程开始出现时。就在那时,Bjarne Stroustrup将他的“C with Classes”重命名为C ++。当Xerox将Smalltalk-80实施发布给任何想要副本的人时。鉴于Smalltalk专注于消息传递,它可能是Windows设计者的强大灵感。

因此,尽管winapi不能完全以反对为导向,但它肯定会对这项技术有所了解。 RegisterClass()函数最为明显,就像一个基类,它为从该类创建的任何窗口“对象”提供相同的行为。使用WNDCLASS.lpfnWndProc指定的窗口过程就像一个可以被覆盖的虚方法。

因此,使用RegisterClass()注册的类的“子类”仅覆盖lpfnWndProc函数。你用SetWindowLongPtr()做到这一点,你必须自己带来新功能。您必须像在C ++程序中覆盖虚拟函数时通常那样调用“基本”函数。

不是唯一的方法。 SubWindowSubclass() function是帮助它正确的帮助函数。 DefSubclassProc() function可以帮助您调用“基类”。推荐使用。