在MSDN网站上,我发现了以下内容:
使用GWLP_WNDPROC索引调用SetWindowLongPtr会创建一个 用于创建窗口的窗口类的子类。一个应用程序 可以子类化系统类,但不应该子类化窗口类 由另一个进程创建。 SetWindowLongPtr函数创建 window子类通过改变与a关联的窗口过程 特定窗口类,导致系统调用新窗口 程序而不是前一程序。申请必须通过任何申请 消息未由新窗口过程处理到前一个 通过调用CallWindowProc的窗口过程。这允许 应用程序来创建一系列窗口过程。
这是否意味着,每次我用SetWindowLongPtr
调用GWLP_WNDPROC
时,都会创建新的子类,或者如果相同的过程多次作为参数传递,Windows是否足够智能创建子类一次?
答案 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可以帮助您调用“基类”。推荐使用。