【问题标题】:WinAPI SetWindowLongPtr - Changing windowProcWinAPI SetWindowLongPtr - 改变 windowProc
【发布时间】:2016-05-25 09:52:07
【问题描述】:

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

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

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

【问题讨论】:

  • 窗口子类不是真实的东西,它只是我们谈论的一个概念,因为它比谈论改变窗口过程更容易。
  • 所以它实际上并没有调用RegisterClass之类的东西?
  • 不,它没有。它所做的只是更改窗口的窗口过程,正如您对名称所期望的那样。

标签: c++ windows winapi


【解决方案1】:

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

1983 年是软件开发的重要一年,那是面向对象编程开始腾飞的时候。那时 Bjarne Stroustrup 将他的“C with Classes”重命名为 C++。当施乐向任何想要一份副本的人发布他们的 Smalltalk-80 实现时。鉴于 Smalltalk 专注于消息传递,它很可能对 Windows 设计人员产生了强烈的启发。

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

因此,使用 RegisterClass() 注册的类的“子类”只会覆盖 lpfnWndProc 函数。您使用 SetWindowLongPtr() 执行此操作,您必须自己带来新功能。您必须像在 C++ 程序中覆盖虚函数时通常那样调用“基”函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多