Как изменить стандартные цвета edit box'а?

Автор: Игорь Вартанов
Опубликовано: 17.07.2001
Версия текста: 1.0

Демонстрационный проект EditClr

Для изменения стандартных цветов контролов в Windows имеется механизм, основанный на посылке контролу сообщения семейства WM_CTLCOLORxxx перед его отрисовкой. Для окна редактирования это будет сообщение WM_CTLCOLOREDIT. В обработчик этого сообщения передается хэндл контекста контрола, в котором можно произвести необходимые настройки цвета текста, цвета фона текста и режима прозрачности фона текста (не стоит забывать и о возможности установки нужного шрифта). По окончании обработки сообщения обработчик обязан вернуть хэндл кисти, которой будет закрашен фон всего окна контрола.

case WM_CTLCOLOREDIT:
    if( IDC_CLREDIT == GetDlgCtrlID( (HWND) lParam ) )
    {
        // Зеленый текст на черном фоне
        HDC dc = (HDC) wParam;
        SetBkMode( dc, TRANSPARENT );
        SetTextColor( dc, RGB( 0, 255, 0) );
        return (BOOL) GetStockObject( BLACK_BRUSH );
    }
    return FALSE;

Как видим, возможности настройки внешнего вида контрола очень широки. Однако, необходимо быть внимательным, чтобы добиться желаемого результата. Окно может иметь весьма непривлекательный вид, если режим фона текста установлен непрозрачным (а именно таков он по-умолчанию в передаваемом через wParam контексте), и использованы разные цвета фона текста и фона контрола. Второй неприятный эффект - совпадение цвета текста и цвета фона, в результате чего текст будет невозможно прочесть (хотя в особых ситуациях этот прием может быть полезен для временного сокрытия текста в окне редактирования).

Если же мы правильно произвели настройку контекста и кисти, результаты будут отличными (в меру способностей, конечно). Чаще всего для закрашивания фона контрола используется сплошная кисть, хотя, при желании, можно в качестве кисти использовать кисть на основе битмапа, содержащего некое изображение, к примеру логотип вашей фирмы. Разумеется, рисунок должен позволять пользователю без напряжения читать текст в окне.

Необходимо помнить, что объект GDI "кисть", хэндл которого возвращается обработчиком, должен существовать все время, пока существует окно редактирования. Обычно кисть создается при инициализации окна (или диалога), и уничтожается при его разрушении. Сказанное в равной мере касается и прочих объектов GDI (шрифтов, битмапов и проч.), использованных для настройки внешнего вида окна редактирования.

Все приемы, описанные выше, продемонстрированы в примере EditClr.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.