Приложение не может выбрать битовый массив более чем для одного контекста устройства одновременно.
После успешного выбора созданного нами карандаша и запоминания предыдущего выбранного необходимо создать и выбрать кисть. Для этого используем функцию CreateSolidBrush:
...
hCurBrush:= CreateSolidBrush(RGB(0, 128, 255));
Данная функция имеет следующий формат:
...
Function CreateSolidBrush(crColor: COLORREF): HBRUSH;
Параметр crColor задает цвет кисти.
Если функция завершилась успешно, то она возвращает дескриптор логической кисти. В противном случае – nil.
После создания кисти выбираем ее с использованием той же самой функции SelectObj ect и запоминаем ранее выбранную.
...
hOldBrush:= SelectObject(hCurDC, hCurBrush);
Далее рисуем примитивы с использованием полученного контекста устройства с новыми графическими объектами.
Чтобы нарисовать эллипс, используем функцию Ellipse:
...
Ellipse(hCurDC, 10, 10, 100, 70);
Функция имеет следующий формат:
...
Function Ellipse(hdc: HDC; nLeftRect, nTopLeft, nRightRect, nBottomRect: Integer): BOOL;
• hdc – дескриптор контекста устройства;
• nLeftRect – задает координату х (в логических единицах) верхнего левого угла описываемого прямоугольника;
• nTopRect – задает координату у (в логических единицах) верхнего левого угла;
• nRightRect – задает координату х (в логических единицах) правого нижнего угла;
• nBottomRect – задает координату у (в логических единицах) правого нижнего угла.
Если функция завершается успешно, то ее результат – ненулевое значение. В противном случае возвращается 0.
Для рисования прямоугольника используется функция Rectangle.
...
Rectangle(hCurDC, 110, 10, 210, 70);
У данной функции такой же формат, как и у Ellipse, но интерпретация последних четырех параметров немного иная. Они задают сам прямоугольник, а не прямоугольник, описываемый вокруг эллипса.
Далее мы рисуем прямоугольник с округленными углами при помощи функции RoundRect.
...
RoundRect(hCurDC, 10, 80, 100, 140, 10, 10);
У данной функции первые пять параметров идентичны параметрам предыдущей функции, а последние два задают ширину и высоту эллипса, при помощи которого происходит округление углов прямоугольника.
Следующим примитивом, который мы рисуем, является отрезок. Процесс рисования осуществляется в два этапа. Сначала при помощи функции MoveToEx устанавливается начальная точка отрезка. Затем используем функцию Move То с указанием конечной точки.
...
MoveToEx(hCurDC, 10, 150, nil);
LineTo(hCurDC, 100, 220);
Четвертый параметр в функции MoveToEx – это переменная типа TPoint, в которую помещается предыдущее положение карандаша.
И последней рисуется дуга при помощи функции Arc.
...
Arc(hCurDC, 110, 150, 210, 220, 110, 150, 210, 220);
В ней первые пять параметров соответствуют параметрам функции Rectangle, а последние четыре параметра задают начальную и конечную радиальные точки дуги.
После того как все операции вывода выполнены, требуется освободить все занятые ресурсы системы. Это осуществляется следующим образом:
...
SelectObject(hCurDC, hOldPen);
DeleteObject(hCurPen);
SelectObject(hCurDC, hOldPen);
DeleteObject(hCurPen);
ReleaseDC(Handle, hCurDC);
Сначала восстанавливаются карандаш и кисть для контекста устройства и удаляются созданные нами, а после освобождается и сам контекст устройства. Результат выполнения приложения приведен на рис. 6.1.
Рис. 6.1. Результат работы приложения «Рисование примитивов»
Здесь вы можете увидеть, что рисуется в итоге и как параметры функции влияют на это.
Теперь мы разработаем простое приложение, которое будет способно выводить текст под различным углом через определенный интервал времени. Для этого опять сделаем обработку события OnPaint нашей формы, в которой будем осуществлять вывод некоторого текста на поверхность формы. Исходный код данного обработчика приведен в листинге 6.2.
...
Листинг 6.2.
Обработчик события формы OnPaint
procedure TfmText.FormPaint(Sender: TObject);
var
hCurDC: HDC;
hCurFont, hOldFont: HFONT;
nOldMode: Integer;
sText: String;
begin
//получаем общий контекст устройства
hCurDC := GetDC(Handle);
//создаем шрифт из шаблона
hCurFont := CreateFontIndirect(LogFontData);
//выбираем созданный шрифт
Читать дальше
Конец ознакомительного отрывка
Купить книгу