Для получения графических примитивов используются следующие системные вызовы
Функция рисования точки SetPixel устанавливает цвет точки с заданными координатами:
COLORREF WINAPI SetPixel(
HDC hdc, // контекст отображения
int nXPos, // x-координата точки
int nYPos, // y-координата точки
COLORREF clrref); // цвет точки
Пример: SetPixel(hdc, 0, 0, RGB(0xff, 0, 0));
Для рисования линии в контексте отображения хранятся координаты текущей позиции пера. Для изменения текущей позиции пера в Windows существует системный вызов:
BOOL WINAPI MoveToEx(
HDC hdc, int x, int y, // x,y - координата
POINT FAR* lppt); // указатель на структуру
//POINT, туда переписываются старые координаты пера
Он перемещает позицию пера в новую точку
Для того чтобы нарисовать прямую линию, приложение должно воспользоваться функцией LineTo :
BOOL WINAPI LineTo(HDC hdc, int xEnd, int yEnd);
Рисование происходит из текущей позиции пера, конечные координаты линии указываются в параметрах xEnd, yEnd. После ее выполнения позиция пера станет равной xEnd, yEnd. Особенностью функции LineTo является то, что она немного не дорисовывает линию - эта функция рисует всю линию, не включая ее конец, т. е. точку (xEnd,yEnd).
Рисование ломаной кривой
BOOL WINAPI Polyline(
HDC hdc, const POINT FAR* lppt, // указатель на массив структур POINT
int cPoints); // размер массива
Функции Polyline , предназначенной для рисования ломаных линий, следует передать идентификатор контекста отображения hdc, указатель lppt на массив структур POINT, в котором должны находится координаты начала ломаной линии, координаты точек излома и координаты конца ломаной линии, а также размер этого массива cPoints. Если ломаная линия не замкнута, ее последняя точка не рисуется.
Рисование дуги эллипса функция Arc позволяет нарисовать дугу эллипса или окружности:
BOOL WINAPI Arc(
HDC hdc, int nxLeft, int nyTop, // верхий левый угол
int nxRight, int nyBottom, // правый нижний угол
int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Параметры (nxLeft,nyTop) и (nxRight,nyBottom) задают координаты, соответственно, верхнего левого и правого нижнего углов воображаемого прямоугольника, в который вписан эллипс.
Начало дуги эллипса определяется пересечением эллипса с воображаемой прямой линией, проведенной из центра эллипса (xC,yC) в точку (xStart,yStart). Конец дуги определяется аналогично - как пересечение эллипса с воображаемой прямой линии, проведенной из центра эллипса в точку (xEnd,yEnd).
Дуга рисуется в направлении против часовой стрелки.
Рисование прямоугольника
BOOL WINAPI Rectangle(
HDC hdc, int nxTL, // координата x верхнего левого угла
int nyTL, // координата y верхнего левого угла
int nxBR, // координата x правого нижнего угла
int nyBR); // координата y правого нижнего угла
С помощью функции RoundRect можно нарисовать прямоугольник со скругленными углами
BOOL WINAPI RoundRect(
HDC hdc, int nxTL, // координата x верхнего левого угла
int nyTL, // координата y верхнего левого угла
int nxBR, // координата x правого нижнего угла
int nyBR, // координата y правого нижнего угла
int nxEllipse, // ширина эллипса
int nyEllipse); // высота эллипса
Для рисования эллипса вы можете использовать функцию Ellipse
BOOL WINAPI Ellipse(
HDC hdc, int nxTL, // координата x верхнего левого угла
int nyTL, // координата y верхнего левого угла
int nxBR, // координата x правого нижнего угла
int nyBR); // координата y правого нижнего угла
Первый параметр этой функции указывает идентификатор контекста отображения, остальные - координаты верхнего левого и правого нижнего углов прямоугольника, в который должен быть вписан эллипс
Сегмент эллипса можно нарисовать при помощи функции Chord
BOOL WINAPI Chord(
HDC hdc, int nxLeft, int nyTop, // верхий левый угол
int nxRight, int nyBottom, // правый нижний угол
int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Для рисования сектора эллипса следует использовать функцию Pie
BOOL WINAPI Pie(
HDC hdc, int nxLeft, int nyTop, // верхний левый угол
int nxRight, int nyBottom, // правый нижний угол
int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Рисование многоугольников выполняется функцией Polygon , аналогичной по своим параметрам функции Polyline, с помощью которой рисуются ломаные линии:
BOOL WINAPI Polygon(
HDC hdc, const POINT FAR* lppt, // указатель на массив структур POINT
int cPoints); // размер массива
С помощью функции PolyPolygon можно нарисовать одновременно несколько многоугольников:
BOOL WINAPI PolyPolygon(
HDC hdc, const POINT FAR*lppt, // указатель на массив структур POINT
int FAR* lpnPolyCounts, // адрес массива количества точек в многоугольниках
int cPolygons); // количество многоугольников
Параметр cPolygons определяет количество многоугольников, которые нужно нарисовать. Параметр lppt должен содержать указатель на массив структур типа POINT, содержащий координаты вершин всех многоугольников. Через параметр lpnPolyCounts передается указатель на массив целых чисел. Каждое число в этом массиве определяет количество точек в соответствующем многоугольнике. В PolyPolygon не замыкает ломаную линию.