实例子类

【勇芳软件工作室】汉化HomePreviousNext

应用程序通过使用SetWindowLong功能对窗口的实例进行子类化。应用程序将GWL_WNDPROC标志,窗口的句柄传递给子类,将子类过程的地址传递给SetWindowLong.子类过程可以驻留在应用程序的模块或动态链接库(DLL)中。应用程序必须在应用程序或DLL的模块定义(.DEF)文件的EXPORTS语句中列出子类过程的名称。

SetWindowLong返回窗口原始窗口过程的地址。应用程序必须保存地址,并在随后调用CallWindowProc函数时使用该地址,将截取的消息传递到原始窗口过程。应用程序还必须具有原始窗口过程地址,以从窗口中删除子类。要删除子类,应用程序再次调用SetWindowLong,通过GWL_WNDPROC标志和窗口的句柄传递原始窗口过程的地址。

应用程序可以对系统中的任何窗口进行子类化;然而,当对不属于它的窗口进行子类化时,应用程序必须确保子类过程不会破坏窗口的原始行为。因为应用程序不能控制窗口,它不能取决于所有者将来可能更改的窗口的信息。

应用程序不应该使用窗口的额外的窗口字节或类字节,而不知道字节是什么意思,以及原始窗口过程如何使用它们。即使如此,应用程序不应该使用它们,除非它拥有窗口。如果应用程序使用另一个应用程序拥有的窗口的额外窗口字节,并且所有者更改了额外字节的某些方面,则子类过程可能会失败。因此,应用程序不应该对属于系统全局控件类的窗口进行子类化。Windows拥有系统全局类,控件的各个方面可能会从一个版本的Windows更改为下一个版本。如果应用程序必须对属于系统全局类的窗口进行子类化,则在新版本的Windows被释放时,开发人员可能需要更新该应用程序。

因为实例子类发生在创建窗口之后,子类化窗口的应用程序不能向窗口添加任何额外的字节。窗口子类的应用程序应该使用窗口的属性列表来存储子类窗口实例所需的任何数据。有关详细信息,请参阅窗口属性.

当一个应用程序子类化一个子类窗口时,它必须按照它们执行的相反顺序删除子类。如果删除顺序不被反转,则可能会发生不可恢复的系统错误。