PictureBox, transparence.

Résolu
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007 - 29 oct. 2005 à 16:34
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007 - 31 oct. 2005 à 14:50
Lorsqu'on crée un picture box avec une image contenant des zone transparente (gif animé),
Il affiche l'image avec les zone transparente de la couleur de la backcolor de l'image.

J'ai donc mis la backcolor de l'image en transparent .... sauf qu'au lieu de me mettre de la transparence, il remplace les zones transparentes par les dessins/couleurs de la forme .

Es ce que c'est possible d'avoir de la vrai transparence, si oui comment ?
Merci d'avance ^^

11 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 oct. 2005 à 03:44
A peu près le même contrôle mais avec des bitmaps animés, normalement il doit rester transparent même quand tu le déplaces.

class AnimeBox : UserControl
{
private const int WS_EX_TRANSPARENT = 0x00000020;


private Bitmap[ ] sprites = null;
private int frame = 0;


public AnimeBox( ) : base( )
{
sprites = new Bitmap[ 10 ];


for ( int i = 0; i < 10; i++ )
{
sprites[ i ] = new Bitmap( "Sprite" + i + ".bmp" );
sprites[ i ].MakeTransparent( Color.Black );
}


Timer t = new Timer( );
t.Interval = 500;
t.Tick += new EventHandler( Timer_Tick );
t.Start( );
}


private void Timer_Tick( object sd, EventArgs e )
{
if ( this.Parent == null )
return;


if ( frame < 9 )
{
frame++;
}
else
{
frame = 0;
}

// Ici le code pour le déplacement ( pas testé ).


this.Parent.Invalidate( this.Bounds, true );
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}

protected override void OnPaintBackground( PaintEventArgs e )
{
// Ne pas supprimer cette méthode.
}

protected override void OnPaint( PaintEventArgs e )
{
//base.OnPaint( e );


e.Graphics.DrawImage( sprites[ frame ], this.ClientRectangle );
}
}
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 oct. 2005 à 17:04
Salut la question a déja été posée mais je ne me souviens plus de la réponse par contre on peut aussi se passer de la PictureBox et dessiner directement sur la forme, c'est une autre solution.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 oct. 2005 à 17:22
Essayes ça :

class MyPictureBox : PictureBox
{
public MyPictureBox( ) : base( )
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true );
this.BackColor = Color.FromArgb( 0, 128, 128, 128 );
}
}
0
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007
29 oct. 2005 à 17:53
Hmm,
Ca ne génère pas d'erreur (création de ta classe MyPictureBox, héritant de picture box, remplacer les picture box par des MyPicturebox)

Mais par contre je vois pas la difference entre avant et aprés ^^
Je vois toujours la forme dans les endroit transparent au lieu d'avoir du vrai transparent

Il faut que la couleur transparente de mes images soit 0, 128,128,128 pour que ca marche ?
0

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

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 oct. 2005 à 18:54
Tu parles de transparence ou de semi-transparence !? Je pensais que le format gif animé n'avait pas de semi transparence, peut-être que je me trompe, j'ai essayé avec un png semi-transparent, suffit juste de mettre une valeur alpha en BackColor de la PictureBox.
0
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007
29 oct. 2005 à 20:02
Je parle de transparence total pas de semi transparence, es ce que tu pourais m'envoyer une image qui marche que j'ai un exemple (aprés à la limite je refais mes gif de la même manière ^^)


Merci d'avance
( [mailto:cook_alpha@hotmail.com cook_alpha@hotmail.com] )
0
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007
29 oct. 2005 à 20:08
(En fait la le résultat que j'optient pour l'instant avec ta classe est le même qu'avec un picture box à la base c'est à dire que c'est transparent mais on ne vois que la forme deriere

si par exemple j'ai
* Arière plan une image en background de ma forme.
* Plan au milieu une image dans un autre picture box.
* Premier plan mon image avec une party transparente.

Je verrais dans la party transparente l'image en arrière plan au lieu de voir celle au milieu.)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 oct. 2005 à 21:48
Vi je vois, là on a de la fausse transparence.. je ne sais pas pour le moment, mais Seb il doit savoir ça, c'est son truc les contrôles : )
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
30 oct. 2005 à 02:52
J'ai testé quelque chose qui marche bien avec les fichiers bmp, png, jpg mais c'est pas encore au point pour les gifs animés, je verrai plus tard.

namespace TransparencyControl
{
class MainForm : Form
{
private PictureBox pb1;
private MyPictureBox pb2;


private MainForm( ) : base( )
{
pb1 = new PictureBox( );
pb1.Location = new Point( 0, 0 );
pb1.Size = new Size( 250, 250 );
pb1.Image = new Bitmap( "logo1.jpg" );
pb1.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add( pb1 );


pb2 = new MyPictureBox( );
pb2.Location = new Point( 100, 100 );
pb2.Size = new Size( 250, 250 );
this.Controls.Add( pb2 );
pb2.BringToFront( );
}


[ STAThread ]
private static void Main( )
{
Application.Run( new MainForm( ) );
}
}


class MyPictureBox : UserControl
{
private const int WS_EX_TRANSPARENT = 0x00000020;


private Bitmap bmp;


public MyPictureBox( ) : base( )
{
bmp = new Bitmap( "logo2.jpg" );
bmp.MakeTransparent( bmp.GetPixel( 0, 0 ) );
}

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


e.Graphics.DrawImage( bmp, this.ClientRectangle );
}
}
}
0
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007
30 oct. 2005 à 14:55
Hmm ca marche nickel même si je comprend pas tout le code ^^
(notament ce qu'est la classe base dont on hérite ) tant que je bouge pas.

Par contre si je bouge le controle MyPictureBox (ex pb2.left = pb2.left +20) ca rebug ca bouge l'image tel quel (sans changer les zone transparente).

Il faudrait que je redessine le MyPictureBox.J'arrive à générer le redessinage en le mettant visible false puis visible true mais bon c'est pas top :p (clignotement)
(j'ai essayé pb2.update ca fait rien :S)

Sinon pour les gif on peut contourner le probleme avec un timer et un changement d'image non ?

Sauf que je sais pas changer l'image avec ton controle bimap
0
Cookiem Messages postés 46 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 17 juillet 2007
31 oct. 2005 à 14:50
Ca marche nickel merci beaucoup
0
Rejoignez-nous