immagini trasparenti con C # WinForms
-
23-08-2019 - |
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?
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à)
- Crea Winform
- Crea PictureBoxes x2
-
dialogo
- foreground_pictureBox // immagine 'di fronte' di 'background' dialogo
- background_pictureBox // immagine 'dietro' il 'primo piano'
- 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'
- 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
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.