Создадим новый проект командой меню File/New/Application, и присвоим главной форме имя fmFigura. Сохраним модуль формы fmFigura под именем Figura_un.pas, а сам проект — под именем Figura.
В каталог с проектом поместим файл Сундучок.jpg с изображением, которое будет задавать форму разрабатываемого приложения. Изображение имеет размеры 256х256 (рис. 1.2).
Присвоим свойствам формы значения согласно табл. 1.2.
Таблица 1.2. Свойства проектируемой формы
Свойство | Установленное значение | Назначение изменения |
Name | fmFigura | Новое имя формы |
BorderStyle | bsNone | Форма без заголовка и границы |
ClientHeight | 256 | Клиентская высота формы |
ClientWidth | 256 | Клиентская ширина формы |
Position | poDesktopCenter | Форма размещается по центру экрана |
Разместим на форме fmFigura компонент Image категории Additional, присвоим его свойству Align значение alClient (заполняет всю форму), свойству Proportional — значение true, свойству Center — значение true, в свойстве Picture укажем в качестве отображаемого файла файл Сундучок.jpg.
Теперь реализуем обрезку формы для того, чтобы в момент запуска приложения было видно только изображение сундука. Для этого создадим обработчик события TfmFigura.OnCreate и добавим в него следующий код:
|
|
//в момент запуска приложения реализуем
//обрезку формы, чтобы был виден один сундучок
procedure TfmFigura.FormCreate(Sender: TObject);
Const
count=16; //число вершин в полигоне
Var
CutRegion, Ellipse: LongWord; //области обрезки
//массив координат области обрезки
points: array [1..count] of TPoint;
Begin
//формируем координаты точек полигона обрезаемой области
points[1].X:=35; points[1].Y:=135; //1 точка
points[2].X:=35; points[2].Y:=218; //2 точка
points[3].X:=98; points[3].Y:=243; //3 точка
points[4].X:=228; points[4].Y:=216; //4 точка
points[5].X:=228; points[5].Y:=135; //5 точка
points[6].X:=162; points[6].Y:=100; //6 точка
points[7].X:=161; points[7].Y:=27; //7 точка
points[8].X:=97; points[8].Y:=30; //8 точка
points[9].X:=94; points[9].Y:=8; //9 точка
points[10].X:=90; points[10].Y:=4; //10 точка
points[11].X:=79; points[11].Y:=4; //11 точка
points[12].X:=74; points[12].Y:=9; //12 точка
points[13].X:=76; points[13].Y:=31; //13 точка
points[14].X:=33; points[14].Y:=33; //14 точка
points[15].X:=24; points[15].Y:=36; //15 точка
//последняя точка совпадает с первой
points[count].X:=35; points[count].Y:=135;
//формируем область обрезки по координатам полигона
CutRegion:=CreatePolygonRgn(points, count, ALTERNATE);
//переменная Ellipse будет содержать в себе эллипс
Ellipse:=CreateEllipticRgn(4,32,86,136);
//объединяем ее с ранее созданной областью обрезки
CombineRgn(CutRegion,CutRegion, Ellipse, RGN_OR);
//создаем эллиптическую область и объединяем
//ее с ранее созданной областью обрезки
Ellipse:=CreateEllipticRgn(156,98,174,112);
CombineRgn(CutRegion,CutRegion, Ellipse, RGN_OR);
//создаем эллиптическую область и объединяем
//ее с ранее созданной областью обрезки
Ellipse:=CreateEllipticRgn(154,206,208,236);
CombineRgn(CutRegion,CutRegion, Ellipse, RGN_OR);
//назначаем область обрезки форме
SetWindowRgn(Handle, CutRegion, True);
end;
Для удобства определения координат области обрезки можно открыть рисунок в редакторе Paint, где при наведении указателя мыши на точку в строке состояния можно увидеть ее координаты.
|
|
Рассмотрим функции, которые использовались для определения обрезаемой области:
Область обрезки CutRegion создается при помощи функции CreatPolygonRgn, реализованной в стандартном модуле Windows. Эта функция принимает три параметра:
- массив значений типа TPoint, содержащий координаты точек полигона;
- количество точек полигона, которые должны учитываться для создания области обрезки;
- характер заполнения полигона – здесь следует указать константу ALTERNATE.
Функция CreatePolygonRgn возвращает значение типа LongWord – идентификатор некоторой области[1].
Кроме полигональной области обрезки, можно создавать прямоугольные и эллиптические области с помощью функций CreateRectRgn и CreateEllipticRgn, в которые передаются четыре параметра: координата X левого верхнего угла; координата Y левого верхнего угла; координата X правого нижнего угла; координата Y правого нижнего угла.
В рассмотренном примере несколько раз была определена эллиптическая область обрезки Ellipse, которая затем объединялась с созданной ранее областью обрезки с использованием процедуры CombineRgn.
Процедуре CombineRgn передаются следующие параметры:
- результирующая область;
- первая область;
- вторая область;
- параметр, определяющий характер объединения областей:
§ RGN_DIFF – вторая область вырезается из первой. Использование этого параметра позволяет сделать в форме «дырки»;
§ RGN_AND – остается только часть второй области, которая пересекается с первой областью;
§ RGN_OR – вторая область накладывается на первую (объединение областей);
§ RGN_COPY – копия первой области;
§ RGN_XOR – комбинация операций RGN_OR и RGN_DIFF, т.е. объединение областей, исключая все пересечения.
Для назначения области CutRegion форме используется функция SetWindowRgn, которой передаются следующие параметры:
- уникальный идентификатор окна – fmFigura.Handle;
- идентификатор области обрезки;
- значение типа Boolean, указывающее на необходимость прорисовки окна. Если в качестве этого параметра передать False, то перерисовку окна можно выполнить в любой момент, вызвав метод fmFigura.Repaint.