Pergunta

Eu estou trabalhando em um aplicativo Windows Forms no VS 2008, e eu quero mostrar uma imagem por cima da outra, com a imagem de topo ser um gif ou algo com partes transparentes.

Basicamente, eu tenho uma imagem grande e eu quero colocar um pouco de imagem em cima se ele, de modo que eles meio que aparecem como uma imagem para o usuário.

Eu tenho tentado usar um picturebox, mas isso não parece ter funcionado, alguma sugestão?

Foi útil?

Solução

Eu estava em uma situação semelhante um par de dias atrás. Você pode criar um controle transparente para hospedar sua imagem.

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();
        }
    }
}

Outras dicas

PictureBox tem 2 camadas de imagens:. BackgroundImage e imagem, que você pode usar independentemente uns dos outros, incluindo desenho e compensação

Coloque a imagem grande / inferior em um PictureBox, em seguida, adicione um manipulador para o evento OnPaint e usar uma das sobrecargas e.Graphics.DrawImage(). Você pode carregar a imagem usando Image.FromFile().

A imagem pequena / top terá que ter um canal alfa e ser transparente em segundo plano para a sobreposição de trabalho. Você deve ser capaz de garantir isso muito facilmente em Photoshop ou algo similar. Certifique-se de salvar em um formato que suporta o canal alfa, tais como PNG.

O código vb.net (Todos os créditos para 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

A lista de postos semelhantes é referenciado na parte inferior desta resposta.

Isso resolve resposta PictureBoxes e WinForms (nos outros posts abaixo, vários reiterar que WPF resolve este bem já)

  1. Criar Winform
  2. Criar PictureBoxes x2
    • foreground_pictureBox // caixa de imagem 'na frente' de 'background'
    • background_pictureBox // imagem box 'para trás' o 'plano'
  3. Adicione o evento 'pintura' para cada pictureBox
    • selecione objeto no 'designer'
    • escolha o separador 'propriedades' (ou clique com o botão direito e escolha a partir do menu pop-up)
    • selecione o botão eventos (pequeno raio)
    • clique duplo no campo vazio à direita do evento 'pintura'
  4. Adicione o seguinte código para a função do formulário principal 'carga' (se já não estiver adicionado, use a abordagem no passo 3 e selecione 'em carga' em vez 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. Na chamada 'pintar' para o 'background_pictureBox':

=

private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
    ...foreground_pictureBox_Paint(sender, e);
}

6. Dentro da chamada 'foreground_pictureBox_Paint', adicione em qualquer gráficos chamadas que você deseja ser exibido em primeiro plano.

Este tópico se repete em vários posts que parece:

how-to-make-picturebox transparente

c-sharp-picturebox-transparente-background-doesnt -seem-to-work

-make sobrepondo-picturebox-transparente-in-c-net

a-picturebox-problema

Eu sempre achei que eu tive para compor as imagens eu mesmo, usando um único picturebox ou controle. Tendo dois PictureBoxes com partes transparentes nunca trabalhou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top