来自 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 处理程序代码,我在控制面板中更改系统颜色,一切正常,背景被涂上新颜色。
那么为什么我需要这条消息?
问题
顶级窗口的这条消息是什么意思?
只转发这个消息给子窗口? 或者我错过了什么?
最佳答案
这在早期显示器只能显示 256 色时非常重要。 (或者如果您的系统在 Windows 无法访问 native 真彩色显示模式时以安全模式启动。)系统颜色更改意味着调色板中的(潜在)更改,因此应用程序必须调整它们将使用的颜色索引画出他们的 window 。
如今,如果您将一种颜色从(例如)绿色更改为蓝色,则需要将更新后的颜色通知给任何使用该 RGB 颜色进行绘制的窗口或控件,以使其符合新的配色方案。从索引颜色(如 COLOR_3D_FACE
)或通过调用 GetSysColorBrush()
创建的画笔将在下次重绘时自动使用新颜色。
如果您根据系统颜色 (GetSysColor()
) 调用 CreateSolidBrush
,您将需要在收到 WM_SYSCOLORCHANGE
消息。
关于c - WM_SYSCOLORCHANGE 消息的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56005908/