Для отображения одного пиксела можно воспользоваться функцией GDI SetPixel:
rgbTrueColor = SetPixel (hDC, x, y, rgbColor);
Первый параметр данной функции содержит индекс контекста устройства. Второй и третий параметры определяют координаты пиксела (в логических координатах). Четвертый параметр задает RGB-цвет отображаемого пиксела, эту величину можно получить при помощи макроопределения RGB:
rgbColor = RGB (byRed, byGreen, byBlue);
Заметим, что так как устройства отображения поддерживают ограниченное число цветов, то функция SetPixel отображает точку цветом, наиболее близким к rgbColor, который поддерживается устройством отображения. При этом функция SetPixel возвращает величину RGB-цвета, которым в действительности отображается точка.
Приложение может определить цвет точки с данными координатами. Для этого используют функцию GetPixel:
rgbPixelColor = GetPixel (hDC,x,y);
Первый параметр функции определяет индекс контекста устройства, а второй и третий – координаты пиксела.
Для изменения начальной позиции пера используют функцию MoveTo:
MoveTo (hDC,x,y);
Координаты текущей позиции пера, определенные в контексте устройства, можно получить при помощи функции GetCurrentPosition:
DWORD dwPoint;
dwPoint = GetCurrentPosition (hDC);
При этом в младшем слове переменной dwPoint содержится x-координата, а в старшем слове – y- координата текущей позиции пера.
Таким образом, для рисования прямой линии из точки с координатами (xBegin, yBegin) в точку с координатами (xEnd, yEnd) функции MoveTo и LineTo нужно использовать вместе:
MoveTo (hDC, xBegin, yBegin);
LineTo (hDC,xEnd, yEnd);
Для отрисовки ломаной линии следует использовать функцию PolyLine:
PolyLine (hDC, &ptArray, number);
Первый параметр функции содержит индекс контекста устройства, второй – адрес массива точек, которые будут поочередно соединены отрезками прямых, а третий – число определенных в массиве точек.
Результат работы функции PolyLine аналогичен одному вызову функции MoveTo (для первого элемента массива ptArray) и последующим number-1 вызовам функции LineTo (для остальных элементов массива ptArray), за исключением того, что функция PolyLine не меняет текущую позицию пера и выполняется быстрее. Текущую позицию пера изменяют только функции MoveTo и LineTo.
Последняя рассматриваемая GDI функция, отображающая линию – это функция Arc:
Arc (hDC, xLeft, yTop, xRight, yButtom, xBegin, yBegin, xEnd, yEnd);
Эта функция рисует дугу эллипса. Эллипс задается прямоугольником, в который он вписан. Прямоугольник определяется верхним левым (xLeft, yTop) и правым нижним (xRight, yButtom) углами. Дуга строится против часовой стрелки от точки пересечения эллипса с прямой, соединяющей центр эллипса с точкой (xBegin, yBegin), до точки пересечения эллипса с прямой, соединяющей центр эллипса с точкой (xEnd, yEnd):
xLeft xEnd xRight
yEnd
yTop
xBegin
yBegin
yBottom
Рис. Отрисовка дуги эллипса
Для функций, отображающих линии, Windows использует перо, выбранное в данный момент в контексте отображения. Перо может иметь различный цвет, ширину, структуру. По умолчанию в контексте устройства установлено перо, рисующее тонкие сплошные линии черного цвета (оно называется BLACK_PEN). Кроме того существует еще два стандартных пера – WHITE_PEN и NULL_PEN. Перо WHITE_PEN рисует тонкие сплошные белые линии, а перо NULL_PEN при его использовании ничего не изменяет на рисунке.
Если вы хотите изменить перо, используемое в контексте устройства, на другое стандартное перо (WHITE_PEN или NULL_PEN), то надо сначала получить индекс стандартного пера, вызвав функцию GetStockObject:
HPEN hPen; //Дескриптор пера
int nPenIdent; //Тип пера
nPenIdent = NULL_PEN; //Получаем дескриптор пера NULL_PEN
hPen = GetStockObject (nPenIdent); //Дескриптор пера помещается
// переменную hPen
После получения индекса пера его можно выбрать в контекст устройства при помощи функции SelectObject:
HDC hDC; //Контекст устройства
HPEN hOldPen; //Индекс старого пера
hOldPen = SelectObject (hDc, hPen); //Изменяем перо, определенное
//в контексте устройства
Первый параметр функции SelectObject содержит индекс контекста устройства, перо которого вы хотите изменить, а второй содержит индекс нового пера. Функция SelectObject возвращает индекс пера, которое ранее было выбрано в контексте отображения (hOldPen). Вызвав еще раз функцию SelectObject с параметром, равным hOldPen, можно восстановить старую кисть.
В некоторых случаях недостаточно белого и черного пера. Вам может понадобиться, например, перо зеленого цвета, которое рисует штрихпунктирные линии. Для этого необходимо создать собственное перо. Для создания собственного пера (являющегося GDI объектом) можно воспользоваться функциями CreatePen или CreatePenIndirect. Данные функции возвращают дескриптор логического пера, которое может быть выбрано в контексте устройства при помощи функции SelectObject так же, как и в случае предопределенного пера.
Рассмотрим функцию CreatePen. При помощи этой функции можно создать перо заданного вами цвета, ширины, а также типа (сплошное, штрихпунктирное и т.д.).
hPen = CreatePen (hPenStyle, nWidth, rgbColor);
Первый параметр функции – hPenStyle – определяет тип рисуемой кистью линии и может быть одной из следующих величин:
Флаг hPenStyle Тип линии
PS_SOLID
PS_DASH
PS_DOT . . . . . . . . . . . .
PS_DASHDOT _ . _ . _ . _ . _
PS_DASHDOTDOT _ . . _ . . _ . . _
PS_NULL
Рис. Флаги типов линий
Второй параметр nWidth – задает ширину линий, рисуемых данной кистью, в логических единицах. Этот параметр должен быть равен единице для перьев PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT, в противном случае перо будет рисовать сплошные линии.
Последний параметр, rgbColor, определяет RGB-цвет создаваемой кисти.
Приведем пример создания кисти, рисующей штриховую линию зеленого цвета:
HPEN OldPen, hDashGreenPen;
hDashGreenPen = CreatePen (PS_DASH, 1, RGB (0,255, 0));
OldPen = SelectObject (hDashGreenPen);
Создаваемые кисти и перья являются объектами GDI, при работе с которыми нужно придерживаться определенных правил. Перечислим эти правила:
· Нужно обязательно удалять все объекты GDI, которые вы создаете – Windows не очищает их автоматически.
· Нельзя удалять объекты GDI, пока они выбраны в контексте устройства.
· Нельзя удалять стандартные объекты Windows.
Логические перья, создаваемые функциями CreatePen и CreatePenIndirect, также являются GDI объектами, следовательно, после их использования они должны быть удалены. Для этого применяют функцию DeleteObject:
DeleteObject (hDashGreenPen);
Единственный параметр функции содержит индекс удаляемого логического объекта, в данном случае индекс кисти – hDashGreenPen.
Наиболее удобно создавать логические перья при обработке сообщения WM_CREATE, а удалять их при обработке сообщения WM_DESTROY.