Это GetRVaIue(rgb), GetGValue(rgb), GetBValue(rgb).
Ниже приводиться фрагмент кода, определяющий цветовые компоненты точки:
COLORREF color;
int r, g, h;
color = GetPixel (hdc, 0,0); // цвет точки в начале координат в форматеCOLORREF
r = GetRValue(color); // интенсивность красной компоненты
g = GetGValue(color); // интенсивность желтой компоненты
b = GctBValue(color); // интенсивность голубой компоненты
5.7.2 Рисование линий
5.7.2.1 Позиция пера
Перед рисованием линий очень часто возникает необходимость установить перо в заданную позицию. Для этой целиможно использовать функциюMoveToEx.
BOOL MoveToEx(
HDC hdc, II контекст отображения
int X, // х-координата новой позиции пера
int У, //у-координата новой позиции пера
LPP0INT IpPoint //адрес структуры для записи предыдущей позиции пера
);
В структуру типаLPP0INT, на которую указывает IpPoint, после возврата из функции записываются старые координаты пера. Пример фрагмента кода:
LPP0INT pos;
int х. у;
MoveToEx(hdc, 10, 10, pos); // помещаем перо в точку с координатами (10, 10)
х = pos.x; II старая х - координата пера
у = pos.y, II старая у - координата пера
Рисование прямой линии
Для рисования прямой линии используйте функцию:
BOOL LineTo(
HDC hdc, II контекст отображения
int nXEnd, II координата X конца линии
lot nYEnd II координата Y конца линии
);
Функция рисует прямую с началом в текущей позиции пера и концом в точке nXEnd, nYEnd. Перед рисованием прямой необходимо с помощью функции MoveToEx установить перо в начальную позицию.
5.7.2.3 Рисование ломаной линии
Нарисовать ломаную линию можно с помощью функцииPolyLine, прототип этой функции:
BOOL Polyline(
HDC hdc, II контекст отображения
CONST POINT *Ippt, II указатель на массив структур POINT
int cPoints II размер массива
);
Пример:
POINT CoordPolyLine[3];
CoordPolyLine[0]. х = 10; CoordPulyline[0].у = 10;
CoordPolyLine[1].x = 20; CoordPoIyLine[1].у = 25,
CoordPolyLine[2].х = 20; CoordPolyLine[2].у = 55;
PolyLine (hdc, CoordPolyLine,3);
Рисование дуги эллипса
Это единственная функция GDI позволяющая рисовать кривые высокого порядка.
BOOL Arc (
HDC hdc II дескриптор контекста отображения
int nxLeft,int nyTop, II координаты верхнего левого угла
int nxRighl.int nyliotlom, II координаты правого нижнегоугла
int nxSlcirl,Int nySlurl, II координаты начала дуги
Int nxEnd,Int nyEnd II координаты конца дуги
);
Рисунок 5.4. Дуга эллипса.
На рис. 5.4 представлены все необходимые пояснения к параметрам функции Arc. Дуга рисуется против часовой стрелки. Координаты центра эллипса, при необходимости можно вычислить по очевидным формулам:
хС •= (nxLeft + nxRiRht)/2:
уС = (nyTop + пуВо11от)/2;
5.7.2.5 Настройка атрибутов контекста отображения для рисования линий
При рисовании линий настройка атрибутов отображения сводится к выбору пера и его цвета. Можно выбрать одно из встроенных перьев с помощью функции GettStockPen (см. HELP), а можно и создать собственное, используя функцию, прототип которой приведен ниже:
HPEN CreatePen (
int fnPenSlyle, II стиль пера
int nWidth, II ширина пера
COLORREF clrref // цвет пера
);
Параметр fnPenStyle может принимать следующие значения:
Стиль линии | Внешний вид | Описание |
PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_DASHDOTDOT PS_NULL PS_INSIDEFRAME | ______________ – – – – – – – – …………………… – . – . – . – . – .– .– _______________ | Сплошная Штриховая Пунктирная Штрихпунктирная, одна точка на одну линию Штрихпунктирная, две точки на одну линию Невидимая |
Единицы измерения для параметра nWidfh зависят от режима отображения. Это могут быть пикселы, миллиметры и дюймы. Но линии типа PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT могут быть толщиной только 1 пиксел. Для рисования таких линий произвольной толщины служит функция LineDDA (см. HELP). Разница в стилях PS_SOLID и PS_INSIDEFRAME показана на рис. 5.5 Концы толстых линий Windows рисует закругленными, так, как это показано на рис. 5.5. При необходимости нарисовать толстую линию с прямыми углами, придется воспользоваться функцией рисования закрашенного прямоугольника. Невидимое перо необходимо для рисования замкнутых закрашенных фигур, когда контур не должен быть виден. Похожий результат можно получить при рисовании контура тем же цветом, что и цвет заполнения этой фигуры. После создания пера, его необходимо выбрать в контекст отображения с помощью макрокоманды SeIectPen, а затем рисовать с использованием функций MoveToEx и LineTo. |
Рисунок 5.5. Стили PS_SOLID и PS_INSIDEFRAME |
После окончания рисования созданным Вами пером, строго необходимо его удалить, с помощью макрокоманды DeletePen при этом освобождается память. Отсутствие удаления пера после его использования, очень опасная ошибка, приводящая, в конце концов, к краху системы!
Перед удалением пера, следует выбрать в контекст отображения одноиз встроенных перьев (например, то, которое использовалось раньше). Не забывайте, что Windows - мультизадачная система. Не сделав выбор в контекст пера, используемого ранее, Вы можете навредить другому приложению!
Нельзя удалять перо, выбранное в контекст отображения!
Нет никакого смысла в удалении встроенных перьев!
Использование макрокомандSelectPen и DeletePen , будет показано ниже на примерах.
Выбор режима фона
Режим фона имеет смысл устанавливать при рисовании пунктирных и штрихпунктирных линий. Существует два режима:
OPAQUE - непрозрачный режим (действует по умолчанию) TRANSPARENT - прозрачный режим
В режиме OPAQUE промежутки пунктирных линий за-крашиваются цветом, выбранным в контекст отображения. В режиме TRANSPARENT промежутки не закрашиваются (рис. 5.6.). Чтобы выбрать в контекст отображения цвет фона, необходимо использовать функциюSetBkColor: COLORREF SetBkColor (HDChdc,COLORREFclrref)', Для установки режима фона предназначена функция SetbkMode: int SetDkMode (11DC hdc, int fnBkMode)-, Парамсчр fnBkMode может принимать одно из двух значений, или OPAQUE илиTRANPARENT. |
Рисунок 5.6. Режимы OPAQUE и TRANSPARENT |
Дата добавления: 2017-01-26; просмотров: 1718;