Контекст устройства. Работа с текстом. Диалоговое окно выбора цвета. Настройка режима отображения. Точечный рисунок. Класс CBitmap, страница 4

// установка выравнивания текста: горизонталь - по центру, вертикаль - по базовой линии

         dc.SetTextAlign ( TA_CENTER | TA_BASELINE );

         dc.TextOut ( L/2 , 15 , Title );                             // рисование заголовка в центре окна

         CRect TextRec;                                                   // параметры текстовой области

// вычисление параметров текстовой области

         TextRec.top        = H / 4 ;        TextRec.left    = L / 4 ;

         TextRec.bottom = 3 * H / 4 ;   TextRec.right  = 3 * L / 4 ;

         dc.SetBkColor ( crWhite ) ;                                 // установка цвета фона

         dc.SetTextColor ( crRed ) ;                                 // установка цвета текста

         dc.ExtTextOut ( L / 2 , H / 2 , ETO_OPAQUE | ETO_CLIPPED , &TextRec , Text , NULL ) ;

}

Цветовая система RGB

В зрительной системе человека существуют три типа цветовых рецепторов — колбочек. Каждый тип имеет свою зависимость чувствительности от длины световой волны. Максимумы этих кривых чувствительности располагаются в области красного, зелёного и синего цветов. Таким образом, мозг получает информацию о цвете в виде набора трёх сигналов, а не в виде непрерывной функции.

Подводя итог сказанному, получим основополагающий принцип трехкомпонентной теории цветовосприятия: если два цвета характеризуются одним и тем же набором первичных составляющих, они визуально неразличимы.

Прямым следствием принципа трехкомпонентной теории цветовосприятия является возможность сформировать любой цвет как сумму первичных компонентов: красного (Red), зелёного (Green) и голубого (Blue). Цветовое соответствие при этом выражается соотношением

         C = T1 R + T2 G + T3 B

В современных графических API стало возможным обеспечить правильную цветопередачу, причем аппаратно удается использовать алгоритмы аппроксимации, позволяющие достаточно приблизиться к полноценной RGB-модели отображения.

Концептуально в RGB-системе наложения цветов должны существовать три раздельных буфера кадра — по одному на каждый из первичных цветов. В каждом буфере за определенным пикселем на экране закреплен фиксированный адрес в памяти. В типовой системе, имеющей разрешение 1280╳1024 пикселей, каждый из них описывается тремя байтами (24 битами): по одному байту соответственно для красного, зеленого и синего цвета. В результате буфер кадра должен иметь объем порядка 3 Мбайт, причем весь буфер должен считываться с частотой регенерации.


В библиотеке MFC для хранения цвета определён тип COLORREF, который является синонимом беззнакового целого числа unsigned int. Доля каждого из основных цветов кодируется числом от 0 до 255 и хранится в трёх младших байтах. Четвёртый байт используется для служебных целей.

Для инициализации переменной, которая хранит цвет, удобно использовать как шестнадцатеричную систему исчисления, так и макрос RGB прототип которого имеет вид:

         COLORREF RGB ( BYTE red , BYTE green , BYTE blue) ;

Выражения для основных цветов в виде шестнадцатеричной константы и с помощью вызова макроса RGB будут иметь вид:

Чёрный                0x00000000                    RGB ( 0 , 0 , 0 )

Белый                  0x00FFFFFF                   RGB ( 255 , 255 , 255 )

Светло-серый      0x00E4E4E4                   RGB ( 232 , 232 , 232 )

Тёмно-серый       0x00A0A0A0                   RGB ( 160 , 160 , 160 )

Красный               0x000000FF                   RGB ( 255 , 0 , 0 )

Зелёный               0x0000FF00                   RGB ( 0 , 255 , 0 )

Синий                  0x00FF0000                   RGB ( 0 , 0 , 255 )

Жёлтый               0x0000FFFF                   RGB ( 255 , 255 , 0 )

Все цвета, которые имеют равные соотношения первичных компонентов, проявляются в виде оттенков серого цвета.

Разложить цвет на составляющие можно с помощью макросов GetRValue, GetGValue, GetBValue.

Диалоговое окно выбора цвета

Стандартное диалоговое окно Выбора цвета позволяет пользователю выбрать цвет из 48 цветов основной палитры, а также определить дополнительные цвета. Диалоговое окно имеет вид, показанный на рисунке.

Конструктор класса CColorDialog

Конструктор класса имеет следующий прототип: