Transparente Bilder mit C # WinForms
-
23-08-2019 - |
Frage
ich auf einem Windows arbeitete Forms-Anwendung in VS 2008, und ich mag ein Bild über die Oberseite eines anderen angezeigt wird, mit dem Top-Bild ein GIF oder etwas mit transparenten Teilen.
Im Prinzip habe ich ein großes Bild, und ich will, wenn es ein wenig Bild oben zu setzen, so dass sie ein bisschen wie ein Bild des Benutzer angezeigt werden.
Ich habe versucht, eine picturebox zu verwenden, aber dies scheint nicht funktioniert zu haben, irgendwelche Vorschläge?
Lösung
Ich war in einer ähnlichen Situation vor ein paar Tagen. Sie können eine transparente Kontrolle erstellen Sie Ihr Bild zu hosten.
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();
}
}
}
Andere Tipps
PictureBox hat zwei Schichten von Bildern. Background und Bild, dass Sie unabhängig voneinander einschließlich Zeichnung und Clearing verwenden
Setzen Sie das große / unten Bild auf einem PictureBox
, dann einen Handler zum OnPaint
Ereignisse hinzufügen und eine der e.Graphics.DrawImage()
Überlastungen verwenden. Sie können das Bild mit Image.FromFile()
laden.
Das kleine / top Bild hat einen Alphakanal haben, und in dem Hintergrund für die Überlagerung transparent sein, zu arbeiten. Sie sollen ähnlich diese ziemlich leicht in Photoshop oder etwas gewährleisten können. Stellen Sie sicher, dass Sie in einem Format speichern, die den Alphakanal, wie PNG unterstützt.
Der vb.net Code (alle Kredite an 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
Eine Liste von ähnlichen Stellen am unteren Rand dieser Antwort verwiesen wird.
Diese Antwort Adressen PictureBox und WinForms (in den anderen Beiträgen unten, mehrere wiederholen, dass WPF diese gut löst bereits)
- Erstellen Winform
- x2 PictureBox erstellen
- foreground_pictureBox // Bildfeld 'vor' von 'Hintergrund'
- background_pictureBox // Bildfeld 'hinter' der 'Vordergrund'
- Fügen Sie die ‚Farbe‘ Ereignis für jede PictureBox
- Objekt auswählen im 'Designer'
- Wählen Sie die Registerkarte ‚Eigenschaften‘ (oder rechtsklicken und aus Popup-Menü wählen)
- Wählen Sie die Ereignisse Taste (kleiner Blitz)
- Doppelklicken Sie auf das leere Feld rechts von der ‚Farbe‘ Ereignis
- Fügen Sie den folgenden Code in das ‚Last‘ Funktion des Hauptformulars (falls nicht bereits hinzugefügt, verwenden Sie den Ansatz in Schritt 3 und wählen Sie ‚auf Last‘ und nicht ‚Farbe‘)
=
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. In dem 'Farbe' Aufruf zum 'background_pictureBox':
=
private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
...foreground_pictureBox_Paint(sender, e);
}
6. Im Aufruf ‚foreground_pictureBox_Paint‘, fügen Sie in welchen Grafiken nennt man im Vordergrund angezeigt werden soll.
Dieses Thema wiederholt sich in mehrere Beiträge so scheint es:
how-to-make-picturebox-transparent
c-sharp-picturebox-transparent-Hintergrund-doesnt -seem-to-work
Ich habe immer gefunden, dass ich zu Verbund mir die Bilder hatte, eine einzige picturebox oder Steuerung. Nachdem zwei PictureBox mit transparenten Teilen hat sich für mich nie gearbeitet.