Domanda

Sto lavorando su un'applicazione Windows Form in VS 2008, e voglio visualizzare un'immagine sopra la parte superiore di un altro, con l'immagine in alto essendo un GIF o qualcosa con parti trasparenti.

Fondamentalmente ho una grande immagine e voglio mettere un po 'immagine in alto se, in modo che appaiano un pò come un'immagine per l'utente.

Ho cercato di utilizzare un PictureBox, ma questo non sembra aver funzionato, qualche suggerimento?

È stato utile?

Soluzione

Io ero in una situazione simile un paio di giorni fa. È possibile creare un controllo trasparente per ospitare la vostra immagine.

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

Altri suggerimenti

PictureBox ha 2 strati di immagini:. BackgroundImage e immagine, che è possibile utilizzare in modo indipendente l'uno dall'altro tra cui il disegno e la compensazione

Mettere la grande immagine / inferiore su una PictureBox, quindi aggiungere un gestore per l'evento OnPaint e utilizzare uno dei sovraccarichi e.Graphics.DrawImage(). È possibile caricare l'immagine utilizzando Image.FromFile().

La piccola immagine / superiore dovrà avere un canale alfa ed essere trasparente in background per la sovrapposizione di lavorare. Dovreste essere in grado di garantire questo abbastanza facilmente in Photoshop o qualcosa di simile. Assicurarsi di salvare in un formato che supporta il canale alfa, come ad esempio PNG.

Il codice vb.net (Tutti i crediti 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

Un elenco di messaggi simili si fa riferimento in fondo a questa risposta.

Questa risposta si rivolge PictureBoxes e WinForms (negli altri post qui sotto, molti ribadire che WPF risolve questo bene già)

  1. Crea Winform
  2. Crea PictureBoxes x2
      dialogo
    • foreground_pictureBox // immagine 'di fronte' di 'background'
    • dialogo
    • background_pictureBox // immagine 'dietro' il 'primo piano'
  3. Aggiungi l'evento 'vernice' per ogni pictureBox
    • Seleziona oggetto nel 'progettista'
    • selezionare la scheda 'Proprietà' (o il tasto destro del mouse e scegliere dal menu a comparsa)
    • selezionare il pulsante di eventi (piccolo fulmine)
    • fare doppio clic sul campo vuoto alla destra della manifestazione 'vernice'
  4. Aggiungere il seguente codice alla funzione di 'carico' del form principale (se non è già aggiunto, utilizzare l'approccio al punto 3 e selezionare 'il carico', piuttosto che 'vernice')

=

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. Nella chiamata 'vernice' per il 'background_pictureBox':

=

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

6. All'interno della chiamata 'foreground_pictureBox_Paint', aggiungere in qualsiasi grafica chiamate che si desidera visualizzare in primo piano.

Questo argomento si ripete in diversi posti a quanto pare:

come-make-picturebox trasparente

c-sharp-picturebox-trasparente-background-doesnt -seem al lavoro

make-sovrapposti picturebox-trasparente-in-c-net

a-picturebox problemi

Ho sempre trovato che ho dovuto compositi le immagini io stesso, utilizzando un unico picturebox o di controllo. Avendo due PictureBoxes con parti trasparenti non ha mai lavorato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top