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?

War es hilfreich?

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)

  1. Erstellen Winform
  2. x2 PictureBox erstellen
    • foreground_pictureBox // Bildfeld 'vor' von 'Hintergrund'
    • background_pictureBox // Bildfeld 'hinter' der 'Vordergrund'
  3. 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
  4. 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

machen überlappende-picturebox-transparent-in-c-net

a-picturebox-Problem

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top