Содержание материала

До сих пор в примерах мы рассматривали регионы с абсолютными значениями линейных величин. Пример непрямоугольного окна, которое масштабирует свою форму в зависимости от его размера. Искодный код, приведенный ниже, создает окно в виде бабочки, причем бабочка исполльзует максимально высоту и ширину исходной формы.

Code:

 

procedure TForm1.FormCreate(Sender: TObject);

var

R1, R2 : HRgn;

P : array [0..2] of TPoint;

X : Word;

begin

// левое верхнее крыло

R1 :=CreateEllipticRgn(Round(-Width*0.4),

0,Round(Width*0.49),Round(Height*1.1));

// правое верхнее крыло

R2 :=CreateEllipticRgn(Round(Width*0.51),

0,Round(Width*1.4),Round(Height*1.1));

CombineRgn(R2,R1,R2,RGN_OR);

// отсекаем лишнее от верхних крыльев,

// остаются линзы на пересечении эллипсов

 

R1 :=CreateEllipticRgn(0,Round(-Height*0.3),

Width,Round(Height*0.71));

CombineRgn(R1,R1,R2,RGN_AND);

 

//эллипс - основа нижних крыльев

R2 :=CreateEllipticRgn(Round(Width*0.1),

Round(Height*0.65), Round(Width*0.9), Height);

CombineRgn(R1,R1,R2,RGN_OR);

// вырезаем эллипс - разрез между нижних крыльев

R2 :=CreateEllipticRgn(Round(Width*0.3),

Round(Height*0.7), Round(Width*0.7), Round(Height*1.5));

CombineRgn(R1,R1,R2,RGN_DIFF);

 

// вертикальный эллипс - туловище бабочки

R2 :=CreateEllipticRgn(Round(Width*0.46),

Round(Height*0.3), Round(Width*0.54),

Round(Height*0.8));

CombineRgn(R1,R1,R2,RGN_OR);

 

// голова - круг; за основу берем меньшую

// из двух величин - высоты и ширины окна

X := Width;

if Height < X then X := Height;

X := Round(X/18);

R2 :=CreateEllipticRgn(Round(Width*0.5)-X,

Round(Height*0.3)-X, Round(Width*0.5)+X,

Round(Height*0.3)+X);

 

CombineRgn(R1,R1,R2,RGN_OR);

 

// левый усик

P[0] := Point(Round(Width*0.5), Round(Height*0.3));

P[1] := Point(Round(Width*0.35), Round(Height*0.01));

P[2] := Point(Round(Width*0.355)+1, 0);

R2 := CreatePolygonRgn(P, 3, WINDING);

CombineRgn(R1,R1,R2,RGN_OR);

 

// правый усик

P[0] := Point(Round(Width*0.5), Round(Height*0.3));

P[1] := Point(Round(Width*0.655+1), Round(Height*0.01));

P[2] := Point(Round(Width*0.65), 0);

R2 := CreatePolygonRgn(P, 3, WINDING);

 

CombineRgn(R1,R1,R2,RGN_OR);

 

// острие на крыле слева снизу

P[0] := Point(Round(Width*0.15), Height);

P[1] := Point(Round(Width*0.2), Round(Height*0.8));

P[2] := Point(Round(Width*0.3), Round(Height*0.9));

R2 := CreatePolygonRgn(P, 3, WINDING);

CombineRgn(R1,R1,R2,RGN_OR);

 

// острие на крыле справа снизу

P[0] := Point(Round(Width*0.85), Height);

P[1] := Point(Round(Width*0.8), Round(Height*0.8));

P[2] := Point(Round(Width*0.7), Round(Height*0.9));

 

R2 := CreatePolygonRgn(P, 3, WINDING);

CombineRgn(R1,R1,R2,RGN_OR);

 

// Назначаем полученный регион форме

SetWindowRgn(Handle, R1, True);

end;

 

 

Если грамотно разложить фигуру на элементарные составляющие, то Вам вполне по силам создать окно абсолютно любой формы. Это похоже на детскую игру "конструктор", только Ваши "кубики" намного разнообразнее.

Для завершения проекта необходимо создать фоновую картинку, которая подчеркнет границы нового окна. И обязательно установить свойство формы Scaled = False, иначе фоновая картинка и форма могут "разъехаться" при использовании  нестандартных видеорежимов или стилей оформления Windows.

 

В заключение следует сказать, что существуют готовые компоненты и библиотеки компонент для решения подобных задач, например, CoolForm, TPlasmaForm. Однако при использовании компонент от сторонних производителей могут возникнуть проблемы лицензионности их использования и проблемы перехода на новую версию компилятора. А приведенные в данной статье примеры компилируются без изменений в исходном коде на Borland Delphi 3.0 - 7.0 и, вероятно, будут совместимы с последующими версиями.

 

© Георгий Чернилевский

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить