Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Листинг 1.10. Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ эллипсов

procedure TfrmElliptic.FormCreate(Sender: TObject);

var

formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;

begin

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ

but1Rgn:= CreateEllipticRgn(0, 0, Button1.Width–1, Button1.

Height–1);

SetWindowRgn(Button1.Handle, but1Rgn, False);

but2Rgn:= CreateEllipticRgn(0, 0, Button2.Width–1, Button2.

Height–1);

SetWindowRgn(Button2.Handle, but2Rgn, False);

but3Rgn:= CreateEllipticRgn(0, 0, Button3.Width–1, Button3.

Height–1);

SetWindowRgn(Button3.Handle, but3Rgn, False);

//РСгион для окна

formRgn:= CreateEllipticRgn(0, 0, Width–1, Height–1);

SetWindowRgn(Handle, formRgn, True);

end;

Π¨ΠΈΡ€ΠΈΠ½Π° ΠΈ высота эллипсов Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π²Π½Π° соотвСтствСнно ΡˆΠΈΡ€ΠΈΠ½Π΅ ΠΈ высотС Ρ‚Π΅Ρ… ΠΎΠΊΠΎΠ½, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ (Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ). ΠŸΡ€ΠΈ нСобходимости это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, установлСнного Π²ΠΎ врСмя проСктирования Ρ„ΠΎΡ€ΠΌΡ‹.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ листинга 1.10 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° рис. 1.5.

Рис. 1.5. Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ эллипсов

Π”Π°Π»Π΅Π΅ рассмотрим Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ интСрСсный (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅) ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ ΡƒΠ³Π»ΠΎΠ² Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π½Π° Π½Π΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ области отсСчСния Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΡƒΠ³Π»Π°ΠΌΠΈ. НиТС приводится рСализация ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события FormCreate (листинг 1.11).

...

Листинг 1.11.

Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹ΠΌΠΈ краями

procedure TfrmRoundRect.FormCreate(Sender: TObject);

var

formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;

begin

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ для ΠΊΠ½ΠΎΠΏΠΎΠΊ

but1Rgn:= CreateRoundRectRgn(0, 0, Button1.Width–1,

Button1.Height–1,

Button1.Width div 5,

Button1. Height div 5);

SetWindowRgn(Button1.Handle, but1Rgn, False);

but2Rgn:= CreateRoundRectRgn(0, 0, Button2.Width–1,

Button2.Height–1,

Button2.Width div 5,

Button2.Height div 5);

SetWindowRgn(Button2.Handle, but2Rgn, False);

but3Rgn:= CreateRoundRectRgn(0, 0, Button3.Width–1,

Button3.Height–1,

Button3.Width div 5,

Button3.Height div 5);

SetWindowRgn(Button3.Handle, but3Rgn, False);

//РСгион для окна

formRgn:= CreateRoundRectRgn(0, 0, Width–1, Height–1,

Width div 5, Height div 5);

SetWindowRgn(Handle, formRgn, False);

end;

Π’ листингС 1.11 Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΡ€ΡƒΠ³Π»ΡΡŽΡ‰ΠΈΡ… эллипсов Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (20 % ΠΎΡ‚ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ 20 % ΠΎΡ‚ высоты). Π­Ρ‚ΠΎ смотрится Π½Π΅ всСгда красиво. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты ΡΠΊΡ€ΡƒΠ³Π»ΡΡŽΡ‰ΠΈΡ… эллипсов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ фиксированныС нСбольшиС значСния.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ листинга 1.11 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° рис. 1.6.

Рис. 1.6. Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹ΠΌΠΈ краями

Π’Π΅ΠΏΠ΅Ρ€ΡŒ самый интСрСсный ΠΈΠ· прСдусмотрСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² – созданиС ΠΎΠΊΠ½Π° ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ: ΠΎΠΊΠ½Π° Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π·Π²Π΅Π·Π΄Ρ‹, ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, пяти– ΠΈ ΡˆΠ΅ΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (рис. 1.7).

Рис. 1.7. Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² для областСй отсСчСния Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 1.7, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 1.12).

...

Листинг 1.12. Окно ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

procedure TfrmPoly.FormCreate(Sender: TObject);

var

points: array [0..5] of TPoint;

formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;

begin

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ для ΠΎΠΊΠ½Π° ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ

//..ΡˆΠ΅ΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°

Make6Angle(Button1.Width, Button1.Height, points);

but1Rgn:= CreatePolygonRgn(points, 6, WINDING);

SetWindowRgn(Button1.Handle, but1Rgn, False);

//..Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°

Make3Angle(Button2.Width, Button2.Height, points);

but2Rgn:= CreatePolygonRgn(points, 3, WINDING);

SetWindowRgn(Button2.Handle, but2Rgn, False);

//..ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°

Make5Angle(Button3.Width, Button3.Height, points);

but3Rgn:= CreatePolygonRgn(points, 5, WINDING);

SetWindowRgn(Button3.Handle, but3Rgn, False);

//..Ρ„ΠΎΡ€ΠΌΠ° Π² Π²ΠΈΠ΄Π΅ Π·Π²Π΅Π·Π΄Ρ‹

MakeStar(Width, Height, points);

formRgn:= CreatePolygonRgn(points, 5, WINDING);

SetWindowRgn(Handle, formRgn, False);

end;

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ создания Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ листингС являСтся использованиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ для заполнСния массива points ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ Ρ‚ΠΎΡ‡Π΅ΠΊ-Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°. ВсС эти ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚, ΠΏΠΎΠΌΠΈΠΌΠΎ ссылки Π½Π° сам массив points, ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈ высоту ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вписан ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° создания Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° приводится Π² листингС 1.13.

...

Листинг 1.13. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

procedure Make3Angle(width, height: Integer; var points: array

of TPoint);

begin

points[0].X:= 0;

points[0].Y:= height – 1;

points[1].X:= width div 2;

points[1].Y:= 0;

points[2].X:= width – 1;

points[2].Y:= height – 1;

end;

Π’ листингС 1.14 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° создания ΡˆΠ΅ΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

...

Листинг 1.14.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡˆΠ΅ΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

procedure Make6Angle(width, height: Integer; var points: array

of TPoint);

begin

points[0].X:= 0;

points[0].Y:= height div 2;

points[1].X:= width div 3;

points[1].Y:= 0;

points[2].X:= 2 * (width div 3);

points[2].Y:= 0;

points[3].X:= width – 1;

points[3].Y:= height div 2;

points[4].X:= 2 * (width div 3);

points[4].Y:= height – 1;

points[5].X:= width div 3;

points[5].Y:= height – 1;

end;

Листинг 1.15 содСрТит ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ создания ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ).

...

Листинг 1.15.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

procedure Make5Angle(width, height: Integer; var points: array

of TPoint);

var a: Integer; //Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π° ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

begin

a:= width div 2;

points[0].X:= a;

points[0].Y:= 0;

points[1].X:= width – 1;

points[1].Y:= a div 2;

points[2].X:= 3 * (a div 2);

points[2].Y:= height – 1;

points[3].X:= a div 2;

points[3].Y:= height – 1;

points[4].X:= 0;

points[4].Y:= a div 2;

end;

ΠŸΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ Π·Π²Π΅Π·Π΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния Ρ„ΠΎΡ€ΠΌΡ‹, создаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС 1.15 ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Make5Angle. ПослС измСняСтся порядок слСдования Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΎΠ±Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ построСнии Ρ€Π΅Π³ΠΈΠΎΠ½Π° выполнялся Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ рисуСтся Π·Π²Π΅Π·Π΄Π° ΠΊΠ°Ρ€Π°Π½Π΄Π°ΡˆΠΎΠΌ Π½Π° Π±ΡƒΠΌΠ°Π³Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1-3-5-2-4) (листинг 1.16).

...

Листинг 1.16.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π·Π²Π΅Π·Π΄Ρ‹

procedure MakeStar(width, height: Integer; var points: array

of TPoint);

begin

Make5Angle(width, height, points);

//ΠŸΡ€ΠΈ построСнии Π·Π²Π΅Π·Π΄Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° обводятся Π½Π΅ ΠΏΠΎ

//порядку,Π° Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ

Swap(points[1], points[2]);

Swap(points[2], points[4]);

Swap(points[3], points[4]);

end;

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MakeStart (листинг 1.16) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Swap, ΠΌΠ΅Π½ΡΡŽΡ‰ΡƒΡŽ мСстами значСния Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² Π½Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Swap рСализуСтся Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ просто ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π² тСкстС ΠΊΠ½ΠΈΠ³ΠΈ Π½Π΅ приводится.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹

Π’Ρ‹ ΡƒΠΆΠ΅ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ простыС Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹. Однако ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСдостаточным Ρ‚Π΅Ρ… Ρ„ΠΎΡ€ΠΌ ΠΎΠΊΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ с использованиСм лишь ΠΎΠ΄Π½ΠΎΠ³ΠΎ нСслоТного Ρ€Π΅Π³ΠΈΠΎΠ½Π° Π² качСствС области отсСчСния. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя Π·Π°Π½ΡΡ‚ΡŒΡΡ созданиСм ΠΎΠΊΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ слоТной Ρ„ΠΎΡ€ΠΌΡ‹, примСняя рассмотрСнныС Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ.

«Дырявая» Ρ„ΠΎΡ€ΠΌΠ°

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ полСзности ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для знакомства с опСрациями Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ. Π—Π΄Π΅ΡΡŒ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ – опСрация XOR для формирования Β«Π΄Ρ‹Ρ€ΠΎΠΊΒ» Π² Ρ„ΠΎΡ€ΠΌΠ΅ (рис. 1.8).

Рис. 1.8. Β«Π”Ρ‹Ρ€ΠΊΠΈΒ» Π² Ρ„ΠΎΡ€ΠΌΠ΅

На рис. 1.8 явно Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ Π² Β«Π΄Ρ‹Ρ€ΠΊΠ°Ρ…Β» просвСчиваСтся ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΠΊΠΎΠ½ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Delphi. ΠŸΡ€ΠΈ этом сообщСния ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ, ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ находится Π½Π°Π΄ Β«Π΄Ρ‹Ρ€ΠΊΠΎΠΉΒ», ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ нашС ΠΎΠΊΠ½ΠΎ, Π° Ρ‚Π΅, Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΈΠ΄Π½Π° Π² Β«Π΄Ρ‹Ρ€ΠΊΠ΅Β». ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, приводящий ΠΊ созданию Ρ„ΠΎΡ€ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΡŒ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 1.17.

...

Листинг 1.17.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Β«Π΄Ρ‹Ρ€ΠΎΠΊΒ» Π² Ρ„ΠΎΡ€ΠΌΠ΅

procedure TfrmHole.FormCreate(Sender: TObject);

var

rgn1, rgn2: HRGN; //"Π Π΅Π³ΠΈΠΎΠ½Ρ‹-Π΄Ρ‹Ρ€ΠΊΠΈ" Π² Ρ„ΠΎΡ€ΠΌΠ΅

formRgn: HRGN;

begin

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Π° для Ρ„ΠΎΡ€ΠΌΡ‹

formRgn := CreateRectRgn(0, 0, Width – 1, Height – 1);

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² для Β«Π΄Ρ‹Ρ€ΠΎΠΊΒ»

rgn1 := CreateEllipticRgn(10, 10, 100, 50);

rgn2 := CreateRoundRectRgn(10, 60, 200, 90, 10, 10);

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Β«Π΄Ρ‹Ρ€ΠΎΠΊΒ» Π² Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ Ρ„ΠΎΡ€ΠΌΡ‹

CombineRgn(formRgn, formRgn, rgn1, RGN_XOR);

CombineRgn(formRgn, formRgn, rgn2, RGN_XOR);

SetWindowRgn(Handle, formRgn, True);

//Π Π΅Π³ΠΈΠΎΠ½Ρ‹ для Β«Π΄Ρ‹Ρ€ΠΎΠΊΒ» большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹

DeleteObject(rgn1);

DeleteObject(rgn2);

end;

БлоТная комбинация Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТного, Π½ΠΎ ΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ интСрСсного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ созданию Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 1.9 (Π±Π΅Π»ΠΎΠ΅ пространство – это Π²Ρ‹Ρ€Π΅Π·Π°Π½Π½Ρ‹Π΅ части Ρ„ΠΎΡ€ΠΌΡ‹).

Рис. 1.9. БлоТная комбинация Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ производятся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 1.18.

...

Листинг 1.18.

БлоТная комбинация Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

procedure TfrmManyRgn.FormCreate(Sender: TObject);

var

r1, r2, r3, r4, r5, r6, r7: HRGN;

formRgn: HRGN;

butRgn: HRGN;

begin

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

r1 := CreateRoundRectRgn(100, 0, 700, 400, 40, 40);

r2 := CreateRectRgn(280, 0, 300, 399);

r3 := CreateRectRgn(500, 0, 520, 399);

r4 := CreateEllipticRgn(140, 40, 240, 140);

r5 := CreateEllipticRgn(0, 300, 200, 500);

r6 := CreateEllipticRgn(500, 40, 600, 140);

r7 := CreateEllipticRgn(540, 40, 640, 140);

//ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

//..Ρ€Π°Π·Ρ€Π΅Π·Ρ‹ Π² основном Ρ€Π΅Π³ΠΈΠΎΠ½Π΅

CombineRgn(r1, r1, r2, RGN_XOR);

CombineRgn(r1, r1, r3, RGN_XOR);

//..круглая Β«Π΄Ρ‹Ρ€ΠΊΠ°Β» Π² ΠΏΡ€Π°Π²ΠΎΠΉ сторонС

CombineRgn(r1, r1, r4, RGN_XOR);

//..присоСдинСниС ΠΊΡ€ΡƒΠ³Π° Π² Π»Π΅Π²ΠΎΠΉ Π½ΠΈΠΆΠ½Π΅ΠΉ части

CombineRgn(r1, r1, r5, RGN_OR);

//..созданиС Β«Π΄Ρ‹Ρ€ΠΊΠΈΒ» Π² Ρ„ΠΎΡ€ΠΌΠ΅ полумСсяца

CombineRgn(r7, r7, r6, RGN_DIFF);

CombineRgn(r1, r1, r7, RGN_XOR);

formRgn := CreateRectRgn(0, 0, 0, 0);

CombineRgn(formRgn, r1, 0, RGN_COPY);

DeleteObject(r1);

DeleteObject(r2);

DeleteObject(r3);

DeleteObject(r4);

DeleteObject(r5);

DeleteObject(r6);

DeleteObject(r7);

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΡ€ΡƒΠ³Π»ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ закрытия

butRgn := CreateEllipticRgn(50, 50, 150, 150);

SetWindowRgn(Button1.Handle, butRgn, False);

SetWindowRgn(Handle, formRgn, True);

end;

Π’ листингС подписано, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для создания ΠΊΠ°ΠΊΠΈΡ… элСмСнтов ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹. Π’ опСрациях ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ сСмь Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ². РасполоТСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² опСрациях Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 1.10.