非client 区域
每当窗口的非工作区(如标题栏、菜单栏或窗口框架)的一部分必须更新时,系统都会向窗口发送 WM_NCPAINT 消息。 系统还可以发送其他消息,以指示窗口更新其工作区的一部分;例如,当窗口变为活动或非活动状态时,它会发送 WM_NCACTIVATE 消息来更新其标题栏。 通常,不建议为标准窗口处理这些消息,因为应用程序必须能够为窗口绘制非工作区的所有必需部分。 因此,大多数应用程序将这些消息传递给 DefWindowProc 进行默认处理。
为其窗口创建自定义非client 区域的应用程序必须处理这些消息。 执行此作时,应用程序必须使用窗口设备上下文在窗口中执行绘图。 窗口设备上下文 使应用程序能够绘制窗口的所有部分,包括非工作区。 应用程序使用 GetWindowDC 或 GetDCEx 函数检索窗口设备上下文,并且绘图完成后,必须使用 ReleaseDC 函数释放窗口设备上下文。
系统维护非工作区的更新区域。 当应用程序收到 WM_NCPAINT 消息时,wParam 参数包含定义更新区域维度的区域句柄。 应用程序可以使用句柄将更新区域与窗口设备上下文的剪辑区域组合在一起。 除非应用程序使用 GetDCEx 并指定区域句柄和DCX_INTERSECTRGN标志,否则检索窗口设备上下文时,系统不会自动合并更新区域。 如果应用程序未合并更新区域,则只会剪裁窗口外扩展的绘图作。 应用程序不负责清除更新区域,而不考虑它是否使用该区域。
如果应用程序处理 WM_NCACTIVATE 消息,在处理后,它必须返回 true,以指示系统完成活动窗口更改。 如果应用程序收到 WM_NCACTIVATE 消息时将窗口最小化,则应将消息传递给 defWindowProc 。 在这种情况下,默认函数将重绘图标的标签。