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

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

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

 Brush fillBrush = new SolidBrush(backColor);

 // рисуСм ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ ΠΈ ΠΊΡ€ΡƒΠ³ΠΈ для ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

 g.DrawLine(p, rc.Left + size.Width / 2, rc.Top,

  rc.Right - size.Width / 2, rc.Top);

 g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Top,

  size.Width, size.Height);

 g.DrawEllipse(p, rc.Right - size.Width, rc.Top, size.Width, size.Height);

 g.DrawLine(p, rc.Right, rc.Top + size.Height / 2, rc.Right,

  rc.Bottom - size.Height /2);

 g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Bottom - size.Height,

  size.Width, size.Height);

 g.DrawEllipse(p, rc.Right - size.Width, rc.Bottom - size.Height,

  size.Width, size.Height);


 g.DrawLine(p, rc.Right - size.Width / 2, rc.Bottom,

  rc.Left + size.Width / 2, rc.Bottom);

 g.FillEllipse(fillBrush, rc.Left, rc.Bottom - size.Height,

  size.Width, size.Height);

 g.DrawEllipse(p, rc.Left, rc.Bottom - size.Height,

  size.Width, size.Height);


 g.DrawLine(p, rc.Left, rc.Bottom - size.Height / 2,

  rc.Left, rc.Top + size.Height / 2);

 g.FillEllipse(fillBrush. rc.Left, rc.Top, size.Width, size.Height);

  g.DrawEllipse(p, rc.Left, rc.Top, size.Width. size.Height);


 // заполняСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, скрывая Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ эллипсы

 g.FillPolygon(fillBrush, points);

 // освобоТдаСм рСсурсы

 fillBrush.Dispose();

}


private void butDrawRoundedRectangle_Click(object sender, EventArgs e) {

 Graphics g = CreateGraphics();

 Rectangle rc = new Rectangle(10, 10, 200, 50);

 DrawRoundedRectangle(g,

  new Pen(Color.Black), Color.CadetBlue, rc, new Size(8, 8));

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 6.8.

Рис. 6.8. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° со скруглСнными ΡƒΠ³Π»Π°ΠΌΠΈ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экранных снимков

Если ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ устройством Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρ‹, Ρ‚ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ замысла Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС устройства. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ просто ΡΡ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экран, Π½ΠΎ настоящий программист Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π³Π»Π°Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ копирования ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области ΠΎΠΊΠ½Π°, всСго Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ»ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Для дСмонстрации ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ список, Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΉΠΌΠ΅Ρ€. Π‘Π°ΠΌ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.20.

Листинг 6.20

[DllImport("coredll.dll", EntryPoint = "GetDesktopWindow")]

public static extern IntPtr GetDesktopWindow();

[DllImport("coredll.dll", EntryPoint = "GetDC")]

public static extern IntPtr GetDC(IntPtr hWnd);

[DllImport("coredll.dll", EntryPoint = "ReleaseDC")]

public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("coredll.dll")]

public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest,

 int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);

 const int SRCCOPY = 0x00CC0020;


private void screenshot(string filename, Graphics gx, Rectangle rect) {

 Bitmap bmp = new Bitmap(rect.Width, rect.Height);

 Graphics g = Graphics.FromImage(bmp);

 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, gx.GetHdc(),

  rect.Left, rect.Top, SRCCOPY);

 bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);

 bmp.Dispose();

 g.Dispose();

}


private void butPartOfWindow_Click(object sender, EventArgs e) {

 // Π”Π΅Π»Π°Π΅ΠΌ снимок списка

 ScreenShot(@"\My Documents\save.bmp", this.CreateGraphics(),

  listBox1.Bounds);

}


private void butScreen_Click(object sender, EventArgs e) {

 // Π”Π΅Π»Π°Π΅ΠΌ снимок экрана

 Rectangle rect = new Rectangle(0,0,240,240);

 Bitmap bmp = new Bitmap(rect.Width, rect.Height);

 Graphics g = Graphics.FromImage(bmp);

 IntPtr hwnd = GetDesktopWindow();

 IntPtr hdc = GetDC(hwnd);

 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,

  rect.Top, SRCCOPY);

 bmp.Save(@"\My Documents\screen.bmp",

 System.Drawing.Imaging.ImageFormat.Bmp);

 // ОсвобоТдаСм рСсурсы

 ReleaseDC(hwnd, hdc);

 bmp.Dispose();

 g.Dispose();

}


private void timer1_Tick(object sender, EventArgs e) {

 // Π”Π΅Π»Π°Π΅ΠΌ снимок экрана Ρ‡Π΅Ρ€Π΅Π· 5 сСкунд

 Rectangle rect = new Rectangle(0, 0. 240, 240);

 Bitmap bmp = new Bitmap(rect.Width, rect.Height);

 Graphics g = Graphics.FromImage(bmp);

 IntPtr hwnd = GetDesktopWindow();

 IntPtr hdc = GetDC(hwnd);

 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,

  rect.Top, SRCCOPY);

 bmp.Save(@"\My Documents\5sec.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

 // ОсвобоТдаСм рСсурсы

 ReleaseDC(hwnd, hdc);

 bmp.Dispose();

 g.Dispose();

 timer1.Enabled = false;

}


private void but5Sec_Click(object sender, EventArgs e) {

 timer1.Enabled = true;

}

Ѐункция ScreenShot позволяСт быстро ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ участок экрана ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² графичСском Ρ„Π°ΠΉΠ»Π΅. Π’ рассмотрСнном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ внСшний Π²ΠΈΠ΄ списка сохраняСтся Π² Ρ„Π°ΠΉΠ»Π΅ listbox.bmp. Для этого достаточно Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π°, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graphics ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ списка ListBox. Для получСния снимка экрана ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ нСсколько ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GetDesktopWindow ΠΈ GetDC.

Если Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ снимок Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ придСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ. ПослС запуска Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² распоряТСнии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±ΡƒΠ΄Π΅Ρ‚ 5 сСкунд, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ сдСлаСт снимок экрана.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ File Explorer Π½Π°ΠΉΡ‚ΠΈ сохранСнныС Ρ„Π°ΠΉΠ»Ρ‹.

Π’ΠΠ˜ΠœΠΠΠ˜Π•

НуТно ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Bitmap.Save(). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Windows Mobile 2003 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .NET Compact Framework Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сохранСниС графичСских Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… GIF, JPEG ΠΈΠ»ΠΈ PNG. Π‘ΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ BMP. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π²ΠΎ врСмя написания ΠΊΠΎΠ΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ ошибки ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Однако ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ NotSupportedException. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² Windows Mobile 5.0 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ графичСских Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ Lockbits

Π’ .NET Compact Framework 2.0 появилась ограничСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° LockBits, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массивом пиксСлов изобраТСния. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ ImageLockMode Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ значСния ReadWrite, ReadOnly ΠΈ WriteOnly. А пСрСчислСниС PixelFormat ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ значСния, пСрСчислСнныС Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ спискС:

β–‘ Format16bppRgb555;

β–‘ Format16bppRgb565;

β–‘ Format24bppRgb;

β–‘ Format32bppRgb.

На сайтС MSDN ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΡΡ‚Π°Ρ‚ΡŒΡŽ Β«How to: Use LockBitsΒ» с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ создаСтся ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΈ мСняСтся ΠΈΠ½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ синих пиксСлов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° LockBits. Π’ листингС 6.21 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ для большСй наглядности ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Листинг 6.21

private Bitmap CreateBitmap(int width, int height) {

 Bitmap bmp = new Bitmap(@"\Windows\msn.gif");

 width = bmp.Size.Width;

 height = bmp.Size.Height;

 Graphics g = Graphics.FromImage(bmp);

 g.Dispose();

 return bmp;

}


protected override void OnPaint(PaintEventArgs e) {

 Bitmap bmp = CreateBitmap(100, 100);

 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ-ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»

 e.Graphics.DrawImage(bmp, 0, 0);

 MakeMoreBlue(bmp);

 // РисуСм ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π½ΠΈΠΆΠ΅ исходного изобраТСния

 e.Graphics.DrawImage(bmp, 0, 50);

 bmp.Dispose();

}


private void MakeMoreBlue(Bitmap bmp) {

 // Π—Π°Π΄Π°Ρ‘ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ Ρ†Π²Π΅Ρ‚Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ изобраТСния

 PixelFormat pxf = PixelFormat.Format24bppRgb;

 // Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² памяти

 Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

 BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ адрСс ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ

 IntPtr ptr = bmpData.Scan();

 // Массив, содСрТащий Π±Π°ΠΉΡ‚Ρ‹ изобраТСния

 int numBytes = bmp.Width * bmp.Height * 3;

 byte[] rgbValues = new byte[numBytes];

 // ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ значСния RGB Π² массив

 Marshal.Copy(ptr, rgbValues, 0, numBytes);

 // ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, устанавливая

 // синий Ρ†Π²Π΅Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅

 for (int counter = 0; counter < rgbValues.Length; counter += 6)

  rgbValues[counter] = 255;

 // ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ значСния RGB ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

 Marshal.Π‘ΠΎΡ€Ρƒ(rgbValues, 0, ptr, numBytes);

 // Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Π±ΠΈΡ‚Ρ‹ Π² памяти

 bmp.UnlockBits(bmpData);

}

ПослС запуска прилоТСния Π½Π° экранС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½ΠΈΠΆΠ½Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π½Π°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ².

ГрафичСский Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€

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

Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сводится ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ событий ΠΌΡ‹ΡˆΠΈ MouseDown, MouseMove ΠΈ MouseUp. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ создания графичСских эффСктов Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ², примСняСмых Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…. Π― взял Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ· своСй ΠΊΠ½ΠΈΠ³ΠΈ Β«Π—Π°Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Visual Basic .NETΒ» ΠΈ пСрСнСс ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ синтаксиса языка Π‘#, Ρ‡Ρ‚ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ листинг 6.22.