Un Problème De PictureBox

j'ai un problème:

j'ai 3 boîtes d'images avec 3 images différentes comme dans L'Image

Que puis-je régler sur pictureBox3 pour que les deux images se ressemblent.....

alt text

EDITED: Je veux déplacer pictureBox3 sur pictureBox2,

il n'y a donc pas de possibilité de les fusionner en une seule image

11
demandé sur Richard 2010-11-10 15:20:18

5 réponses

je vais ajouter un autre exemple qui, selon l'exigence mise à jour permet de déplacer l'image3.

Pour le faire fonctionner, mettez une image avec transparence dans Resources\transp.png

Cela utilise la même image pour les trois images, mais vous pouvez simplement remplacer transparentImg pour image1 et image2 par des images appropriées.

une fois la démo commencée, l'image du milieu peut être traînée-déposée autour du formulaire.

public partial class Form1 : Form
{
    private readonly Image transparentImg; // The transparent image
    private bool isMoving = false;         // true while dragging the image
    private Point movingPicturePosition = new Point(80, 20);   // the position of the moving image
    private Point offset;   // mouse position inside the moving image while dragging
    public Form1()
    {
        InitializeComponent();

        // 
        // pictureBox1
        // 
        this.pictureBox1.Location = new System.Drawing.Point(0, 0);
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(231, 235);
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
        this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
        this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
        this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
        this.Controls.Add(this.pictureBox1);
        transparentImg = Image.FromFile("..\..\Resources\transp.png");
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        var g = e.Graphics;
        g.DrawImageUnscaled(transparentImg, new Point(20, 20));      // image1
        g.DrawImageUnscaled(transparentImg, new Point(140, 20));     // image2
        g.DrawImageUnscaled(transparentImg, movingPicturePosition);  // image3
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        var r = new Rectangle(movingPicturePosition, transparentImg.Size);
        if (r.Contains(e.Location))
        {
            isMoving = true;
            offset = new Point(movingPicturePosition.X - e.X, movingPicturePosition.Y - e.Y);
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMoving)
        {
            movingPicturePosition = e.Location;
            movingPicturePosition.Offset(offset);
            pictureBox1.Invalidate();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        isMoving = false;
    }
}
7
répondu Albin Sunnanbo 2010-11-15 20:42:51

assurez-vous que l'image dans pictureBox3 est transparente. Réglez le BackColor sur transparent. En code, définissez la propriété Parent du pictureBox3 comme pictureBox2 . Ajustez les coordonnées Location de pictureBox3 car elles seront relatives aux coordonnées de pictureBox2 une fois que vous aurez changé le Parent .

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox3.Parent = pictureBox2;
        pictureBox3.Location =
            new Point(
                pictureBox3.Location.X
                - pictureBox2.Location.X,
                pictureBox3.Location.Y
                - pictureBox2.Location.Y);

    }

dans designer vous ne verrez pas la transparence, mais à l'exécution vous le ferez.

mise à Jour

Dans l'image, le côté gauche montre la vue du concepteur, le côté droit est la version d'exécution. Left: Designer view, Right: How it looks at runtime

une autre mise à jour

je ne comprends vraiment pas comment il serait possible que cela ne fonctionne pas pour vous. Je suppose qu'il doit y avoir quelque chose que nous faisons différemment. Je vais décrire les étapes exactes à prendre pour créer un échantillon de travail. Si vous suivre les mêmes étapes, je me demande si nous allons obtenir les mêmes résultats ou pas. Prochaines étapes décrivez ce qu'il faut faire et utilisez deux images que j'ai trouvées sur le net.

  • à L'aide de Visual Studio 2008, créez un nouveau projet à l'aide de modèles D'application Windows Forms. Assurez-vous que le projet est ciblé sur le cadre .NET 3.5.
  • règle la taille du formulaire à 457;483.
  • faites glisser une commande PictureBox sur le formulaire. Réglez sa position à 0;0 et sa Taille à 449;449.
  • cliquez l'ellipse en plus de sa propriété Image, cliquez L'importation... bouton et importer l'image à http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg (il suffit de taper L'URL dans la zone de texte Nom du fichier et de cliquer ouvrir). Puis cliquez sur OK pour utiliser l'image.
  • faites glisser une autre PictureBox sur la forme, réglez sa position à 0;0 et sa taille à 256;256. Aussi mettre sa propriété BackColor à Transparent.
  • en utilisant la même méthode que décrite ci-dessus, importer l'image http://www.axdn.com/redist/axiw_i.png qui est une image transparente.
  • placez maintenant le code suivant dans le gestionnaire D'événements OnLoad du formulaire:

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox2.Parent = pictureBox1;
    }
    

C'est ça! Si j'exécute ce programme, j'obtiens une image transparente au-dessus d'une autre image.

9
répondu comecme 2010-12-13 23:12:49

pour commencer, définissez la propriété BackColor de PictureBox3 à Transparent. Cela devrait fonctionner dans presque tous les cas.

vous devez également utiliser une image avec un fond transparent au lieu de blanc de sorte que vous n'avez pas les frontières blanches autour de votre Cercle pourpre. (Format d'image recommandé: PNG)


mise à jour

Suite aux réponses que j'ai reçues, il semble définir le BackColor à Transparent ne marche pas. Dans ce cas, il est préférable de gérer l'événement Paint de la PictureBox et de faire la peinture de la nouvelle image vous-même comme Albin suggéré .

2
répondu Alex Essilfie 2017-05-23 10:31:13

ce code fera l'affaire:

using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
    g.DrawImage(pictureBox2.Image, 
        (int)((pictureBox1.Image.Width - pictureBox2.Image.Width) / 2),
        (int)((pictureBox1.Image.Height - pictureBox2.Image.Height) / 2));
    g.Save();
    pictureBox1.Refresh();
}

Il va dessiner l'image de pictureBox2 sur l'image existante de pictureBox1.

2
répondu Shadow Wizard 2010-11-14 11:39:35

vous pourriez faire un peu de piratage en écrasant OnPaint et autres, exemple ici .

mais je recommande de fusionner les photos dans pictureBox2 et 3 dans une seule image avant de les afficher dans une seule pictureBox.

0
répondu Albin Sunnanbo 2010-11-10 12:35:16