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

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

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

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

Листинг 6.16

protected override void OnPaint(PaintEventArgs e) {

 // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΈΠ· рСсурсов Bitmap

 backgroundImage = new Bitmap(Assembly.GetExecutingAssembly().

  GetManifestResourceStream("BackgroundImageCS.sochicat.jpg"));


 e.Graphics.DrawImage(backgroundImage, this.ClientRectangle,

  new Rectangle(0, 0, backgroundImage.Width, backgroundImage.Height),

 GraphicsUnit.Pixel);

}

ПослС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ рисунок, Π° ΠΊΠ½ΠΎΠΏΠΊΠ° располоТСна ΠΏΠΎΠ²Π΅Ρ€Ρ… Ρ„ΠΎΠ½Π° (рис. 6.3).

Рис. 6.3. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΠΎΠ½Π° Ρ„ΠΎΡ€ΠΌΡ‹ своим рисунком

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рисунка

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .NET Compact Framework 1.0 Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ System.Drawing.Image.Clone, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ копию ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π»Π΅Π³ΠΊΠΎ обходится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ создания собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ возмоТности ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.17.

Листинг 6.17

// ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ всю ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ

protected Bitmap CopyBitmap(Bitmap source) {

 return new Bitmap(source);

}


// ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ

protected Bitmap CopyBitmap(Bitmap source, Rectangle part) {

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

 Graphics g = Graphics.FromImage(bmp);

 g.DrawImage(source, 0, 0, part, GraphicsUnit.Pixel);

 g.Dispose();

 return bmp;

}


private void button1_Click(object sender, EventArgs e) {

 Graphics g = CreateGraphics();

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


 // Половина ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ

 int left = myBMP.Size.Width / 2;

 // ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ всю ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Bitmap

 clone = CopyBitmap(myBMP);


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

 Bitmap part =

  CopyBitmap(myBMP, new Rectangle(0, 0, left, myBMP.Size.Height));


 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ‚Ρ€ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ:

 // источник, копию ΠΈ копию Π»Π΅Π²ΠΎΠΉ части

 int y = 10;


 // ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°-источник

 g.DrawImage(myBMP, 10, y);

 y += myBMP.Height + 10;


 // ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°-копия

 g.DrawImage(clone, 10, y);

 y += clone.Height + 10;


 // копия Π»Π΅Π²ΠΎΠΉ части ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ

 g.DrawImage(part, 10, y);

 y += part.Height + 10;

 g.Dispose();

}


private void button2_Click(object sender, EventArgs e) {

 Graphics g = CreateGraphics();

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

 g.Clear(Color.White);


 int left = myBMP.Size.Width / 2; // Копия ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ

 Bitmap clone = (Bitmap)myBMP.Clone();

 int y = 10;

 g.DrawImage(myBMP, 10, y);

 y += myBMP.Height + 10;

 g.DrawImage(clone, 10, y);

 y += clone.Height + 10;

 g.Dispose();

}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CopyImage. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΈΠ»ΠΈ Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ. Для сравнСния Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Clone, доступного Π² .NET Compact Framework 2.0. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ прилоТСния ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 6.4.

Рис. 6.4. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прозрачности

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .NET Compact Framework позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π°Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ограничСния Π½Π° эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. НапримСр, Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠ°ΠΊ MakeTransparent. Но Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° SetColorKey класса ImageAttributes. ΠŸΡ€ΠΈ этом Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚ для минимального ΠΈ максимального Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ImageAttributes.SetColorKey(Color.Color).

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Вторая пСрСгруТСнная вСрсия ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ImageAttributes.SetColorKey(Color, Color, ColorAdjustType) Π² .NET Compact Framework Π½Π΅ поддСрТиваСтся.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ красивых Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ стоит ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Для тСстового прилоТСния Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ Π΄Π²Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ являСтся Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΡ‚Π°, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ хранится нСбольшая Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ° с Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ, сдСланная Π·Π° нСсколько сСкунд Π² стандартной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Paint. ΠŸΡ€ΠΈ создании Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΈ Ρ„ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π»ΠΈΡ‚ красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ, Π° для тСкстовой строки Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΎΠ½. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±Π° рисунка Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ рСсурсы.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рассматриваСмый эффСкт, Π½Π°Π΄ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡŽ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ красный Ρ†Π²Π΅Ρ‚ сначала Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Основной ΠΊΠΎΠ΄ прилоТСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.18.

Листинг 6.18

private void butAddImage_Click(object sender, EventArgs e) {

 Graphics g = CreateGraphics();

 // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΠ· рСсурсов

 Bitmap imgCat = new Bitmap(Assembly.GetExecutingAssembly().

  GetManifestResourceStream("TransparentCS.mycat.jpg"));

 Bitmap imgName = new Bitmap(Assembly.GetExecutingAssembly().

  GetManifestResourceStream("Transparent_CS.catname.bmp"));

 g.DrawImage(imgCat, 0, 0,

  new Rectangle(0, 0, imgCat.Width, imgCat.Height), GraphicsUnit.Pixel);

 g.DrawImage(imgName, 50, 120,

  new Rectangle(0, 0, imgName.Width.imgName.Height), GraphicsUnit.Pixel);

 g.Dispose();

}


private void butImage2_Click(object sender, EventArgs e) {

 Graphics g = CreateGraphics();

 // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΠ· рСсурсов

 Bitmap imgCat = new BitmapCAssembly.GetExecutingAssembly().

  GetManifestResourceStream("Transparent_CS.mycat.jpg"));

 Bitmap imgName = new Bitmap(Assembly.GetExecutingAssembly().

  GetManifestResourceStream("Transparent_CS.catname.bmp"));

 // ΠžΡ‡ΠΈΡΡ‚ΠΈΠΌ экран

 g.Clear(Color.White);

 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ

 g.DrawImage(imgCat, 0, 0,

  new Rectangle(0, 0, imgCat.Width, imgCat.Height), GraphicsUnit.Pixel);


 ImageAttributes attr = new ImageAttributes();

 // УстанавливаСм красный Ρ†Π²Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ

 attr.SetColorKey(Color.Red, Color.Red);

 // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ с установлСнными Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ

 Rectangle dstRect = new Rectangle(50, 120, imgName.Width, imgName.Height);

 g.DrawImage(imgName, dstRect, 0, 0,

  imgName.Width, imgName.Height, GraphicsUnit.Pixel.attr);

 g.Dispose();

}

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

He Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΈΠΌΠ΅Π½ System.Drawing.Imaging ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с этим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ.

Если просто Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚, мягко говоря, Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ красивым (рис. 6.5).

Рис. 6.5. НСудачный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ налоТСния Π΄Π²ΡƒΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ

Если ΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ SetColorKey для установки ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ налоТСния Π΄Π²ΡƒΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ достойно (рис. 6.6).

Рис. 6.6. НалоТСниС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с использованиСм прозрачности

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ

Π’Π°ΠΊ ΠΊΠ°ΠΊ .NET Compact Framework Π½Π΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ встроСнными срСдствами, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ АлСксом Π―Ρ…Π½ΠΈΠ½Ρ‹ΠΌ (Alex Yakhnin) Π² Π΅Π³ΠΎ Π±Π»ΠΎΠ³Π΅ blog.opennetcf.org/ayakhnin/. Для достиТСния Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ эффСкта Π½Π°Π΄ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΠΈΡŽ Π»ΠΈΠ½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ эллипсы, ΠΈ Π·Π°ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΡΠΏΠ»ΠΎΡˆΠ½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ (рис. 6.7).

Рис. 6.7. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° со скруглСнным ΡƒΠ³Π»Π°ΠΌΠΈ

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.19.

Листинг 6.19

public static void DrawRoundedRectangle(Graphics g, Pen p, Color backColor,

 Rectangle rc, Size size) {

 Point[] points = new Point[8];

 // ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ для Ρ„ΠΈΠ³ΡƒΡ€Ρ‹

 points[0].X = rc.Left + size.Width / 2;

 points[0].Y = rc.Top + 1;

 points[1].X = rc.Right - size.Width / 2;

 points[1].Y = rc.Top + 1;

 points[2].X = rc.Right;

 points[2].Y = rc.Top + size.Height / 2;

 points[3].X = rc.Right;

 points[3].Y = rc.Bottom - size.Height / 2;

 points[4].X = rc.Right - size.Width / 2;

 points[4].Y = rc.Bottom;

 points[5].X = rc.Left + size.Width / 2;

 points[5].Y = rc.Bottom;

 points[6].X = rc.Left + 1;

 points[6].Y = rc.Bottom - size.Height / 2;

 points[7].X = rc.Left + 1;

 points[7].Y = rc.Top + size.Height / 2;


 // ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ ΠΊΠΈΡΡ‚ΡŒ для Ρ„ΠΎΠ½Π°

 Brush fillBrush = new SolidBrush(backColor);

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