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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 29

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

1.2.7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ GDIDraw

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° GDIDraw дСмонстрируСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ возмоТности GDI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ классом TCanvas. Π’Ρ‹Π±Ρ€Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Windows NT/2000/XP, Π½ΠΎ ΠΈ Π² 9x/ME. Окно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 1.11.

Π’ своСй Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рисунок ΠΈΠ· стандартных ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ Delphi, прСдполагая, Ρ‡Ρ‚ΠΎ эти ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ установлСны Π² ΠΏΠ°ΠΏΠΊΡƒ "Π‘:\Program Files\Common Files\Borland Shared\Images". Если Ρƒ вас эти ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ установлСны Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ, ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ рисунок, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnCreate Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π» рисунок ΠΈΠ· Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²Π°ΠΌ Ρ„Π°ΠΉΠ»Π°. Π—Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ рисунок сохраняСтся Π² ΠΏΠΎΠ»Π΅ FBitmap Ρ„ΠΎΡ€ΠΌΡ‹.

Рис. 1.11. Окно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ GDIDraw


Основная Ρ€Π°Π±ΠΎΡ‚Π° выполняСтся Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnPaint Ρ„ΠΎΡ€ΠΌΡ‹. ΠœΡ‹ здСсь Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π° ΠΏΠΎ частям Π² соотвСтствии с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ каТдая Ρ‡Π°ΡΡ‚ΡŒ рисуСт. НачнСм с надписи Delphi Kingdom Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π° (листинг 1.34).

Листинг 1.34. Π’Ρ‹Π²ΠΎΠ΄ надписи Delphi Kingdom

var

 R: TRect;

...

// Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉΡΡ для отсСчСния.

// Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π° ΠΏΡ€ΠΈ

// Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ созданный Ρ€Π°Π½Π΅Π΅. ПолС FRgn

// содСрТит дСскриптор этого Ρ€Π΅Π³ΠΈΠΎΠ½Π°

if FRgn = 0 then

begin

 Canvas.Font.Name := 'Times New Roman';

 Canvas.Font.Style := [fsBold];

 Canvas.Font.Height := 69;

 // НачинаСм рисованиС Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. ВсС Π²Ρ‹Π·ΠΎΠ²Ρ‹

 // графичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, находящиСся ΠΌΠ΅ΠΆΠ΄Ρƒ BeginPath

 // ΠΈ EndPath, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π½Π° экран.

 // ВмСсто этого информация ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ рисуСтся, Π±ΡƒΠ΄Π΅Ρ‚

 // ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ GDI - Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ.

 BeginPath(Canvas.Handle);

 R := Rect(10, 10, 10 + FBitmap.Width, 10 + FBitmap.Height);

 // Если Π½Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetBkMode ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ

 // Ρ„ΠΎΠ½, Π² Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ Π±ΡƒΠΊΠ²,

 // Π½ΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ содСрТащих ΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… знакомСст.

 SetBkMode(Canvas.Handle, TRANSPARENT);

 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст "Delphi Kingdom", выравнивая Π΅Π³ΠΎ ΠΏΠΎ

 // Ρ†Π΅Π½Ρ‚Ρ€Ρƒ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ.

 DrawText(Canvas.Handle, 'Delphi'#13#10'Kingdom', -1, R,

  DT_CENTER or DT_VCENTER);

 EndPath(Canvas.Handle);

 // ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² Ρ€Π΅Π³ΠΈΠΎΠ½. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π°

 // этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ получится Ρ€Π΅Π³ΠΈΠΎΠ½, ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ

 // ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌΠΈ надписи "Delphi Kingdom",

 // сдСланной Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ.

 FRgn := PathToRegion(Canvas.Handle);

end;

// УстанавливаСм Ρ€Π΅Π³ΠΈΠΎΠ½ отсСчСния. ВсС, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

// ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½, ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚

// ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

SelectClipRgn(Canvas.Handle, FRgn);

// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ВсС, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

// Ρ€Π΅Π³ΠΈΠΎΠ½Π°, отсСкаСтся. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ надпись

// "Delphi Kingdom", ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‡Π΅Π½Π½ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Canvas.Draw(10, 10, FBitmap);

// ΠžΡ‚ΠΌΠ΅Π½ΡΠ΅ΠΌ отсСчСниС ΠΏΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Ρƒ

SelectClipRgn(Canvas.Handle, 0);

Если ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ ΠΊ надписи, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ внутрСнняя Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ² Π±ΡƒΠΊΠ² содСрТит Ρ‚ΠΎΡ‚ самый рисунок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ OnCreate (ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΌΡ‹ нарисовали этот рисунок Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π°Ρ„Π°Ρ€Π΅Ρ‚, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΡƒ надписи). По сути, Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ называСтся это Π½Π΅ Ρ‚Ρ€Π°Ρ„Π°Ρ€Π΅Ρ‚, Π° Ρ€Π΅Π³ΠΈΠΎΠ½ отсСчСния. Π Π΅Π³ΠΈΠΎΠ½ β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹. Бпособы примСнСния Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ (см. Ρ€Π°Π·Π΄. 1.3.3), ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… β€” это использованиС Ρ€Π΅Π³ΠΈΠΎΠ½Π° для отсСчСния графичСского Π²Ρ‹Π²ΠΎΠ΄Π°. Если ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½ отсСчСния для контСкста устройства, Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΌΡ‹ Π½ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ контСкст, всС, Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π° отсСчСния, игнорируСтся.

БоотвСтствСнно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ надпись, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΠ΅ с этой надписью. Π’ GDI Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для создания Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, Π½ΠΎ Π²ΠΎΡ‚ для создания Ρ€Π΅Π³ΠΈΠΎΠ½Π° Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π±ΡƒΠΊΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚. Π—Π°Ρ‚ΠΎ GDI ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ β€” Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, это Π½Π΅ совсСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, траСктория Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ дСскриптора (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, API Π½Π΅ прСдоставляСт этот дСскриптор ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ), ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ контСкстС устройства ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° траСктория. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BeginPath, заканчиваСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EndPath. ГрафичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ BeginPath ΠΈ EndPath, Π½Π΅ выводят Π½ΠΈΡ‡Π΅Π³ΠΎ Π² контСкст устройства, Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ, вмСсто этого запоминаСтся Π² Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (которая прСдставляСт собой ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Ρ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ…). Π‘ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (см., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Π΄. 1.3.4). Π’ нашСм случаС ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ BeginPath ΠΈ EndPath ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ DrawText. формируя Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ² Π±ΡƒΠΊΠ². Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PathToRegion ΠΌΡ‹ создаСм Ρ€Π΅Π³ΠΈΠΎΠ½, Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌΠΈ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‚.Π΅., Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Ρ€Π΅Π³ΠΈΠΎΠ½, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΠ΅ с надписью.

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

На самом Π΄Π΅Π»Π΅ Π½Π΅ всС графичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ BeginPath ΠΈ EndPath, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ ΠΊ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π­Ρ‚ΠΎ зависит ΠΎΡ‚ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ этот вопрос обсуТдаСтся Π² Ρ€Π°Π·Π΄. 1.3.4.

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

ВсС, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” это ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½ отсСчСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectClipRgn, ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ рисунок ΠΈ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΠΎΠ½ отсСчСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ мСшал Π² дальнСйшСм.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, ΠΊΠ°ΠΊ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ Π·Π²Π΅Π·Π΄Ρ‹ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π° (листинг 1.35).

Листинг 1.35. РисованиС Π·Π²Π΅Π·Π΄

var

 I: Integer;

 Star: array[0..4] of TPoint;

...

// Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° ΠΊΠΎΠΌΠ°Π½Π΄ рисуСт Π΄Π²Π΅ Π·Π²Π΅Π·Π΄Ρ‹ справа ΠΎΡ‚

// надписи. Π­Ρ‚ΠΈ Π·Π²Π΅Π·Π΄Ρ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ использованиС Π΄Π²ΡƒΡ…

// Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Π·Π°Π»ΠΈΠ²ΠΊΠΈ: WINDING ΠΈ ALTERNATE. Для простых

// Ρ„ΠΈΠ³ΡƒΡ€ эти Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ€Π°Π·Π½ΠΈΡ†Π°

// Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠΈ слоТных Ρ„ΠΈΠ³ΡƒΡ€,

// ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… самопСрСсСчСния.

Canvas.Pen.Style := psSolid;

Canvas.Pen.Width := 1;

Canvas.Pen.Color := clRed;

Canvas.Brush.Style := bsSolid;

Canvas.Brush.Color := clRed;

// ВычисляСм ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ Π·Π²Π΅Π·Π΄Ρ‹. Они ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ

// Π² массив Star Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС (Ссли ΠΏΠ΅Ρ€Π²ΠΎΠΉ

// ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΈ Π½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎ

// часовой стрСлкС ΠΎΡ‚ Π½Π΅Π΅): 1-3-5-2-4

for I := 0 to 4 do

begin

 Star[I].X := Round(380 + 90 * Sin(0.8 * I * Pi));

 Star[I].Y := Round(100 - 90 * Cos(0.8 * I * Pi));

end;

// УстанавливаСм Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ WINDING. ΠŸΡ€ΠΈ

// использовании этого Ρ€Π΅ΠΆΠΈΠΌΠ° Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ всС

// содСрТимоС ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ,

// ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ нарисован.

SetPolyFillMode(Canvas.Handle, WINDING);

Canvas.Polygon(Star);

// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π·Π²Π΅Π·Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅

// ΠΏΡ€Π°Π²Π΅Π΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ.

for I := 0 to 4 do Inc(Star([I].X, 200);

// УстанавливаСм Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ALTERNATE. ΠŸΡ€ΠΈ

// использовании этого Ρ€Π΅ΠΆΠΈΠΌΠ° Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅

// Π»ΠΈΠ½ΠΈΠΈ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠΉ ΠΈ Ρ‡Π΅Ρ‚Π½ΠΎΠΉ сторонами

// ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅

// Π·Π²Π΅Π·Π΄Ρ‹ оказываСтся Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ.

SetPolyFillMode(Canvas.Handle, ALTERNATE);

Canvas.Polygon(Star);

Π‘Π°ΠΌΠΎΠ΅ интСрСсноС здСсь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ Π·Π²Π΅Π·Π΄Ρ‹ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ практичСски ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, мСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ. Π‘Π½Π°Ρ‡Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ‚Ρ€ΠΈΠ³ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ Π·Π²Π΅Π·Π΄Ρ‹, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² массив Star ΠΈ эта Π·Π²Π΅Π·Π΄Π° рисуСтся с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ WINDING. ΠŸΡ€ΠΈ этом Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС Ρ‚ΠΎΡ‡ΠΊΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСтся условиС, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡, Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· этой Ρ‚ΠΎΡ‡ΠΊΠΈ, пСрСсСкаСт ΠΊΠΎΠ½Ρ‚ΡƒΡ€ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число Ρ€Π°Π·, Ρ‚.Π΅. всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ Π·Π²Π΅Π·Π΄Ρ‹ ΡΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π²ΠΏΡ€Π°Π²ΠΎ, ΠΈ такая ΠΆΠ΅ Π·Π²Π΅Π·Π΄Π° рисуСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Π½ΠΎ ΡƒΠΆΠ΅ с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ALTERNATE. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ оказались ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Π΅Ρ‚Π½ΠΎΠΉ ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠΉ сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΈ ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π²Π΅Π·Π΄Ρ‹ остаСтся Π½Π΅Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΌ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π²Π΅Π·Π΄Ρƒ ΠΌΡ‹ здСсь рисуСм с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса TCanvas, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ API-функциями.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” это рисованиС Ρ‡Π΅Ρ€Π½ΠΎΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ Π½Π° Ρ„ΠΎΠ½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π·Π΅Π»Π΅Π½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ. Π›ΠΈΠ½ΠΈΠΈ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Ρ€Π°ΠΌΠΊΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π½Ρ‚Ρ€ Ρ€Π°ΠΌΠΊΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ остаСтся ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ, Π° Π½Π΅ заливаСтся Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ„ΠΎΠ½Π°. Π‘Π°ΠΌΠ° Ρ€Π°ΠΌΠΊΠ° рисуСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PolyPolygon, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ нСсколькими Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹ΠΌΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌΠΈ (листинг 1.36).