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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 73

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² классС Form1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ мСстах, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нарисованы Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€ΡŒΡ ΠΈ кисти:

private Rectangle rectangleBounds =

 new Rectangle(new Point(0, 0), new Size(200, 200));

private Rectangle ellipseBounds =

 new Rectangle(new Point(50, 200), new Size(200, 150));

private Pen BluePen = new Pen(Color.Blue, 3);

private Pen RedPen = new Pen(Color.Red, 2);

private Brush SolidAzureBrush = Brushes.Azure;

private Brush CrossBrush = new HatchBrush(HatchStyle.Cross, Color.Azure);

static private Brush BrickBrush =

 new HatchBrush(HatchStyle.DiagonalBrick, Color.DarkGoldenrod, Color.Cyan);

private Pen BrickWidePen = new Pen(BrickBrush, 10);

ПолС BrickBrush объявлСно ΠΊΠ°ΠΊ статичСскоС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ BrickWidePen, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π»Π΅Π΅ слСдуСт. C# Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поля Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ экзСмпляра, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. Но объявлСниС поля ΠΊΠ°ΠΊ static Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр класса Form1, поэтому Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ поля статичСскими ΠΈΠ»ΠΈ полями экзСмпляра. Π’ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnPaint():

protected override void OnPaint(PaintEventArgs e ) {

 Graphics dc = e.Graphics;

 Point scrollOffset = this.AutoScrollPosition;

 dc.TranslateTransform(scrollOffset.X, scrollOffset.Y);

 if (e.ClipRectangle.Top+scrollOffset-X < 350 ||

     e.ClipRectangle.Left+scrollOffset.Y < 250) {

  dc.DrawRectangle(BluePen, rectangleBounds);

  dc.FillRectangle(CrossBrush, rectangleBounds);

  dc.DrawEllipse(RedPen, ellipseBounds);

  dc.FillEllipse(SolidAzureBrush, ellipseBounds);

  dc.DrawLine(BrickWidePen, rectangleBounds.Location,

   ellipseBounds.Location + ellipseBounds.Size);

 }

 base.OnPaint(e);

}

А это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ толстая диагональная линия Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ эллипса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π±Ρ‹Π» послСдний нарисованный элСмСнт.

Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

Одним ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных дСйствий, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDI+, являСтся Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² Ρ„Π°ΠΉΠ»Π΅. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ рисованиС своСго собствСнного интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ нарисовано. По сути Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΈΠΊΠ°Π·Π°Ρ‚ΡŒ GDI+ вывСсти Π΅Π³ΠΎ. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ простым графичСским рисунком, ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠ»ΠΈ слоТным ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ фотография. МоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ манипуляции с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ растягиваниС ΠΈ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ вывСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ прСдставим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Ρ‚Π΅ΠΌ обсудим нСсколько вопросов, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ прост.

Image MyImage = Image.FromFile("FileName"!);

FromFile() являСтся статичСским Ρ‡Π»Π΅Π½ΠΎΠΌ класса Image ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом создаСт экзСмпляр изобраТСния. Π€Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² графичСских Ρ„Π°ΠΉΠ»ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ .bmp, .jpg, .gif ΠΈ .png.

Π’Ρ‹Π²ΠΎΠ΄ изобраТСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ строку ΠΊΠΎΠ΄Π° Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ имССтся подходящий экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graphics:

dc.DrawImageUnscaled(MyImage, TopLeft);

Π’ этой строкС ΠΊΠΎΠ΄Π° dc прСдполагаСтся экзСмпляром ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graphics, MyImage являСтся Image, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½, a TopLeft β€” структурой Point, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ устройства, Π³Π΄Π΅ трСбуСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ простоС.

По всСй вСроятности, изобраТСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ с GDI, замСтят наибольшиС различия с GDI+. Π’ GDI Ρ€Π°Π±ΠΎΡ‚Π° с изобраТСниями Π±Ρ‹Π»Π° достаточно нСпрСдсказуСмой. Π’Ρ‹Π²ΠΎΠ΄ изобраТСния Π²ΠΊΠ»ΡŽΡ‡Π°Π» нСсколько Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… шагов. Если ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ задавалось ΠΊΠ°ΠΊ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΅Π³ΠΎ Π±Ρ‹Π»Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простой, Π½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π»Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² OLE. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ изобраТСния Π½Π° экран Π²ΠΊΠ»ΡŽΡ‡Π°Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ для Π½Π΅Π³ΠΎ дСскриптора, Π²Ρ‹Π±ΠΎΡ€ Π΅Π³ΠΎ Π² памяти контСкста устройства ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΡ‡Π½ΠΎΠ³ΠΎ пСрСноса ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами устройств. Π₯отя контСксты устройств ΠΈ дСскрипторы, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ находятся Π·Π° сцСной ΠΈ понадобятся, Ссли придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ (Π»ΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, простыС Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль GDI+.

ΠœΡ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ процСсс Π²Ρ‹Π²ΠΎΠ΄Π° изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° DisplayImage. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π°ΠΉΠ» .jpg Π² основном ΠΎΠΊΠ½Π΅ прилоТСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΏΡƒΡ‚ΡŒ доступа Ρ„Π°ΠΉΠ»Π° .jpg ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (поэтому ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² соотвСтствии с мСстополоТСниСм Ρ„Π°ΠΉΠ»Π° Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ систСмС). Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» .jpg являСтся Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ участников встрСчи COMFest.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² этой Π³Π»Π°Π²Π΅, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ DisplayImage являСтся стандартным ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Windows, созданным с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VisualStudio.NET. ΠœΡ‹ добавляСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ Π² класс Form1:

Image Piccy;

Π—Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ InitializeComponent.

private void InitializeComponent() {

 this.components = new System.ComponentModel.Container();

 this.Size = new System.Drawing.Size(600, 400);

 this.Text = "Display COMFEst Image";

 this.BackColor = Color.White;

 Piccy =

  Image.FromFile(@"C:\ProCSharp\Chapter21\Display Image\CF4Group.jpg");

 this.AutoScrollMinSize = Piccy.Size;

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния Π² пиксСлях задаСтся ΠΊΠ°ΠΊ Π΅Π³ΠΎ свойство Size, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для задания области Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ выводится Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ OnPaint():

protected override void OnPaint(PaintEventArgs e) {

 Graphics dc = e.Graphics;

 dc.DrawImageUnscaled(Piccy, this.AutoScrollPosition);

 base.OnPaint(e);

}

Π’Ρ‹Π±ΠΎΡ€ this.AutoScrollPosition Π² качСствС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΠΎΠ³ΠΎ устройства Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ этом Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° прокручивания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ с Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° клиСнтской области.

НаконСц, сдСлаСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎΠ± измСнСниях, сдСланных Π² ΠΊΠΎΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Form1.Dispose(), созданном мастСром:

public override void Dispose() {

 base.Dispose();

 if (components != null) components.Dispose();

 Piccy.Dispose();

}

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ изобраТСния, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π½Π΅ трСбуСтся, являСтся Π²Π°ΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ изобраТСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ памяти. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Image.Dispose() экзСмпляр Image большС Π½Π΅ ссылаСтся Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ поэтому Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ большС Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ (Ссли Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅).

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΊΠΎΠ΄Π° создаСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

COMFest (www.comfest.co.uk) являСтся Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² Π’Π΅Π»ΠΈΠΊΠΎΠ±Ρ€ΠΈΡ‚Π°Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ для обсуТдСния самых Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, ΠΎΠ±ΠΌΠ΅Π½Π° идСями ΠΈ Ρ‚. Π΄. Π‘Π½ΠΈΠΌΠΎΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всСх участников COMFest 4, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π°Π²Ρ‚ΠΎΡ€Π° этой Π³Π»Π°Π²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€ΠΎΠ²Π°Π».

Вопросы, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ манипуляциях с изобраТСниями

Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ, Π½ΠΎ всС ΠΆΠ΅ трСбуСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ описанной Π½ΠΈΠΆΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.

НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с изобраТСниями являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ всСгда ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Π΅. Π­Ρ‚ΠΎ Π½Π΅ просто удобство для людСй. Вакая Ρ„ΠΎΡ€ΠΌΠ° связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС соврСмСнныС графичСскиС ΠΏΠ»Π°Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ встроСнноС ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ эффСктивно ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ пиксСлСй ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ участка памяти Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠŸΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊ пиксСлСй прСдставляСт ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС выполняСтся практичСски ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° опСрация, ΠΈ поэтому Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ быстрым. На самом Π΄Π΅Π»Π΅ это ΠΊΠ»ΡŽΡ‡ ΠΊ соврСмСнной Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅. Вакая опСрация называСтся пСрСносом Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² (BitBlt). Image.DrawImageUnscaled() Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ BitBlt, Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащСС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ пиксСлСй (фотография ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ 104975 пиксСлСй) ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ. Если Π±Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° экран пиксСль Π·Π° пиксСлСм, Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ постСпСнно появлялось Π±Ρ‹ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСкунд.

ΠœΠ΅Ρ‚ΠΎΠ΄ BitBlt ΠΎΡ‡Π΅Π½ΡŒ эффСктивСн, поэтому ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ рисования ΠΈ манипуляции с изобраТСниями Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ. Π”Π°ΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BitBlt, пСрСнося части ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами устройств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ области памяти. ΠŸΡ€ΠΈ использовании GDI функция BitBlt() ΠΈΠ· API Windows 32 Π±Ρ‹Π»Π°, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, самой Π²Π°ΠΆΠ½ΠΎΠΉ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для манипуляции изобраТСниями, хотя Π² GDI+ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ BitBlt ΠΏΠΎ большСй части скрыты ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ модСлью GDI+.

НСвозмоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ BitBlt для областСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Один ΠΈΠ· способов состоит Π² ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ для Ρ†Π΅Π»Π΅ΠΉ BitBlt поэтому данная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ-источникС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ†Π²Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ пиксСля Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΌ устройствС. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² процСссС выполнСния BitBlt ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ изобраТСния Π±ΡƒΠ΄Π΅Ρ‚ сформирован ΠΏΠ΅Ρ€Π΅Π΄ BitBlt Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ AND) Π½Π° Ρ†Π²Π΅Ρ‚Π°Ρ… этого пиксСля Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ-источникС ΠΈ Π² ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΌ устройствС. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ускоритСлСм ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для задания ряда Ρ‚ΠΎΠ½ΠΊΠΈΡ… эффСктов. НС рассматривая Π΄Π΅Ρ‚Π°Π»ΠΈ процСсса, ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ DrawImage(). Он Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ DrawImageUnscaled(), Π½ΠΎ поставляСтся с большим числом ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… вСрсий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС Ρ„ΠΎΡ€ΠΌΡ‹ BitBlt для использования Π² процСссС рисования. DrawImage() позволяСт Ρ‚Π°ΠΊΠΆΠ΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ (BitBlt) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ часта изобраТСния, ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°) ΠΏΡ€ΠΈ Π΅Π³ΠΎ рисовании.