Читаем О чём не пишут в книгах по Delphi полностью

Основная работа выполняется в обработчике события OnPaint формы. Мы здесь будем разбирать этот обработчик не целиком, а по частям в соответствии с тем, что каждая часть рисует. Начнем с надписи Delphi Kingdom в левом верхнем углу окна (листинг 1.34).

Листинг 1.34. Вывод надписи Delphi Kingdom

var

 R: TRect;

...

// Формируем регион, использующийся для отсечения.

// Формируем его только при первом вызове метода, а при

// дальнейших используем созданный ранее. Поле FRgn

// содержит дескриптор этого региона

if FRgn = 0 then

begin

 Canvas.Font.Name := 'Times New Roman';

 Canvas.Font.Style := [fsBold];

 Canvas.Font.Height := 69;

 // Начинаем рисование траектории. Все вызовы

 // графических функций, находящиеся между BeginPath

 // и EndPath, не будут приводить к выводу на экран.

 // Вместо этого информация о том, что рисуется, будет

 // сохраняться а специальном объекте GDI - траектории.

 BeginPath(Canvas.Handle);

 R := Rect(10, 10, 10 + FBitmap.Width, 10 + FBitmap.Height);

 // Если не установить с помощью SetBkMode прозрачный

 // фон, в траекторию попадут не только контуры букв,

 // но и контуры содержащих их прямоугольных знакомест.

 SetBkMode(Canvas.Handle, TRANSPARENT);

 // Выводим текст "Delphi Kingdom", выравнивая его по

 // центру по вертикали и горизонтали.

 DrawText(Canvas.Handle, 'Delphi'#13#10'Kingdom', -1, R,

  DT_CENTER or DT_VCENTER);

 EndPath(Canvas.Handle);

 // Превращаем траекторию в регион. В результате вызова

 // этой функции получится регион, контуры которого

 // совпадают с контурами надписи "Delphi Kingdom",

 // сделанной в указанных координатах выбранным шрифтом.

 FRgn := PathToRegion(Canvas.Handle);

end;

// Устанавливаем регион отсечения. Все, что не будет

// попадать в выбранный регион, при выводе будет

// игнорироваться.

SelectClipRgn(Canvas.Handle, FRgn);

// Выводим изображение. Все, что не попадает в область

// региона, отсекается. Таким образом, получаем надпись

// "Delphi Kingdom", подсвеченную выбранным изображением.

Canvas.Draw(10, 10, FBitmap);

// Отменяем отсечение по региону

SelectClipRgn(Canvas.Handle, 0);

Если присмотреться к надписи, видно, что внутренняя часть контуров букв содержит тот самый рисунок, который был загружен в обработчик OnCreate (как будто мы нарисовали этот рисунок через трафарет, имеющий форму надписи). По сути, так оно и есть, только называется это не трафарет, а регион отсечения. Регион — это специальный объект, который хранит область произвольной формы. Способы применения регионов различны (см. разд. 1.3.3), и один из них — это использование региона для отсечения графического вывода. Если установить регион отсечения для контекста устройства, то, что бы мы ни выводили потом в данный контекст, все, что лежит за пределами региона отсечения, игнорируется.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже