Las imágenes transparentes con C # WinForms
-
23-08-2019 - |
Pregunta
Estoy trabajando en una aplicación Windows Forms en VS 2008, y quiero mostrar una imagen sobre la parte superior de la otra, con la imagen de arriba es un gif o algo con partes transparentes.
Básicamente tengo una imagen grande y quiero poner un poco de la imagen en la parte superior si, de modo que poco aparecen como una imagen al usuario.
He estado tratando de utilizar un cuadro de imagen, pero esto no parece haber funcionado, alguna sugerencia?
Solución
Yo estaba en una situación similar hace un par de días. Puede crear un control transparente para alojar su imagen.
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();
}
}
}
Otros consejos
cuadro de imagen tiene 2 capas de imágenes:. BackgroundImage y la imagen, que se puede utilizar de forma independiente el uno del otro como el dibujo y la limpieza
Ponga la imagen grande / inferior en un PictureBox
, a continuación, agregar un controlador para el evento OnPaint
y utilizar una de las sobrecargas e.Graphics.DrawImage()
. Puede cargar la imagen utilizando Image.FromFile()
.
La imagen pequeña / top tendrá que tener un canal alfa y ser transparente en el fondo para la superposición de trabajar. Usted debe ser capaz de asegurar esto con bastante facilidad en Photoshop o algo similar. Asegúrese de guardar en un formato que es compatible con el canal alfa, tales como PNG.
El código de vb.net (Todos los créditos a León Tayson):
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
se hace referencia a una lista de puestos similares en la parte inferior de esta respuesta.
Esta respuesta se dirige a PictureBoxes y Winforms (en los demás puestos siguientes, varios reiterar que WPF resuelve este pozo ya)
- Crear Winform
- Crear PictureBoxes x2
-
Caja
- foreground_pictureBox // foto 'delante' de 'fondo' Caja
- background_pictureBox // foto 'detrás' del 'Primer plano'
- Agregue el evento 'pintura' para cada cuadro de imagen
- Seleccione el objeto en el 'de diseño'
- seleccione la ficha 'Propiedades' (o haga clic derecho y elegir de menú emergente)
- seleccione el botón de eventos (pequeño rayo)
- haga doble clic en el campo vacío a la derecha del evento 'pintura'
- Agregue el código siguiente a la función de 'carga' de la forma principal (si no se ha añadido, utilizar el enfoque en el paso 3 y seleccione 'la carga' en lugar de 'pintura')
=
private void cFeedback_Form_Load(object sender, EventArgs e)
{
...
// Ensure that it is setup with transparent background
foreground_pictureBox.BackColor = Color.Transparent;
// Assign it's 'background'
foreground_pictureBox.Parent = background_pictureBox;
...
}
5. En la llamada 'pintura' para el 'background_pictureBox':
=
private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
...foreground_pictureBox_Paint(sender, e);
}
6. Dentro de la llamada 'foreground_pictureBox_Paint', añadir en cualquier gráficos de llamadas que desea que aparezca en el primer plano.
En este tema se repite en varios puestos que parece:
how-to-make-cuadro de imagen transparente
do sostenido-PictureBox-transparente-fondo-doesnt plazos parece al trabajo
Siempre he descubierto que he tenido que las imágenes compuestas a mí mismo, utilizando un único cuadro de imagen o de control. Habiendo dos PictureBoxes con partes transparentes nunca ha trabajado para mí.