6.6. Рисование примитивов
Теперь вы знаете хотя бы минимум теории, поэтому пора начинать практиковаться. Создадим простое приложение, которое будет рисовать на форме ряд примитивов. Для этого в новом приложении для формы сделаем обработку события OnPaint (листинг 6.1).
...
Листинг 6.1.
Обработчик события формы OnPaint
procedure TfmShapes.FormPaint(Sender: TObject);
var
hCurDC: HDC;
hCurPen, hOldPen: HPEN;
hCurBrush, hOldBrush: HBRUSH;
begin
//получаем общий контекст устройства
hCurDC := GetDC(Handle);
//создаем графический объект Карандаш
hCurPen := CreatePen(PS_SOLID, 2, RGB(255, 64, 0));
//выбираем его для общего контекста устройства экрана
//и запоминаем ранее выбранный
hOldPen := SelectObject(hCurDC, hCurPen);
//создаем графический объект Кисть
hCurBrush := CreateSolidBrush(RGB(0, 128, 255));
//выбираем ее для общего контекста устройства экрана
//и запоминаем ранее выбранную
hOldBrush := SelectObject(hCurDC, hCurBrush);
//рисуем эллипс
Ellipse(hCurDC, 10, 10, 100, 70);
//рисуем прямоугольник
Rectangle(hCurDC, 110, 10, 210, 70);
//прямоугольник с округленными углами
RoundRect(hCurDC, 10, 80, 100, 140, 10, 10);
//прямоугольник в виде «бочки»
RoundRect(hCurDC, 110, 80, 210, 140, 10, 100);
//рисуем прямую
MoveToEx(hCurDC, 10, 150, nil);
LineTo(hCurDC, 100, 220);
//рисуем дугу
Arc(hCurDC, 110, 150, 210, 220, 110, 150, 210, 220);
//восстанавливаем ранее выбранную кисть
SelectObject(hCurDC, hOldBrush);
//удаляем созданную кисть
DeleteObject(hCurBrush);
//восстанавливаем ранее выбранный карандаш
SelectObject(hCurDC, hOldPen);
//удаляем созданный карандаш
DeleteObject(hCurPen);
//освобождаем общий контекст устройства
ReleaseDC(Handle, hCurDC);
end;
Прежде чем начать рисовать, требуется получить контекст устройства нашей формы. Для этого мы используем функцию GetDC:
...
Она получает описатель контекста устройства экрана для клиентской области указанного окна или всего экрана. Функция имеет следующий формат заголовка:
...
Function GetDC(hWnd: HWND): HDC;
Здесь hWnd – дескриптор окна, для которого получается контекст устройства. Если это значение равно nil, то GetDC возвращает контекст устройства для всего экрана. В случае успешного выполнения функция возвращает контекст устройства. В противном случае ее результат равен nil.
Теперь мы должны изменить атрибуты контекста устройства по умолчанию на те, которые нам необходимы. Изменим цвет карандаша и его толщину, а также цвет кисти. Для этого создадим новый графический объект при помощи функции CreatePen.
...
hCurPen := CreatePen(PS_SOLID, 2, RGB(255, 64, 0));
Формат данной функции следующий:
...
Function CreatePen(fnPenStyle: Integer; nWidth: Integer; crColor: COLORREF): HPEN;
Параметр f nPenStyle задает стиль карандаша. Возможные значения этого параметра приведены в табл. 6.1.
Таблица 6.1
. Стили карандаша
Параметр nWidth задает ширину карандаша в логических единицах. EonnnWidth равен 0, то карандаш будет шириной в один пиксел независимо от текущей трансформации.
CreatePen возвращает карандаш с заданной шириной со стилем PSSOLID, если вы указали ширину больше, чем 1, для одного из стилей: PS_DASH, PS_DOT, PSJDASHDOT, PS_DASHDOTDOT.
Параметр crColor задает цвет карандаша.
Если функция завершилась удачно, то она возвращает дескриптор логического карандаша. В противном случае она возвращает nil.
После того как карандаш создан, следует его выбрать для полученного контекста при помощи функции SelectObject:
...
hOldPen:= SelectObject(hCurDC, hCurPen);
Данная функция имеет следующий формат:
...
Function SelectObject(hdc: HDC; hgdiobj: HGDIOBJ): HGDIOBJ;
• hdc – дескриптор контекста устройства;
• hgdiobj – дескриптор на выбираемый объект.
Если выбранный объект не регион и функция выполнилась успешно, то она возвращает дескриптор на объект, который был заменен. Если выбранный объект регион и функция выполнилась успешно, то возвращаемое значение может быть одним из приведенных в табл. 6.2.
Таблица 6.2.
Результат SelectObject для выбранного объекта регион
Если происходит ошибка и выбранный объект не регион, то возвращаемое значение – nil. Иначе – HGDI_ERROR.
Функция возвращает предыдущий выбранный объект указанного типа. Приложение должно всегда восстанавливать объект по умолчанию после того, как закончилось рисование с использованием нового объекта.
Читать дальше
Конец ознакомительного отрывка
Купить книгу