在MSDN网站上,我发现了以下内容:
使用GWLP_WNDPROC索引调用SetWindowLongPtr将创build用于创build窗口的窗口类的子类。 应用程序可以inheritance一个系统类,但是不应该inheritance由另一个进程创build的窗口类。 SetWindowLongPtr函数通过更改与特定窗口类关联的窗口过程来创build窗口子类 ,从而导致系统调用新窗口过程而不是先前窗口过程。 应用程序必须通过调用CallWindowProc将任何未由新窗口过程处理的消息传递给前一个窗口过程。 这允许应用程序创build一系列的窗口过程。
这是否意味着,每次我调用带有GWLP_WNDPROC
SetWindowLongPtr
时,都会创build新的子类,或者如果相同的过程作为参数多次传递,那么Windows是否足够聪明地创build子类一次?
“亚类”一词在winapi中是概念性的。 它最初是在1983年设计的,目标是C语言。 当然,这对课程没有任何支持。
1983年是软件开发的重要一年,那时面向对象的编程开始走上正轨。 那时Bjarne Stroustrup把他的“C with Classes”改名为C ++。 当施乐向任何想要拷贝的人发布他们的Smalltalk-80实现。 鉴于Smalltalk对消息传递的关注,它很可能是Windows设计人员的强烈的鼓舞。
所以虽然winapi不可能是纯粹的反对意见,但它肯定有一个技术的味道。 RegisterClass()函数是最明显的,就像一个基类一样,使得从该类创建的任何窗口“对象”具有相同的行为。 用WNDCLASS.lpfnWndProc指定的窗口过程就像一个可以被覆盖的虚拟方法。
因此,用RegisterClass()注册的类的“子类”仅覆盖lpfnWndProc函数。 你用SetWindowLongPtr()来做到这一点,你必须自己带上新的功能。 您必须调用“基本”函数,就像在C ++程序中重写虚函数时一样。
不是唯一的方法来做到这一点。 SubWindowSubclass()函数是一个辅助函数,它是正确的。 DefSubclassProc()函数可以帮助你调用“基类”。 推荐的。