Выбор инструмента в заданный контекст устройства



 

Функция SelectObject

Функция SelectObject выбирает объект в заданный контекст устройства (DC). Новый объект заменяет предыдущий объект того же самого типа.

HGDIOBJ SelectObject(HDChdc, HGDIOBJhgdiobj);

Параметры

hdc - Дескриптор контекста устройства (DC).

hgdiobj - Дескриптор объекта, который выбирается.

Возвращаемые значения

Всегда надо конкретизировать возвращаемый тип   

например (HBRUSH)SelectObject(…)

Если функция завершается успешно, возвращаемое значение - дескриптор заменяемого объекта.

Если происходит ошибка, возвращаемое значение - ПУСТО (NULL).

Замечания

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

Пример:

HPEN hPen, рOldPen;

hPen=CreatePen(PS_SOLID,4,RGB(0,255,0));

hOldPen=(HPEN)SelectObject(hDC,hPen);

….рисуем

 

SelectObject(hDC,hOldPen);

Функция DeleteObject

Функция DeleteObject удаляет инструмент рисования, освобождая все системные ресурсы, связанные с ним. После того, как инструмент удаляется, его дескриптор более не допустим.

BOOL DeleteObject(HGDIOBJhObject);

Параметры

hObject - Дескриптор удаляемого инструмента рисования.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - не нуль.

Если установленный дескриптор не допустим или является текущим выбранным в DC, возвращаемое значение - нуль.

Замечания

Не удаляйте рисующий объект (перо или кисть) до тех пор, пока он является еще выбранным в DC.

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

SelectObject(hDC,hOldPen);

DeleteObject(hPen);

После рисования общим контекстом устройства (DC), должна вызваться функция ReleaseDC, чтобы освободить контекст устройства.

Функция ReleaseDC

Функция ReleaseDC освобождает контекст устройства (DC) для использования другими приложениями. Действие функции ReleaseDC зависит от типа контекста устройства (DC). Она освобождает только общий и контекст устройства (DC) окна.

int ReleaseDC(HWNDhWnd, HDC hDC);

Параметры

hWnd - Дескриптор окна, контекст устройства (DC) которого должен быть освобожден.

hDC -  Дескриптор контекста устройства (DC), который будет освобожден.

Возвращаемые значения

Возвращаемое значение указывает, был ли контекст устройства (DC) освобожден. Если контекст устройства был освобожден, возвращаемое значение равно 1.

Если контекст устройства (DC) не был освобожден, величина возвращаемого значения - ноль.

Замечания

Приложение должно вызывать функцию ReleaseDC для каждого вызова функции GetWindowDC и для каждого вызова функции GetDC, которые извлекают общий контекст устройства.

Приложение не может использовать функцию ReleaseDC, чтобы освободить контекст устройства (DC), который создавался при помощи вызова функции CreateDC; вместо этого оно должно использовать функцию DeleteDC. Функция ReleaseDC должна вызваться из того же самого потока, который вызвал GetDC.

Т. О. можно представить алгоритм выбора и использования инструмента рисования:

Алгоритм выбора инструмента на примере нового пера

1 Создать переменные типа перо для нового и старого перьев. HPEN hpen_new, hpen_old;
2 Создать новое перо. hpen_new = CreatePen(PS_SOLID, 4, RGB(5,12,15));
3 Выбрать новое перо, сохранив при этом старое. hpen_old=(HPEN)SelectObject(hdc, hpen_new);
4 Использовать новое перо.  
5 Вернуть в контекст старое перо. SelectObject(hdc, hpen_old);
6 Освободить память, занимаемую новым пером. DeleteObject(hpen_new);

Функции рисования

Рисование точки

Функция рисования точки SetPixel устанавливает цвет точки с заданными координатами:

SetPixel(HDC hdc, int nXPos, int nYPos, COLORREF clrref);

Параметры

hdc – идентификатор контекста отображения;

nXPos, nYPos – координаты точки в пикселях;

clrref – цвет точки.

Рисование линий

Для рисования прямых линий в контексте отображения хранятся координаты текущей позиции пера. Для изменения текущей позиции пера предназначена функция MoveToEx.

BOOL MoveToEx(HDChdc, intx, inty, POINTFAR*lppt);

 

Параметры

hdc идентификатор контекста отображения

x  x-координата

y  y-координата

lppt указатель на структуру POINT, старые координаты пера.

Чтобы узнать текущую позицию пера, приложение может использовать функцию GetCurrentPositionEx:

BOOL GetCurrentPositionEx(HDC hdc, POINT FAR* lppt);

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

BOOL LineTo(HDC hdc, int xEnd, int yEnd);

Эта функция рисует линию из текущей позиции пера, установленной ранее функцией MoveToEx, в точку с координатами (xEnd,yEnd). После того как линия будет нарисована, текущая позиция пера станет равной (xEnd,yEnd).

Особенностью функции LineTo является то, что она немного не дорисовывает линию: эта функция рисует всю линию, не включая точку (xEnd,yEnd).

(xn, yn) (xk, yk)

 

Рисование ломаной линии

BOOL WINAPI PolyLine(

HDC hdc, // идентификатор контекста отображения

const POINT FAR* lppt,// указатель на массив структур POINT

int cPoints);// размер массива

3. Рисование дуги эллипса

К сожалению, возможности рисования кривых линий при помощи функций GDI ограничены - единственная функция Arc позволяет нарисовать дугу эллипса или окружности:

 

BOOL Arc(HDC hdc, int nxLeft, int nyTop, int nxRight,

int nyBottom, int nxStart, int nyStart, int nxEnd, int nyEnd);

Параметры:

hdc                      идентификаторконтекстаотображения

nxLeft, nyTop,     координатыверхнеголевогоугла

nxRight, nyBottom  координатыправогонижнегоугла

nxStart, nyStart       координатыначаладуги

nxEnd, nyEnd          координатыконцадуги

Дуга рисуется в направлении против часовой стрелки. Координаты центра эллипса (если это потребуется) можно вычислить следующим образом:

xC = (nxLeft + nxRight) / 2;

yC = (nyTop + nyBottom) / 2;


Дата добавления: 2018-06-01; просмотров: 259; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!