PictureBox, transparence. [Résolu]

Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 29 oct. 2005 à 16:34 - Dernière réponse : Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention
- 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 ^^
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 31 oct. 2005 à 03:44
3
Merci
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 );
}
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 oct. 2005 à 17:04
0
Merci
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.
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 oct. 2005 à 17:22
0
Merci
Essayes ça :

class MyPictureBox : PictureBox
{
public MyPictureBox( ) : base( )
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true );
this.BackColor = Color.FromArgb( 0, 128, 128, 128 );
}
}
Commenter la réponse de Lutinore
Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 29 oct. 2005 à 17:53
0
Merci
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 ?
Commenter la réponse de Cookiem
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 oct. 2005 à 18:54
0
Merci
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.
Commenter la réponse de Lutinore
Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 29 oct. 2005 à 20:02
0
Merci
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] )
Commenter la réponse de Cookiem
Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 29 oct. 2005 à 20:08
0
Merci
(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.)
Commenter la réponse de Cookiem
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 oct. 2005 à 21:48
0
Merci
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 : )
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 30 oct. 2005 à 02:52
0
Merci
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 );
}
}
}
Commenter la réponse de Lutinore
Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 30 oct. 2005 à 14:55
0
Merci
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
Commenter la réponse de Cookiem
Cookiem 46 Messages postés mercredi 12 janvier 2005Date d'inscription 17 juillet 2007 Dernière intervention - 31 oct. 2005 à 14:50
0
Merci
Ca marche nickel merci beaucoup
Commenter la réponse de Cookiem

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.