picturebox fondo transparente c#
Imágenes transparentes con C WinForms (6)
Coloque la imagen grande / inferior en un PictureBox
, luego agregue un manejador al evento OnPaint
y use una de las sobrecargas e.Graphics.DrawImage()
. Puede cargar la imagen usando Image.FromFile()
.
La imagen pequeña / superior tendrá que tener un canal alfa y ser transparente en el fondo para que funcione la superposición. Debería poder asegurar esto fácilmente en Photoshop o algo similar. Asegúrese de guardar en un formato compatible con el canal alfa, como PNG.
Estoy trabajando en una aplicación de Windows Forms en VS 2008, y quiero mostrar una imagen encima de otra, con la imagen superior como un gif o algo con partes transparentes.
Básicamente tengo una imagen grande y quiero poner una pequeña imagen en la parte superior para que aparezcan como una sola imagen para el usuario.
He estado tratando de usar un cuadro de imagen, pero esto no parece haber funcionado, ¿alguna sugerencia?
El código vb.net (Todos los créditos a Leon 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
Estuve 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();
}
}
}
PictureBox tiene 2 capas de imágenes: Imagen de fondo e Imagen, que puede usar de forma independiente, incluido el dibujo y el borrado.
Se hace referencia a una lista de publicaciones similares en la parte inferior de esta respuesta.
Esta respuesta aborda pictureBoxes y Winforms (en las otras publicaciones a continuación, varias reiteran que WPF ya lo resuelve bien)
- Crear Winform
- Crear x2 cuadros de imagen
- foreground_pictureBox // picture box ''delante'' de ''background''
- background_pictureBox // picture box ''behind'' the ''foreground''
- Agregue el evento ''pintura'' para cada cuadro de imagen
- seleccionar objeto en el ''diseñador''
- elija la pestaña ''propiedades'' (o haga clic con el botón derecho y elija un menú emergente)
- seleccione el botón de eventos (pequeño rayo)
- haga doble clic en el campo vacío a la derecha del evento ''pintar''
- Agregue el siguiente código a la función de ''carga'' del formulario principal (si aún no lo ha agregado, use el enfoque en el paso 3 y seleccione ''en carga'' en lugar de ''pintar'')
=
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 ''background_pictureBox'':
=
private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
...foreground_pictureBox_Paint(sender, e);
}
6. Dentro de la llamada ''foreground_pictureBox_Paint'', agregue las llamadas de gráficos que desee que se muestren en primer plano.
Este tema se repite en varias publicaciones:
how-to-make-picturebox-transparent
c-sharp-picturebox-transparent-background-doesnt-seem-to-work
Siempre he descubierto que he tenido que componer las imágenes yo mismo, usando una sola imagen o control. Tener dos pictureboxes con partes transparentes nunca me ha funcionado.