WM_CTLCOLORSTATIC был правильным способом управления цветом заголовка группового блока.
Однако это больше не работает: если ваше приложение использует манифест для включения библиотеки comctl версии 6, элемент управления Groupbox больше не отправляет WM_CTLCOLORSTATIC
своему родителю для получения кисти. Если ваши диалоговые элементы управления выглядят некрасиво, квадратно и серо - как элементы управления Windows 95, то у вас не включены стили xp, и вы можете управлять цветом групповых блоков. Но это ужасная жертва! : P
Далее, большинство стандартных элементов управления отправляют WM_CTLCOLORxxx
сообщения своим родителям (диалогу) для управления их рисованием. Единственный способ идентифицировать элементы управления - это посмотреть их идентификаторы элементов управления. Вот почему назначение элементов управления идентификатора, который указывает, что этому элементу управления требуется определенный цвет или шрифт, является хорошей идеей. Т.е. не используйте IDC_STATIC
для элементов управления, которым нужен красный текст. Установите для них IDC_DRAWRED
или какой-нибудь выдуманный идентификатор.
Не используйте GetDlgItem(hwndDlg,IDC_ID) == hwndCtl
, чтобы проверить, является ли сообщение WM_CTLCOLOR
правильным элементом управления: GetDlgItem просто вернет дескриптор первого элемента управления в диалоговом окне с указанным идентификатором, что означает, что будет окрашен только один элемент управления.
case WM_CTLCOLORSTATIC:
if(GetWindowLong( (HWND)lParam, GWL_ID) == IDC_RED)
return MakeControlRed( (HDC)wParam );
Вам всегда * нужно возвращать HBRUSH из сообщения WM_CTLCOLORxxx - даже если вы действительно просто хотите «подделать» передаваемый HDC. Если вы не вернете правильную кисть из своего диалогового процесса, тогда окно диалогов Процедура будет думать, что вы вообще не обработали сообщение, и передаст его в DefWindowProc, который сбросит все сделанные вами изменения в HDC.
Вместо создания кистей в режиме ожидания в системе есть кеш кистей для рисования стандартных элементов пользовательского интерфейса: GetSysColorBrush
Конечно, вам НЕ всегда нужно возвращать ЕДУ. Если у вас включен стиль темы xp в вашем приложении, вам иногда разрешается возвращать нуль: - потому что диалоги темы xp имеют разноцветный фон (особенно на элементах управления вкладками), возвращая кисть syscolor, вы получите уродливые серые поля на более светлом фоне: - в этих конкретных случаях менеджер диалогов позволит вам вернуть ноль и НЕ сбрасывать ваши изменения в DC.