WM_SYSCOLORCHANGE 消息的含义

Meaning of the WM_SYSCOLORCHANGE message

来自documentation

WM_SYSCOLORCHANGE message is sent to all top-level windows when a change is made to a system color setting.

Applications that have brushes using the existing system colors should delete those brushes and re-create them using the new system colors.

声明全局变量

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 处理程序代码,我在控制面板中更改了系统颜色,一切正常,背景被涂上了新颜色。

为什么我需要这条消息?

问题

这条消息对于 top-level window 是什么意思?

仅将此消息转发给 child windows? 或者我错过了什么?

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

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

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