Question

Je travaille sur une application Windows Forms dans VS 2008 et je veux afficher une image sur le dessus d'une autre, avec l'image du haut étant un gif ou quelque chose avec des parties transparentes.

En fait, j'ai une grande image et je veux mettre une petite image sur le dessus si elle, de sorte qu'ils apparaissent un peu comme une image à l'utilisateur.

J'ai essayé d'utiliser un picturebox, mais cela ne semble pas avoir travaillé, des suggestions?

Était-ce utile?

La solution

Je suis dans une situation similaire il y a quelques jours. Vous pouvez créer un contrôle transparent pour héberger votre image.

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

Autres conseils

PictureBox dispose de 2 couches d'images:. BackgroundImage et de l'image, que vous pouvez utiliser indépendamment les uns des autres, y compris le dessin et la compensation

Mettre l'image grand / bas sur un PictureBox, puis ajouter un gestionnaire à l'événement OnPaint et utilisez l'une des surcharges e.Graphics.DrawImage(). Vous pouvez charger l'image en utilisant Image.FromFile().

La petite / image supérieure devra avoir un canal alpha et être transparent dans le fond de la superposition de travailler. Vous devriez être en mesure d'assurer ce assez facilement dans Photoshop ou quelque chose de similaire. Assurez-vous que vous enregistrez dans un format qui prend en charge le canal alpha, tels que PNG.

Le code vb.net (Tous les crédits à 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

Une liste des postes similaires est référencé au bas de cette réponse.

Cette réponse traite PictureBoxes et Winforms (dans les autres postes ci-dessous, plusieurs réitérons que WPF résout ce bien déjà)

  1. Créer Winform
  2. Créer x2 PictureBoxes
    • foreground_pictureBox // zone d'image 'en face' de 'background'
    • background_pictureBox // zone d'image 'derrière' le 'premier plan'
  3. Ajoutez l'événement « peinture » pour chaque picturebox
    • sélectionner l'objet dans le 'designer'
    • choisissez l'onglet « Propriétés » (ou faites un clic droit et choisissez dans le menu contextuel)
    • sélectionnez le bouton d'événements (petit éclair)
    • double-cliquez dans le champ vide à droite de l'événement « peinture »
  4. Ajoutez le code suivant à la principale fonction « de charge » de forme (sinon déjà ajouté, utilisez l'approche à l'étape 3 et sélectionnez « la charge » plutôt que « la peinture »)

=

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. Dans la « peinture » appel à la « background_pictureBox »:

=

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

6. Au sein de l'appel « foreground_pictureBox_Paint », ajouter ce que les graphiques appels que vous voulez afficher au premier plan.

Ce sujet se répète dans plusieurs messages, il semble:

how-to-make-picturebox transparent

c-sharp-picturebox-fond-transparent ne marche pas -seem au travail

faire chevauchant-picturebox-en-transparent c-net

un picturebox-problème

Je l'ai toujours trouvé que j'ai dû composer les images moi-même, en utilisant un seul picturebox ou de contrôle. Ayant deux PictureBoxes avec des parties transparentes n'a jamais travaillé pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top