Прозрачные изображения с помощью С# WinForms
Я работаю над приложением Windows Forms в VS 2008, и хочу отображать одно изображение поверх другого, причем верхнее изображение представляет собой gif или что-то с прозрачными частями.
В основном у меня есть большое изображение, и я хочу поместить небольшое изображение сверху, если это так, чтобы они выглядели как одно изображение для пользователя.
Я пытаюсь использовать Picturebox, но это, похоже, не сработало, никаких предложений?
Ответы
Ответ 1
Я был в аналогичной ситуации пару дней назад. Вы можете создать прозрачный элемент управления для размещения вашего изображения.
using System;
using System.Windows.Forms;
using System.Drawing;
public class TransparentControl : Control
{
private readonly Timer refresher;
private Image _image;
public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.Transparent;
refresher = new Timer();
refresher.Tick += TimerOnTick;
refresher.Interval = 50;
refresher.Enabled = true;
refresher.Start();
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
protected override void OnMove(EventArgs e)
{
RecreateHandle();
}
protected override void OnPaint(PaintEventArgs e)
{
if (_image != null)
{
e.Graphics.DrawImage(_image, (Width / 2) - (_image.Width / 2), (Height / 2) - (_image.Height / 2));
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
//Do not paint background
}
//Hack
public void Redraw()
{
RecreateHandle();
}
private void TimerOnTick(object source, EventArgs e)
{
RecreateHandle();
refresher.Stop();
}
public Image Image
{
get
{
return _image;
}
set
{
_image = value;
RecreateHandle();
}
}
}
Ответ 2
PictureBox имеет 2 слоя изображений: BackgroundImage и Image, которые вы можете использовать независимо друг от друга, включая рисование и очистку.
Ответ 3
Поместите большое/нижнее изображение на PictureBox
, затем добавьте обработчик к событию OnPaint
и используйте одну из перегрузок e.Graphics.DrawImage()
. Вы можете загрузить изображение с помощью Image.FromFile()
.
Маленькое/верхнее изображение должно иметь альфа-канал и быть прозрачным в фоновом режиме для работы наложения. Вы должны быть в состоянии обеспечить это довольно легко в Photoshop или что-то подобное. Убедитесь, что вы сохраняете формат, поддерживающий альфа-канал, например PNG.
Ответ 4
Код vb.net(все кредиты Леон Тайсон):
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Public Class TransparentControl
Inherits Control
Private ReadOnly Local_Timer As Timer
Private Local_Image As Image
Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
BackColor = Color.Transparent
Local_Timer = New Timer
With Local_Timer
.Interval = 50
.Enabled = True
.Start()
End With
AddHandler Local_Timer.Tick, AddressOf TimerOnClick
End Sub
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim cp As CreateParams
cp = MyBase.CreateParams
cp.ExStyle = &H20
Return cp
End Get
End Property
Protected Overrides Sub OnMove(ByVal e As System.EventArgs)
MyBase.OnMove(e)
RecreateHandle()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
If Local_Image IsNot Nothing Then _
e.Graphics.DrawImage(Local_Image, New Rectangle(0, 0, (Width / 2) - (Local_Image.Width / 2), (Height / 2) - (Local_Image.Height / 2)))
End Sub
Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
' DO NOT PAINT BACKGROUND
End Sub
''' <summary>
''' Hack
''' </summary>
''' <remarks></remarks>
Public Sub ReDraw()
RecreateHandle()
End Sub
Private Sub TimerOnClick(ByVal sender As Object, ByVal e As System.EventArgs)
RecreateHandle()
Local_Timer.Stop()
End Sub
Public Property Image As Image
Get
Return Local_Image
End Get
Set(ByVal value As Image)
Local_Image = value
RecreateHandle()
End Set
End Property
End Class
Ответ 5
Список похожих сообщений ссылается в нижней части этого ответа.
Этот ответ обращается к файлам изображений и Winforms (в других сообщениях ниже несколько повторяют, что WPF решает эту проблему уже)
- Создать Winform
- Создать x2 pictureBoxes
- foreground_pictureBox//окно с рисунком 'впереди' фона '
- background_pictureBox//снимок окна "за" переднего плана
- Добавьте событие "paint" для каждого pictureBox
- выберите объект в 'designer'
- выберите вкладку "свойства" (или щелкните правой кнопкой мыши и выберите всплывающее меню)
- выберите кнопку событий (маленький молния)
- дважды щелкните в пустое поле справа от события "paint"
- Добавьте следующий код в функцию "load" основной формы (если он еще не добавлен, используйте подход на шаге 3 и выберите "on load", а не "paint" ).
=
private void cFeedback_Form_Load(object sender, EventArgs e)
{
...
// Ensure that it is setup with transparent background
foreground_pictureBox.BackColor = Color.Transparent;
// Assign it 'background'
foreground_pictureBox.Parent = background_pictureBox;
...
}
5. В вызове "paint" для "background_pictureBox":
=
private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
...foreground_pictureBox_Paint(sender, e);
}
6. В вызове 'foreground_pictureBox_Paint' добавьте любые графические вызовы, которые вы хотите отобразить на переднем плане.
Этот раздел повторяется в нескольких сообщениях:
how-to-make-picturebox-transparent
c-sharp-picturebox-transparent-background-doesnt-seem-to-work
make-overlapping-picturebox-transparent-in-c-net
a-picturebox-problem
Ответ 6
Я всегда находил, что мне приходилось составлять изображения самостоятельно, используя один иллюстрационный блок или элемент управления. Наличие двух картинок с прозрачными деталями никогда не работало для меня.