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?

¿Fue útil?

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)

  1. Crear Winform
  2. Crear PictureBoxes x2
      Caja
    • foreground_pictureBox // foto 'delante' de 'fondo'
    • Caja
    • background_pictureBox // foto 'detrás' del 'Primer plano'
  3. 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'
  4. 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

hacer solapantes-PictureBox-transparente-en-c-net

un cuadro de imagen en problemas

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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top