非工作区

每当必须更新窗口的非工作区(如标题栏、菜单栏或窗口框架)的一部分时,系统会向窗口发送WM_NCPAINT消息。 系统还可以发送其他消息,以指示窗口更新其工作区的一部分;例如,当窗口变为活动或非活动状态时,它会发送 WM_NCACTIVATE 消息以更新其标题栏。 通常,不建议为标准窗口处理这些消息,因为应用程序必须能够绘制窗口的非工作区的所有必需部分。 出于此原因,大多数应用程序将这些消息传递给 DefWindowProc 进行默认处理。

为其窗口创建自定义非工作区的应用程序必须处理这些消息。 执行此操作时,应用程序必须使用窗口设备上下文在窗口中执行绘图。 窗口设备上下文使应用程序能够在窗口的所有部分(包括非工作区)中进行绘制。 应用程序使用 GetWindowDCGetDCEx 函数检索窗口设备上下文,绘图完成后,必须使用 ReleaseDC 函数释放窗口设备上下文。

系统维护非工作区的更新区域。 当应用程序收到 WM_NCPAINT 消息时, wParam 参数包含定义更新区域维度的区域句柄。 应用程序可以使用 句柄将更新区域与窗口设备上下文的剪辑区域组合在一起。 检索窗口设备上下文时,系统不会自动合并更新区域,除非应用程序使用 GetDCEx 并指定区域句柄和DCX_INTERSECTRGN标志。 如果应用程序不合并更新区域,则仅剪裁本来会扩展到窗口外部的绘图操作。 应用程序不负责清除更新区域,无论它是否使用该区域。

如果应用程序处理 WM_NCACTIVATE 消息,则处理后必须返回 TRUE 以指示系统完成活动窗口的更改。 如果在应用程序收到 WM_NCACTIVATE 消息时窗口最小化,则应将消息传递给 DefWindowProc。 在这种情况下,默认函数会重绘图标的标签。