
- •Управление курсором при редактировании текста
- •Задание 3. Реализация процесса управления курсором при редактировании
- •Подведение итогов
- •Глава 10. Интерфейс графических устройств
- •Контексты устройств и объекты gdi
- •Объекты контекста устройства и выбор инструментов рисования
- •Идентификаторы стандартных инструментов рисования
- •Создание инструментов рисования
- •Некоторые стили пера
- •Значения, передаваемые в макрос rgb() для генерации стандартных чистых цветов vga
- •Режим отображения
- •Установка графических атрибутов
Значения, передаваемые в макрос rgb() для генерации стандартных чистых цветов vga
Цвет, доступный в режиме VGA |
Значения bRed, bGreen и bBlue кодов RGB |
Темно-красный (dark red) |
128, 0, 0 |
Светло-красный (light red) |
255, 0, 0 |
Темно-зеленый (dark green) |
0, 128, 0 |
Светло-зеленый (light green) |
0, 255, 0 |
Темно-синий (dark blue) |
0, 0, 128 |
Светло-синий (light blue) |
0, 0, 255 |
Темно-желтый (dark yellow) |
128, 128, 0 |
Светло-желтый (light yellow) |
255, 255, 0 |
Темно-бирюзовый (dark cyan) |
0, 128, 128 |
Светло-бирюзовый (light cyan) |
0, 255, 255 |
Темно-сиреневый (dark magenta) |
128, 0, 128 |
Светло-сиреневый (light magenta) |
255, 0, 255 |
Черный (black) |
0, 0, 0 |
Темно-серый (dark gray) |
128, 128, 128 |
Светло-серый (light gray) |
192, 192, 192 |
Белый (white) |
255, 255, 255 |
Перу присваивается только чистый цвет. Если присвоить перу цветовой код, который не относится ни к одному из чистых цветов, то линия будет нарисована с использованием ближайшего чистого цвета. Исключение из этого правила существует в случае, если перо имеет стиль PS_INSIDEFRAME и ширину более 1 пиксела, тогда Windows использует полутона, если присвоенный цвет не является чистым.
Кисть можно инициализировать так, чтобы она окрашивала однородным цветом внутреннюю область фигур. Для этого вызовите функцию CBrush::CreateSolidBrush() с параметром crColor, описывающим цвет заливки. Можно задать любой цвет. Если присвоенный цвет не является чистым, то Windows генерирует псевдополутоновой цвет, полученный имитацией полутонов. Прототип функции определен таким образом:
BOOL CBrush::CreateSolidBrush (COLORREF crColor);
Кроме того, для заливки внутренней области фигур можно инициализировать кисть, вызвав функцию CreateHatchBrush() класса CBrush.
BOOL CBrush::CreateHatchBrush (int nIndex, COLORREF crColor);
Параметр nIndex задает тип штриховки в соответствии с рис. 10.3. Параметр crColor описывает цвет линий штриховки.
Рис. 10.3. Значения, которые присваиваются параметру nIndex функции CBrush::CreateHatchBrush() для инициализации кисти со штриховкой
Функция CBrush::CreatePatternBrush() вызывает кисть для заполнения фигуры заданным узором.
BOOL CBrush::CreatePatternBrush (CBitmap* pBitmap);
Параметр pBtimap является указателем на объект растрового изображения. Если фигура рисуется с помощью кисти, то ее внутренняя область полностью заполняется копиями растрового изображения, размещаемыми одна возле другой. Задайте размер растрового изображения равным 8 8 пикселов. Если растровое изображение монохромное, то Windows использует текущие цвета текста и фона.
Как только перо или кисть инициализированы, их выбирают в объекте контекста устройства с помощью функции CDC::SelectObject(). Прототип функции для выбора объекта перо в объекте контекста устройства такой:
CPen* CDC::SelectObject( CPen* pPen ); //выбор пера
где pPen — указатель на объект-пера. Функция CDC::SelectObject() возвращает указатель на предыдущий объект пера, выбранный в объекте контекста устройства. Если перо ранее не выбиралось, это будет временный объект пера, заданный по умолчанию.
Для выбора объекта кисти вызывается функция с таким прототипом:
CBrush* CDC::SelectObject (CBrush* pBrush); //выбор кисти
где pBrush — указатель на объект-кисть. Функция CDC::SelectObject() возвращает указатель на ранее выбранный объект кисть. Если она ранее не выбиралась, то это будет временный объект для заданной по умолчанию кисти.
Для выбора объекта шрифта используется функция с таким прототипом:
CFont* CDC::SelectObject( CFont* pFont ); //выбор шрифта
где pFont — указатель на объект шрифта. Функция CDC::SelectObject() возвращает указатель на ранее выбранный объект шрифт. Если шрифт ранее не выбирался, то выбранный объект будет временным для заданного по умолчанию шрифта.
Выбор растрового изображения выполняется с помощью функции, имеющей следующий прототип:
CBitmap* CDC::SelectObject( CBitmap* pBitmap);//выбор рисунка
Аналогично предыдущим версиям функции выбора объектов pBitmap — указатель на объект растрового изображения.
Для выбора области отсечения необходимо в функцию выбора передать указатель на объект региона.
int CDC::SelectObject( CRgn* pRgn ); //выбор области отсечения
Перед завершением программы объекты GDI необходимо удалять, предварительно отсоединив их от объекта контекста устройства. GDI-объект, который вы забыли отсоединить, может занимать значительный объем памяти. Удаления GDI-объектов выполняется деструкторами производных от CGdiObject классов или функцией CGdiObject::DeleteObject().
BOOL CGdiObject::DeleteObject( );
Однако, не отсоединив объект GDI от объекта контекста устройства, невозможно его удалить. Для отсоединения объекта GDI от объекта контекста устройства используется та же функция CDC::SelectObject(). Дело в том, что функция CDC::SelectObject() выбирает GDI-объекты в объект контекста устройства и возвращает указатель на объект, который был выбран в контекст раньше и теперь отсоединен. Поскольку нельзя отсоединить старый объект, не выбрав в контекст новый, то необходимо сохранить возвращаемый функцией CDC::SelectObject() указатель на первоначальный объект GDI при выборе нового объекта в контексте устройства. После вызова графических функций для отображения выводимой информации с использованием созданных пера или кисти необходимо восстановить первоначальный объект GDI, передав в качестве аргумента в функцию CDC::SelectObject() указатель на первоначальный объект. Удаление объектов GDI выполняется функцией, определенной таким образом:
BOOL CGdiObject::DeleteObject();
Перо или кисть необходимо удалить из объекта контекста устройства, чтобы последний не хранил некорректный дескриптор после удаления объекта. При инициализации пера или кисти Windows добавляет дескриптор, сохраняемый внутри объекта. При выборе пера или кисти объект контекста устройства также сохраняет этот дескриптор. Когда объекты выходят за пределы области видимости или удаляются, деструктор объекта уничтожает дескриптор. Однако этот шаг не нужно выполнять, если объект контекста устройства удаляется до удаления объекта пера или кисти.
Пример функции OnDraw() класса представления иллюстрирует описанные действия.
void CMyView::OnDraw(CDC* pDC) { CBrush NewBrush; //объявить объект кисть CPen NewPen; //объявить объект перо CBrush *PtrOldBrush; //сохранить указатель на предыдущую //кисть CPen *PtrOldPen; //сохранить указатель на предыдущее перо //инициализировать сплошное синее перо шириной 3 пикселя NewPen.CreatePen (PS_SOLID, 3, RGB (0, 0, 255)); //инициализировать сплошную желтую кисть NewBrush.CreateSolidBrush (RGB (255, 255, 0)); //передать перо объекту контекста устройства PtrOldPen = pDC->SelectObject (&NewPen); //передать кисть объекту контекста устройства PtrOldBrush = pDC->SelectObject (&NewBrush); //установить любые требуемые атрибуты рисования ... //вызвать функции рисования для создания графического вывода //(линии и границы будут синими, внутренняя площадь фигур //будет желтой); //удалить новые перо и кисть из объекта контекста устройства: pDC -> SelectObject (PtrOldPen); pDC -> SelectObject (PtrOldBrush); NewPen.DeleteObject(); Newbrush.DeleteObject(); }
Для выполнения графического вывода в окно представления или другое окно используют функции рисования класса CDC. Перечень некоторых функций мы рассмотрим в параграфе «Создание графических изображений». Но прежде познакомимся с эффектами различных режимов отображения координат.