c - WM_SYSCOLORCHANGE 消息的含义

标签 c windows winapi gdi

来自 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/

相关文章:

wpf - 如何使用绑定(bind)设置 DataContext?

c++ - Win32 C++ 在类中创建窗口和过程

c++ - 如何用 C++ 为 Windows 编写屏幕保护程序?

c++ - 如何在 Ubuntu 上的 QT Creator 中运行 c/c++ 应用程序

c - 如何修复 mac 操作系统中的 [-Wreturn-type] 错误

windows - Windows 10 上的 Docker 卷

windows - 如何查找 Windows Azure 的应计账单费用

windows - 在 DisableProcessWindowsGhosting 之后,有没有办法重新打开 Windows 重影功能?

c - "fork()"后printf异常

c - 为什么两个函数相互递归调用的 C 程序在 Linux 上会出现段错误?