正如标题所指出的:窗口类的属性将影响所有由该窗口类创建的窗口。这就是它为什么称之为窗口类的原因。
我用这么多话来强调这一点,似乎是一件显而易见的事情,但我看到许多”解决方案”忽视了这个简单的事实。
在 WNDCLASS(或 WNDCLASSEX)中设置的所有属性都是窗口类属性,可以通过 Get/SetClassWord/Long/LongPtr 访问的属性也是如此。这意味着当你修改这些属性时,它们会影响整个窗口类。
举个例子,假设你写了下面的代码:
SetClassLongPtr(hwnd, GCLP_HCURSOR, (LONG_PTR)hcurNew);
那么你不只是在修改 HWND 指定的窗口的光标。你正在修改与 hwnd 相同类的所有窗口的光标。例如,如果 hwnd 是编辑控件,则你还会修改所有编辑控件的默认光标。
但是,如果你只想修改一个特定窗口的类属性而不是类的所有窗口,该怎么办?
如果要修改特定窗口的菜单、背景、光标或图标,可以基于每个窗口覆盖类默认值,如下图所示:
总结我们可以将窗口类看做一个制造窗口的模版,所有自该窗口类产生的窗口都具有相同的属性,修改了模版的属性,则所有窗口的属性都会发生变化。
有时候,这是好事,但我们必须了解其原理。
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Window class properties apply to all windows that belong to the class》