Transparence de 2 pictureBox

joecoolups Messages postés 1 Date d'inscription lundi 5 mars 2007 Statut Membre Dernière intervention 31 juillet 2007 - 31 juil. 2007 à 14:22
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011 - 8 août 2007 à 13:44
Bonjour Mon probleme est le suivant:
est il possible d'avoir 2 picturebox (un grand et un petit), l'un sur l'autre (le petit sur le grand), de définir une couleur de transparence sur le petit (magenta par exemple) et d'afficher l'ensemble, je peux ainsi balader avec la souris mon petit picturebox avec la souris en gardant l'effet de transparence. Pour le moment si je fais ça, le magenta prend la couleur de la fenetre principale.
Avez vous une idée ?
Je passe par des pictureBox car c'est plus facile à gérer et a créer dynamiquement. Si non je pense passer par un Buffer Bitmap et gérer moi meme les pixels et les evenements souris. Qu'en pensez vous ? autre solution ?

Merci
Sephiro

9 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 juil. 2007 à 16:28
Salut, utilises ce genre de contrôle, qui gère la vraie transparence à la place de la 2ème PictureBox :

class TransparentControl : Control
{
    private const int WS_EX_TRANSPARENT = 0x00000020;


    public TransparentControl( ) : base( )
    {
    }
   
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_TRANSPARENT;
            return cp;
        }
    }
   
    protected override void OnPaintBackground( PaintEventArgs e )
    {
    }
   
    protected override void OnPaint( PaintEventArgs e )
    {
        //base.OnPaint( e );


        Rectangle bounds = new Rectangle( 0, 0, this.Width - 1, this.Height - 1 );
        e.Graphics.DrawRectangle( Pens.Black, bounds );
    }
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 juil. 2007 à 16:57
Sinon sans contrôle ( si j'ai bien compris ce que tu veux faire ) :

public partial class Form1 : Form
{
    PictureBox pb = null;
    Bitmap bmp = new Bitmap( "C:\\untitled.bmp" ); // Pour l'exemple.


    public Form1( )
    {
        InitializeComponent( );
        this.Size = new Size( 640, 480 );


        pb = new PictureBox( );
        pb.Parent = this;
        pb.Size = new Size( 400, 400 );
        pb.Location = new Point( 20, 20 );
        pb.Image = bmp;


        pb.MouseMove += delegate ( object sd, MouseEventArgs args )
        {
            pb.Invalidate( pb.ClientRectangle );
        };


        pb.Paint += delegate ( object sd, PaintEventArgs args )
        {
            Point pos = pb.PointToClient( Cursor.Position );


            if ( pb.ClientRectangle.Contains( pos ) )
            {
                Graphics g = args.Graphics;
                g.DrawImage( bmp, pos.X, pos.Y, 100, 100 );
                g.DrawRectangle( Pens.Black, pos.X, pos.Y, 100, 100 );
            }
        };
    }
}
0
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
31 juil. 2007 à 18:15
ta réponses m'interresse mais je débute en C# et je ne comprends pas comment utiliser ton controle TransparentControl

Sephiro
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 juil. 2007 à 19:52
C'est un contrôle comme une autre..

par exemple tu le crées dans le constructeur de ta forme comme ça :

TransparentControl ctrl = new TransparentControl( );
ctrl.Size = new Size( 100, 100 );
ctrl.Location = new Point( 10, 10 );
ctrl.Parent = this; // Attention qu'il ne soit pas en-dessous d'un autre contrôle.

Pour l'exemple dans sa méthode OnPaint, il ne fait rien d'autre que de dessiner un cadre noir au tour de lui sinon il serait totalement transparent mais tu peux très bien dessiner une image avec la méthode DrawImage.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
1 août 2007 à 11:46
Bonjour, voici la methode que j'ai utilisé:
Dans l'evenement Paint, je liste les controls de type PictureBox du Parents
foreach (
Control MyControl
in
this.Parent.Controls )
pour chaque Pixel magenta de mon Bitmat je recherche la couleur du pixel du control en dessous,je le remplace dans mon Bitmap par un setpixel.
puis j'affiche mon PictureBox avec le bitmap modifié
pour le moment je travail par getpixel et setpixel mais je vais optimiser par des pointeur.
Merci pour ton aide Lutinore
Sephiro
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2007 à 12:31
Si tu débutes en C#, les pointeurs ça ne va pas être simple. Peux tu me faire une capture d'écran  de ce que tu veux vraiment faire, car à mon avis il y'a moyen de se passer des picturesbox et des pointeurs. ( heberger l'image  sur hiboox.com ou imageshack.us par exemple ).
0
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
2 août 2007 à 09:32
Bonjour
Je n'aurais pas de probleme avec les pointeurs, je débute en C# mais je fais du C/C++ Win32 depuis 15 ans.
Mon approche du C# n'est pas bonne j'ai trop de reflexes C++, ton code va me permettre de travailler plus proprement avec des notion d'evenement dans mes objects.
Merci pour ton aide

Sephiro
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
7 août 2007 à 14:18
TeBeCo
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
8 août 2007 à 13:44
TeBeCo
0
Rejoignez-nous