Значение сообщения WM_SYSCOLORCHANGE - PullRequest
1 голос
/ 06 мая 2019

Из документации :

Сообщение 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 Ответ

2 голосов
/ 06 мая 2019

Это было важно в первые дни, когда дисплеи могли отображать только 256 цветов. (Или если ваша система загружается в безопасном режиме, когда Windows не может получить доступ к собственному режиму отображения истинного цвета.) Изменение цвета системы означало (потенциальное) изменение в палитре, поэтому приложениям придется настраивать, какой индекс цвета они будут использовать для нарисуй свои окна.

В наши дни, если вы измените цвет с (например) зеленого на синий, любое окно или элемент управления, использующий этот цвет RGB для рисования, необходимо уведомлять об обновленном цвете, чтобы он соответствовал новой цветовой схеме. Кисти, созданные с индексным цветом, таким как COLOR_3D_FACE или с помощью вызова GetSysColorBrush(), будут автоматически использовать новый цвет при следующем перерисовке.

Если вы вызываете CreateSolidBrush на основе системного цвета (GetSysColor()), вам нужно будет обновить кисть (воссоздать ее), когда вы получите сообщение WM_SYSCOLORCHANGE.

...