Основная работа выполняется в обработчике события OnPaint
формы. Мы здесь будем разбирать этот обработчик не целиком, а по частям в соответствии с тем, что каждая часть рисует. Начнем с надписи Delphi Kingdom в левом верхнем углу окна (листинг 1.34).
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
(как будто мы нарисовали этот рисунок через трафарет, имеющий форму надписи). По сути, так оно и есть, только называется это не трафарет,