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处理程序代码,我在控制面板中更改系统颜色,一切也正常工作,背景用新颜色绘制。
那我为什么需要此消息?
问题
此消息对顶级窗口的含义是什么?
仅将此消息转发到子窗口? 还是我错过了什么?
答案 0 :(得分:2)
这在早期显示器只能显示256色时很重要。 (或者,当Windows无法访问本机真彩色显示模式时,如果系统在安全模式下启动。)系统颜色更改意味着调色板中的(潜在)更改,因此应用程序必须调整其将使用的颜色索引画他们的窗户。
这几天,如果您将颜色从(例如)绿色更改为蓝色,则需要将使用该RGB颜色进行绘制的任何窗口或控件通知更新后的颜色,以使其符合新的配色方案。由索引颜色如COLOR_3D_FACE
或通过调用GetSysColorBrush()
创建的笔刷将在下一次重绘时自动使用新颜色。
如果您根据系统颜色(CreateSolidBrush
)调用GetSysColor()
,则在收到WM_SYSCOLORCHANGE
消息时需要更新画笔(重新创建它)。