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

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

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

Рис. 1.10. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для получСния Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π° рис. 1.9.

ИспользованиС шаблона

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

Если Π΅ΡΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°, ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€ΠΈ построСнии Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ само ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, отбирая всС Ρ‚ΠΎΡ‡ΠΊΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ условиС. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ шаблоном, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ «вырСзаСтся» Ρ€Π΅Π³ΠΈΠΎΠ½ Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹.

Рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, каТдая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½, Ссли Π΅Π΅ Ρ†Π²Π΅Ρ‚ Π½Π΅ совпадаСт с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ„ΠΎΠ½Π°. ΠŸΡ€ΠΈ этом ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ анализируСтся ΠΏΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ «скан-линиям», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ построчно. Из подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π΅ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ шаблона ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π° рис. 1.11.

Рис. 1.11. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ растрового изобраТСния-шаблона

Ѐункция построСния Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ способом ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 1.19.

...

Листинг 1.19. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ

function RegionFromPicture(pict: TPicture; backcolor: TColor):

HRGN;

var

rgn, resRgn: HRGN;

x, y, xFirst: Integer;

begin

resRgn := CreateRectRgn(0, 0, 0, 0); //Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½

//АнализируСм ΠΊΠ°ΠΆΠ΄ΡƒΡŽ скан-линию рисунка (ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ)

for y := 0 to pict.Height – 1 do

begin

x := 0;

while x < pict.Width do

begin

if (pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) then

begin

xFirst := x;

Inc(x);

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ, ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Π½ΠΎΠΉ Π½Π΅ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ„ΠΎΠ½Π°

while (x < pict.Width) and

(pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) do Inc(x);

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½ для части скан-Π»ΠΈΠ½ΠΈΠΈ ΠΈ добавляСм Π΅Π³ΠΎ

//ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΡƒΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π³ΠΈΠΎΠ½Ρƒ

rgn := CreateRectRgn(xFirst, y, x–1, y+1);

CombineRgn(resRgn, resRgn, rgn, RGN_OR);

DeleteObject(rgn);

end;

Inc(x);

end;

end;

RegionFromPicture := resRgn;

end;

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния-шаблона ΠΈ созданиС Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 1.20).

...

Листинг 1.20.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Π° для области отсСчСния Ρ„ΠΎΡ€ΠΌΡ‹

procedure TfrmTemplate.FormCreate(Sender: TObject);

var

pict: TPicture;

begin

//Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния ΠΈ созданиС Ρ€Π΅Π³ΠΈΠΎΠ½Π° (считаСм, Ρ‡Ρ‚ΠΎ

//Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° – Π±Π΅Π»Ρ‹ΠΉ)

pict := TPicture.Create;

pict.LoadFromFile(\'back.bmp\');

SetWindowRgn(Handle, RegionFromPicture(pict, RGB(255,255,255)),

True);

end;

Π’ листингС 1.20 подразумСваСтся использованиС Ρ„Π°ΠΉΠ»Π° back.bmp, находящСгося Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρ„Π°ΠΉΠ» прилоТСния. Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° – Π±Π΅Π»Ρ‹ΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли шаблон, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 1.11, хранится Π² Ρ„Π°ΠΉΠ»Π΅ back. bmp, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΡƒ, ΠΊΠ°ΠΊ Π½Π° рис. 1.12.

Рис. 1.12. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ построСния Ρ€Π΅Π³ΠΈΠΎΠ½Π° ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ

1.5. НСмного ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½

ΠšΡ€ΠΎΠΌΠ΅ придания Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΎΠΊΠ½Π°ΠΌ прилоТСния способами, рассмотрСнными Π²Ρ‹ΡˆΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ нСсколько Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ интСрфСйс Π·Π° счСт ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования пСрСмСщСния ΠΎΠΊΠΎΠ½. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ области, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) Ρ„ΠΎΡ€ΠΌΡƒ. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт способ Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ°ΠΌΠΎΠΌΡƒΠ·Π°Π΄Π°Π²Π°Ρ‚ΡŒ располоТСниС элСмСнтов управлСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

Π—Π΄Π΅ΡΡŒ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π·Π° Π»ΡŽΠ±ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ клиСнтской области) продСмонстрировано, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΆΠ½Ρ‹Ρ… элСмСнтов ΠΎΠΊΠ½Π°. Под элСмСнтами ΠΎΠΊΠ½Π° здСсь ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ΡΡ:

β€’ строка Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для отобраТСния тСкста Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Π½ΠΎ ΠΈ слуТит ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΌΡ‹ΡˆΡŒΡŽ);

β€’ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΊΠ½Π° (ΠΏΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ, Π½ΠΈΠΆΠ½Π΅ΠΉ, ΠΏΡ€Π°Π²ΠΎΠΉ ΠΈ Π»Π΅Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π°, Ссли, ΠΏΡ€Π°Π²Π΄Π°, ΡΡ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π° это допускаСт);

β€’ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΡƒΠ³Π»Π° ΠΎΠΊΠ½Π° (ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΡ‹ΡˆΠΈ);

β€’ систСмныС ΠΊΠ½ΠΎΠΏΠΊΠΈ – закрытия, разворачивания, сворачивания, контСкстной справки (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ располоТСны Π² строкС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π°);

β€’ полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ – Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ;

β€’ систСмноС мСню (раскрываСтся ΠΏΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π° Π·Π½Π°Ρ‡ΠΊΠ΅ ΠΎΠΊΠ½Π°);

β€’ мСню – полоса мСню, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Π²Π΅Ρ€Ρ…Ρƒ ΠΎΠΊΠ½Π°;

β€’ клиСнтская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ – ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС пространство ΠΎΠΊΠ½Π°, ΠΊΡ€ΠΎΠΌΠ΅ строки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, мСню ΠΈ полос ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ.

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

Как Π²Ρ‹, скорСС всСго, ΡƒΠΆΠ΅ догадались, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² свой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния WM_NCHITTEST, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнтов ΠΎΠΊΠ½Π°. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² листингС 1.21.

...

Листинг 1.21. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

procedure TfrmMoveClient.WMNCHitTest(var Message: TWMNCHitTest);

var

rc: TRect;

p: TPoint;

begin

//Если Ρ‚ΠΎΡ‡ΠΊΠ° приходится Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Ρ‚ΠΎ заставим

//систСму ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ строки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

rc := GetClientRect();

p.X := Message.XPos;

p.Y := Message.YPos;

p := ScreenToClient(p);

if PtInRect(rc, p) then

Message.Result := HTCAPTION

else

//ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Message.Result := DefWindowProc(Handle, Message.Msg, 0,

65536 * Message.YPos + Message.XPos);

end;

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 1.21 ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пСрСопрСдСляСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, возвращая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ HTCAPTION. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния (цСлочислСнныС константы, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DefWindowProc):

β€’ HTBORDER – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ находится Π½Π°Π΄ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ ΠΎΠΊΠ½Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° Π½Π΅ измСняСтся);

β€’ ΠΠ’Π’ΠžΠ’Π’ΠžΠœ, НВВОР, HTLEFT, HTRIGHT – Π½Π°Π΄ Π½ΠΈΠΆΠ½Π΅ΠΉ, Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ, Π»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ ΠΎΠΊΠ½Π° соотвСтствСнно (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, «потянув» Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ);

β€’ HTBOTTOMLEFT, HTBOTTOMRIGHT, HTTOPLEFT, HTTOPRIGHT – Π’ Π»Π΅Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ, ΠΏΡ€Π°Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ, Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ);

β€’ HTSIZE, HTGROWBOX – Π½Π°Π΄ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π°);

β€’ HTCAPTION – Π½Π°Π΄ строкой Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π° (Π·Π° это мСсто ΠΎΠΊΠ½ΠΎ пСрСмСщаСтся);

β€’ HTCLIENT – Π½Π°Π΄ клиСнтской ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΎΠΊΠ½Π°;

β€’ HTCLOSE – Π½Π°Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ закрытия ΠΎΠΊΠ½Π°;

β€’ HTHELP – Π½Π°Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²Π° контСкстной справки;

β€’ HTREDUCE, HTMINBUTTON – Π½Π°Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ½Π°;

β€’ HTZOOM, HTMAXBUTTON – Π½Π°Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ максимизации ΠΎΠΊΠ½Π°;

β€’ HTMENU – Π½Π°Π΄ полоской мСню ΠΎΠΊΠ½Π°;

β€’ HTSYSMENU – Π½Π°Π΄ Π·Π½Π°Ρ‡ΠΊΠΎΠΌ ΠΎΠΊΠ½Π° (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° систСмного мСню);

β€’ HTHSCROLL, HTVSCROLL – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ находится Π½Π°Π΄ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ полосой ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ соотвСтствСнно;

β€’ HTTRANS PARENT – Ссли возвращаСтся это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ сообщСниС пСрСсылаСтся ΠΎΠΊΠ½Ρƒ, находящСмуся ΠΏΠΎΠ΄ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ (ΠΎΠΊΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ);

β€’ HTNOWHERE – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ находится Π½Π°Π΄ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· областСй ΠΎΠΊΠ½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΊΠ½Π°ΠΌΠΈ);

β€’ HTERROR – Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ NTNOWHERE, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ этого значСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (DefWindowProc) воспроизводит систСмный сигнал, говорящий ΠΎΠ± ошибкС.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ элСмСнты управлСния

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ совсСм нСслоТный, Π½ΠΎ довольно интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ прямо Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшний Π²ΠΈΠ΄ прилоТСния, пСрСмСщая ΠΈ измСняя Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнтов управлСния Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠΊΠ½Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ вас Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ, сразу ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π˜Ρ‚Π°ΠΊ, Π½Π° рис. 1.13 ΠΏΠΎΠΊΠ°Π·Π°Π½ внСшний Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Рис. 1.13. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ устанавливаСм Ρ„Π»Π°ΠΆΠΎΠΊ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнтов управлСния ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 1.14.

Рис. 1.14. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ (Ρ„Π»Π°ΠΆΠΎΠΊ Π½Π΅ учитываСтся)

ВыполняСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ пСрСмСщСния, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠΎΠ½, Π·Π°Π½ΡΠ²ΡˆΠΈΡ… мСсто элСмСнтов управлСния, снимаСм Ρ„Π»Π°ΠΆΠΎΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ интСрфСйс Ρ„ΠΎΡ€ΠΌΡ‹ (рис. 1.15).

Рис. 1.15. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ послС пСрСмСщСния элСмСнтов управлСния

Как ΠΆΠ΅ достигнут ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ эффСкт? ΠžΡ‡Π΅Π½ΡŒ Π΄Π°ΠΆΠ΅ просто. Π’Π΅Π΄ΡŒ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ элСмСнты управлСния Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ своих собствСнных ΠΎΠΊΠΎΠ½ (Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΎΠΊΠ½Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹). Окна элСмСнтов ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ отсутствиС Π² ΠΈΡ… стилС Ρ„Π»Π°Π³ΠΎΠ² (ΠΏΠΎ – Π΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Π³Π». 2), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ€Π°ΠΌΠΊΡƒ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° элСмСнта управлСния. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π² Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ Π² стилС ΠΎΠΊΠ½Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWindowLong. Для удобства ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π° Ρ„Π»Π°Π³Π°ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для пСрСмСщСния ΠΈ измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (ΠΊΠ°ΠΊ, собствСнно, ΠΈ сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) (лис – Ρ‚ΠΈΠ½Π³ 1.22).