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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ КПК ΠΈ смартфонов Π½Π° .NET Compact FrameworkΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 15

Автор АлСксандр Климов

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Point

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Point содСрТит ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ X ΠΈ Y для указания располоТСния Π½Π΅ΠΊΠΎΠ΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ .NET Compact Framework поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ конструктор для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Point, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ эти ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Point часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… DrawPolygon ΠΈ FillPolygon, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Rectangle

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Rectangle опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ располоТСниС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ мобильной вСрсии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ конструктор, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΏΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π°, ΡˆΠΈΡ€ΠΈΠ½Π΅ ΠΈ высотС, Ρ‡Ρ‚ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 6.8.

Листинг 6.8

Rectangle myRectangle = new Rectangled(10, 10, 70, 210);

ГрафичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ. Но сСйчас слСдуСт ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Π½ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с графичСскими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics. БущСствуСт нСсколько способов получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graphics, ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ достаточно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ

ΠœΠ΅Ρ‚ΠΎΠ΄ CreateGraphics Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ»ΠΈ элСмСнта управлСния позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈΠ»ΠΈ элСмСнтС управлСния. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ дСмонстрируСтся Π² листингС 6.9.

Листинг 6.9

Graphics g = this.CreateGraphics();

ΠœΠ΅Ρ‚ΠΎΠ΄ FromImage создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Image. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² графичСском Ρ„Π°ΠΉΠ»Π΅. ИспользованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 6.10.

Листинг 6.10

Bitmap bmp = new Bitmap(150, 90);

Graphics g = Graphics.FromImage(bmp);

ΠœΠ΅Ρ‚ΠΎΠ΄ OnPaint класса Form ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PaintEventArgs. Одним ΠΈΠ· Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics, связанный с Ρ„ΠΎΡ€ΠΌΠΎΠΉ. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnPaint класса Form, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Graphics ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° PaintEventArgs, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ Π² клиСнтской области Ρ„ΠΎΡ€ΠΌΡ‹. Π’Ρ‹Π·ΠΎΠ² этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 6.11.

Листинг 6.11

Protected override void OnPaint(PaintEventArgs e) {

 Graphics g = e.Graphics;

}

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· пСрСчислСнных способов доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Graphics, программист ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π»ΠΈΠ½ΠΈΠΈ, ΠΊΡ€ΠΈΠ²Ρ‹Π΅, изобраТСния ΠΈ тСкст ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘Π°ΠΌΡ‹Π΅ распространСнныС графичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π³Π»Π°Π²Ρ‹.

ΠœΠ΅Ρ‚ΠΎΠ΄ DrawImage рисуСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Image Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ экрана. ВсСго сущСствуСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Но Π² самой простой Π΅Π³ΠΎ вСрсии достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 6.12.

Листинг 6.12

g.DrawImage(myImage, 10, 10);

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DrawImage ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° экран Π½Π΅ всС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ. Π’ этом случаС Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ области ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 6.13. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ пСрСчислСниС GraphicsUnit.Pixel, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния.

Листинг 6.13

Bitmap myBMP = new Bitmap(@"\windows\banner.gif");

Rectangle portion = new Rectangle(1, 1, 150, 25);

g.DrawImage(myBMP, 20, 220, portion, GraphicsUnit.Pixel);

ΠœΠ΅Ρ‚ΠΎΠ΄ FillRectangle ΡƒΠΆΠ΅ примСнялся ΠΏΡ€ΠΈ рассмотрСнии кистСй. ΠœΠ΅Ρ‚ΠΎΠ΄ DrawRectangle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€ΠΎ вмСсто кисти, поэтому Π½Π° экран выводится Π½Π΅Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ достаточно ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ массив Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… прямыми ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°ΠΌΠΈ, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΡƒΡŽΡΡ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ. Для этого Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ DrawPolygon ΠΈ FillPolygon. Π’ листингС 6.14 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ простой Ρ€ΠΎΠΌΠ± ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ.

Листинг 6.14

// НарисуСм Ρ€ΠΎΠΌΠ±

// Π—Π°Π΄Π°Π΄ΠΈΠΌ массив Ρ‚ΠΎΡ‡Π΅ΠΊ

Point[] arrPoint = {

 new Point(150, 50),

 new Point(200, 100),

 new Point(150, 150),

 new Point(100, 100),

 new Point(150, 50),

};

g.DrawPolygon(bluePen, arrPoint);

Если всС рассмотрСнныС Ρ€Π°Π½Π΅Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‚ΠΎ Π½Π° экранС устройства Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ нСсколько графичСских ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 6.1.

Рис. 6.1. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² DrawPie ΠΈ FillPie

Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ .NET Compact Framework Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ графичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ DrawPiΠ΅ ΠΈ FillPie, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволяли Π±Ρ‹ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³ΠΎΠ²Ρ‹Π΅ сСкторы. Но ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою Π²Π΅Ρ€ΡΠΈΡŽ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ матСматичСскиС вычислСния, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 6.15.

Листинг 6.15

///<summary>

///РисуСм Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ сСктор

///ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

///g - ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Graphics

///solidBrush - ΠšΠΈΡΡ‚ΡŒ для закраски сСгмСнта

///x,y - ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π°

///width - Π¨ΠΈΡ€ΠΈΠ½Π° сСгмСнта

///height - Высота сСгмСнта

///startAngle - Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°

///endAngle - Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°

///</summary>

private void FillPie(Graphics g, SolidBrush solidBrush, int x, int y,

 int width, int height, double startAngle, double endAngle) {

 double[] xAngle = new double[12];

 double[] yAngle = new double[12];

 double angleIncrement = (endAngle - startAngle) / 10;

 double angle = startAngle;


 for (int i = 0; i <= 10; i++) {

  xAngle[i] = x + (Math.Cos(angle * (Math.PI / 180)) * (width / 2));

  yAngle[i] = y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2));

  angle += angleIncrement;

 }

 xAngle[11] = x + (Math.Cos(endAngle * (Math.PI / 180)) * (width / 2));

 yAngle[11] = y + (Math.Sin(endAngle * (Math.PI / 180)) * (height / 2));


 Point[] anglePoints = {

  new Point(x, y),

  new Point((int)xAngle[0], (int)yAngle[0]),

  new Point((int)xAngle[1], (int)yAngle[1]),

  new Point((int)xAngle[2], (int)yAngle[2]),

  new Point((int)xAngle[3], (int)yAngle[3]),

  new Point((int)xAngle[4], (int)yAngle[4]),

  new Point((int)xAngle[5], (int)yAngle[5]),

  new Point((int)xAngle[6], (int)yAngle[6]),

  new Point((int)xAngle[7], (int)yAngle[7]),

  new Point((int)xAngle[8], (int)yAngle[8]),

  new Point((int)xAngle[9], (int)yAngle[9]),

  new Point((int)xAngle[10], (int)yAngle[10]),

  new Point((int)xAngle[11], (int)yAngle[11])

 };


 g.FillPolygon(solidBrush, anglePoints);

}


///<summary>

/// РисуСм Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ сСктора

///g - ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Graphics

///pen - ΠŸΠ΅Ρ€ΠΎ для рисования сСгмСнта

///x,y - Π¦Π΅Π½Ρ‚Ρ€ сСгмСнта

///width - Π¨ΠΈΡ€ΠΈΠ½Π° сСгмСнта

///height - Высота

///startAngle - Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°

///endAngle - Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°

///</summary>

private void DrawPie(Graphics g, Pen pen, int x, int y,

 int width, int height, double startAngle, double endAngle) {

 double[] xAngle = new double[12];

 double[] yAngle = new double[12];

 double angleIncrement = (endAngle - startAngle) / 10;

 double angle = startAngle;


 for (int i = 0; i <= 10; i++) {

  xAngle[i] = x + (Math.Cos(angle * (Math.PI / 180)) * (width /2));

  yAngle[i] = y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2));

  angle += angleIncrement;

 }

 xAngle[11] = x + (Math.Cos(endAngle * (Math.PI / 180)) * (width / 2));

 yAngle[11] = y + (Math.Sin(endAngle * (Math.PI / 180)) * (height /2));


 Point[] anglePoints = {

  new Point(x, y),

  new Point((int)xAngle[0], (int)yAngle[0]),

  new Point((int)xAngle[1], (int)yAngle[1]),

  new Point((int)xAngle[2], (int)yAngle[2]),

  new Point((int)xAngle[3], (int)yAngle[3]),

  new Point((int)xAngle[4], (int)yAngle[4]),

  new Point((int)xAngle[5], (int)yAngle[5]),

  new Point((int)xAngle[6], (int)yAngle[6]),

  new Point((int)xAngle[7], (int)yAngle[7]),

  new Point((int)xAngle[8], (int)yAngle[8]),

  new Point((int)xAngle[9], (int)yAngle[9]),

  new Point((int)xAngle[10], (int)yAngle[10]),

  new Point((int)xAngle[11], (int)yAngle[11])

 };


 g.DrawPolygon(pen, anglePoints);

}


private void Form1_Paint(object sender, PaintEventArgs e) {

 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ нСсколько сСкторов Π½Π° экран

 DrawPie(e.Graphics, new Pen(Color.Red), 130, 165, 100, 100, 0, 45);

 FillPie(e.Graphics, new SolidBrush(Color.Green),

  120, 160, 100, 100, 46, 90);

 FillPie(e.Graphics, new SolidBrush(Color.Yellow),

  120, 160, 100, 100, 91, 120);

 FillPie(e.Graphics, new SolidBrush(Color.Blue),

  120, 160, 100, 100, 121, 260);

 FillPie(e.Graphics, new SolidBrush(Color.Red),

  120, 160, 100, 100, 261, 360);

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 6.2.

Рис. 6.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСкторов

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ рисунка для Ρ„ΠΎΡ€ΠΌΡ‹

К соТалСнию, .NET Compact Framework Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ свойство BackgroundImage, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создаСт Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ рисунок для Ρ„ΠΎΡ€ΠΌΡ‹. Но ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ программист ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±Π΅Π», пСрСопрСдСляя ΠΌΠ΅Ρ‚ΠΎΠ΄ OnPaint.