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

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

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

Однако использованиС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² для указания областСй отсСчСния совсСм Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ИспользованиС отсСчСния ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π΅ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π΅Π³ΠΈΠΎΠ½Ρƒ ΠΏΡ€ΠΈ рисовании ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° наглядно прСдставлСно Π½Π° рис. 1.3: Π° – ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹; Π± – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния; Π² – настоящий Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ рисования с отсСчСниСм ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π°.

Рис. 1.3. ИспользованиС области отсСчСния ΠΏΡ€ΠΈ рисовании ΠΎΠΊΠ½Π°

Рассмотрим ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

...

function CreateRectRgn(p1, p2, p3, p4: Integer): HRGN;

function CreateEllipticRgn(p1, p2, p3, p4: Integer): HRGN;

function CreateRoundRectRgn(p1, p2, p3, p4, p5, p6: Integer): HRGN;

ВсС пСрСчислСнныС здСсь ΠΈ Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ дСскриптор GDI-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«Ρ€Π΅Π³ΠΈΠΎΠ½Β». Он впослСдствии ΠΈ пСрСдаСтся Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ.

Π˜Ρ‚Π°ΠΊ, пСрвая ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (CreateRectRgn) ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для создания Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ p1 ΠΈ Ρ€2 – Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°;

β€’ Ρ€3 ΠΈ Ρ€4 – Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€Π°Π²ΠΎΠΉ Π½ΠΈΠΆΠ½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция – CreateEllipticRgn – ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для создания Ρ€Π΅Π³ΠΈΠΎΠ½Π° эллиптичСской Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ CreateRectRgn), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вписываСтся эллипс.

Π’Ρ€Π΅Ρ‚ΡŒΡ функция – CreateRoundRectRgn – создаСт Ρ€Π΅Π³ΠΈΠΎΠ½ – ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΡƒΠ³Π»Π°ΠΌΠΈ. ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateRectRgn. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€5 ΠΈ Ρ€Π± – ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота ΡΠ³Π»Π°ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΡƒΠ³Π»Ρ‹ эллипсов (рис. 1.4).

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

...

function CreatePolygonRgn(const Points; Count, FillMode: Integer): HRGN;

Рис. 1.4. ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateRoundRectRgn

Ѐункция CreatePolygonRgn ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

β€’ Points – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив записСй Ρ‚ΠΈΠΏΠ° TPoint, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива описываСт ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ;

β€’ Count – количСство записСй Π² массивС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Points;

β€’ FillMode – Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π° (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π² Ρ€Π΅Π³ΠΈΠΎΠ½).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ FillMode ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ значСния WINDING (ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ любая внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ) ΠΈΠ»ΠΈ ALTERNATE (ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Ссли ΠΎΠ½Π° находится ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠΉ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‡Π΅Ρ‚Π½ΠΎΠΉ сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°)....

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΈ создании Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ любой ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдполагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½. Π’Π°ΠΊ, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ° 40 Ρ… 30, Π»Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ располоТСн Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (100; 100), Ρ‚ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ для ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½ 20 Ρ… 15 с Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (0;0) ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateRectRgn с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (0, 0, 19, 14), Π° Π½Π΅ (100, 100, 119, 114).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π³ΠΈΠΎΠ½ являСтся GDI-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Π³Π». 6), Ρ‚ΠΎ для Π΅Π³ΠΎ удалСния, Ссли ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмой, примСняСтся функция удалСния GDI-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² DeleteObject:

...

function DeleteObject(p1: HGDIOBJ): BOOL;

Π Π΅Π³ΠΈΠΎΠ½ ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния ΠΏΡ€ΠΈ рисовании ΠΎΠΊΠ½Π°

Π‘Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмой. Π’Π°ΠΊ Π²ΠΎΡ‚, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ€Π΅Π³ΠΈΠΎΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΎΠΊΠ½Ρƒ Π² качСствС области отсСчСния, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ слСдуСт. Ѐункция назначСния Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΎΠΊΠ½Ρƒ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

...

function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer;

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли произвСсти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWindowRgn ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

β€’ hWnd – дСскриптор ΠΎΠΊΠ½Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ устанавливаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния (свойство Handle Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ»ΠΈ элСмСнта управлСния);

β€’ hRgn – дСскриптор Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Π² качСствС области отсСчСния (Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ создания Ρ€Π΅Π³ΠΈΠΎΠ½Π°);

β€’ bRedraw – Ρ„Π»Π°Π³ пСрСрисовки ΠΎΠΊΠ½Π° послС назначСния Π½ΠΎΠ²ΠΎΠΉ области отсСчСния, для Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, для Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… – False.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ копию Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния ΠΎΠΊΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetWindowRgn:

...

function GetWindowRgn(hWnd: HWND; hRgn: HRGN): Integer;

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – дСскриптор (Handle) ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π³ΠΎ нас ΠΎΠΊΠ½Π°. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – дСскриптор ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ созданного Ρ€Π΅Π³ΠΈΠΎΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² случаС успСха модифицируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetWindowRgn Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ становится ΠΊΠΎΠΏΠΈΠ΅ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния ΠΎΠΊΠ½Π°. Описания цСлочислСнных констант – Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

β€’ NULLREGION – пустой Ρ€Π΅Π³ΠΈΠΎΠ½;

β€’ SIMPLEREGION – Ρ€Π΅Π³ΠΈΠΎΠ½ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°;

β€’ COMPLEXREGION – Ρ€Π΅Π³ΠΈΠΎΠ½ слоТнСС, Ρ‡Π΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ;

β€’ ERROR – ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка (Π»ΠΈΠ±ΠΎ ΠΎΠΊΠ½Ρƒ Π·Π°Π΄Π°Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния).

Π”Π°Π»Π΅Π΅ приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetWindowRgn (прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ являСтся Ρ‚Π΅Π»ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса Ρ„ΠΎΡ€ΠΌΡ‹).

...

var rgn: HRGN;

begin

rgn:= CreateRectRgn(0,0,0,0); //ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°

//Ρ€Π΅Π³ΠΈΠΎΠ½Π° Π½Π΅ Π²Π°ΠΆΠ½Π°

if GetWindowRgn(Handle, rgn) <> ERROR then

begin

//ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠΎΠΏΠΈΠ΅ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния

//окна…

end;

DeleteObject(rgn); //ΠœΡ‹ пользовались ΠΊΠΎΠΏΠΈΠ΅ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ

//Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ (здСсь ΠΈΠ»ΠΈ Π² ΠΈΠ½ΠΎΠΌ мСстС,

//но сами)

end;

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ

ΠŸΡ€ΠΈ рассказС ΠΎ функциях создания Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ ΠΎ возмоТности комбинирования Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² для получСния слоТных Ρ„ΠΎΡ€ΠΌ. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ. ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CombineRgn:

...

function CombineRgn(p1, p2, p3: HRGN; p4: Integer): Integer;

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

β€’ p1 – Ρ€Π΅Π³ΠΈΠΎΠ½ (ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ созданный), ΠΊΡƒΠ΄Π° ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚;

β€’ Ρ€2, p3 – Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ;

β€’ Ρ€4 – Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌΠΈ.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ дСйствиС CombineRgn ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… значСниях ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€4 поясняСтся Π² Ρ‚Π°Π±Π». 1.2.

Π’Π°Π±Π»ΠΈΡ†Π° 1.2.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CombineRgn

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Π² Ρ‚Π°Π±Π». 1.2 констант, Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€4 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CombineRgn ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ RGNCOPY. Π’ этом случаС копируСтся Ρ€Π΅Π³ΠΈΠΎΠ½, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ€2, Π² Ρ€Π΅Π³ΠΈΠΎΠ½, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ p1.

Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ рассчитывая ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CombineRgn ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ самых ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌ, Π² Ρ‡Π΅ΠΌ Π²Ρ‹ смоТСтС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅.

НаконСц, послС тСорСтичСского отступлСния рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² создания ΠΈ прСобразования Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΡ… использованиСм для формирования области отсСчСния ΠΎΠΊΠΎΠ½ (Ρ„ΠΎΡ€ΠΌ ΠΈ элСмСнтов управлСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ…).

Π—Π°ΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ

Π‘Π½Π°Ρ‡Π°Π»Π° самыС простыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: созданиС Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π½ΠΈΠΌΠΈ. Π€ΠΎΡ€ΠΌΡ‹ всСх Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² содСрТат ΠΏΠΎ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ области отсСчСния.

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ для области отсСчСния ΠΎΠΊΠ½Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события FormCr eate. Однако это сдСлано Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для удобства ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ тСстирования ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒ вас Π½Π° ΠΌΡ‹ΡΠ»ΡŒ, Ρ‡Ρ‚ΠΎ этот способ являСтся СдинствСнно ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ. На самом Π΄Π΅Π»Π΅, Ссли Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠΎΠ½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… области отсСчСния слоТной Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‚ΠΎ старт прилоТСния (врСмя ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° запуска Π΄ΠΎ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹) ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π»ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ нСсколько сСкунд. Π’Π°ΠΊ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ всС Ρ„ΠΎΡ€ΠΌΡ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠΊΠ°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ (Π³Π»Π°Π²Π½ΠΎΠΉ) Ρ„ΠΎΡ€ΠΌΡ‹ (см. DPR-Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°). Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ, создавая Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π»ΠΈΠ±ΠΎ создавая Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ для областСй отсСчСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹.

Π˜Ρ‚Π°ΠΊ, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события FormCreate создаСтся ΠΎΠΊΠ½ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ΅ эллипса с трСмя ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ (листинг 1.10).

...

Листинг 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);