Чтение онлайн

на главную - закладки

Жанры

Шрифт:

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

Приложение не может выбрать битовый массив более чем для одного контекста устройства одновременно.

После успешного выбора созданного нами карандаша и запоминания предыдущего выбранного необходимо создать и выбрать кисть. Для этого используем функцию 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. Результат работы приложения «Рисование примитивов»

Здесь вы можете увидеть, что рисуется в итоге и как параметры функции влияют на это.

6.7. Работа с текстом

Теперь мы разработаем простое приложение, которое будет способно выводить текст под различным углом через определенный интервал времени. Для этого опять сделаем обработку события 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);

//выбираем созданный шрифт

hOldFont := SelectObject(hCurDC, hCurFont);

//устанавливаем новый режим вывода

nOldMode := SetBkMode(hCurDC, TRANSPARENT);

//устанавливаем цвет текста

SetTextColor(hCurDC, RGB(0, 0, 255));

//задаем текстовую строку

sText := \'Текст примера\

//выводим текст на экран

TextOut(hCurDC, Width div 2, Height div 2, PAnsiChar(sText),

Length(sText));

//восстанавливаем режим вывода

SetBkMode(hCurDC, nOldMode);

//восстанавливаем ранее выбранный шрифт

SelectObject(hCurDC, hOldFont);

//удаляем созданный шрифт

DeleteObject(hCurFont);

//освобождаем общий контекст устройства

ReleaseDC(Handle, hCurDC);

end;

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

...

hCurFont:= CreateFontlndirect(LogFontData);

Данная функция имеет следующий формат заголовка:

Поделиться:
Популярные книги

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4