WM_SYSCOLORCHANGE消息的含义

时间:2019-05-06 13:07:57

标签: c windows winapi gdi

来自documentation

  

WM_SYSCOLORCHANGE消息在以下情况下发送到所有顶级窗口:   更改了系统颜色设置。

     

使用现有系统颜色进行画笔的应用程序应   删除这些笔刷,然后使用新的系统颜色重新创建它们。

声明全局变量

HBRUSH g_hBackground = NULL;

在WM_CREATE消息处理程序中创建背景画笔

case WM_CREATE:
g_hBackground = (HBRUSH)(COLOR_3DFACE + 1);
break;

在画笔信息中使用画笔

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &rcClient, g_hBackground);
EndPaint(hwnd, &ps);
break;

处理系统颜色变化

case WM_SYSCOLORCHANGE:
if (g_hBackground)
{
    DeleteObject(g_hBackground);
}

g_hBackground = (HBRUSH)(COLOR_3DFACE + 1);
break;

现在,我在控制面板中更改系统颜色,一切正常,背景以新颜色绘制。

删除所有WM_SYSCOLORCHANGE处理程序代码,我在控制面板中更改系统颜色,一切也正常工作,背景用新颜色绘制。

那我为什么需要此消息?

问题

此消息对顶级窗口的含义是什么?

仅将此消息转发到子窗口? 还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

这在早期显示器只能显示256色时很重要。 (或者,当Windows无法访问本机真彩色显示模式时,如果系统在安全模式下启动。)系统颜色更改意味着调色板中的(潜在)更改,因此应用程序必须调整其将使用的颜色索引画他们的窗户。

这几天,如果您将颜色从(例如)绿色更改为蓝色,则需要将使用该RGB颜色进行绘制的任何窗口或控件通知更新后的颜色,以使其符合新的配色方案。由索引颜色如COLOR_3D_FACE或通过调用GetSysColorBrush()创建的笔刷将在下一次重绘时自动使用新颜色。

如果您根据系统颜色(CreateSolidBrush)调用GetSysColor(),则在收到WM_SYSCOLORCHANGE消息时需要更新画笔(重新创建它)。