DoubleBuffer et TransparentBackColor

Résolu
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 - 12 oct. 2005 à 17:31
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 - 13 oct. 2005 à 14:49
Kikoo,



Mon problème est que je n'arrive pas à lier le DoubleBuffer et la TransparentBackColor pour mon control ,
cela me donne un fond noir, pourtant la Propriété BackColor est bien à
Transparent . Sans le DoubleBuffer j'arrive à avoir ma transparence
mais des problemes de rafraichissement apparaissent. Comment faire pour
lier les 2



Voilà mon code dans le constructeur de mon control :



this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);



Sinon, j'ai ajouté :



protected override CreateParams CreateParams

{

get

{

CreateParams cp = base.CreateParams;

//ajoutethe WS_EX_TRANSPARENT style

cp.ExStyle |= 0x20;

return cp;

}

}

protected override void OnPaintBackground(PaintEventArgs pevent){}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

...

}



Merci


<hr>ZeBobo5
N'oubliez pas de cloturer votre post.

9 réponses

zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
13 oct. 2005 à 12:37
Re,

Changement, je joue plutot avec de la pseudo transparence, car il y a
incompatibilité entre transparence et double buffer(l'un ne ve pas de
OnPaintBackground et l'autre le veut absolument), et j'avais vraiment
besoin du double buffer.

Maintenant, ca me fait un fond de control correspont à l'image de mon control parent à la position donnée de mon control.


Cela peut être pratique si mon fond est un Dégradé, image, etc...

Dc la solution finale maintenant est :



public Constructeur()

{

this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);



// J'enleve la transparence qui ne sert à rien maintenant

this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);

}



protected override void OnPaintBackground(PaintEventArgs pevent)

{

Bitmap bmp = new Bitmap(Parent.Width, Parent.Height);

CaptureWindow(Parent, ref bmp);

pevent.Graphics.DrawImage(bmp, 0 - this.Left, 0 - this.Top);

}



// CreateParams ne sert plus vu qu'on utilise plu la transparence

// protected override CreateParams CreateParams {...}

// OnInvalidated ne sert plus non plu car DoubleBuffer

// protected override void OnInvalidated(InvalidateEventArgs e)



protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

...

}

const int PRF_CLIENT = 0x00000004;

const int PRF_ERASEBKGND = 0x00000008;

const int WM_PRINT = 0x0317;



[DllImport("user32.dll")]

static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);



private static void CaptureWindow(Control control, ref Bitmap bitmap)

{

Graphics g = Graphics.FromImage(bitmap);

int i = (int)(PRF_CLIENT | PRF_ERASEBKGND);

IntPtr iPtr = new IntPtr(14);

IntPtr hdc = g.GetHdc();

SendMessage(control.Handle, WM_PRINT, hdc, iPtr);

g.ReleaseHdc(hdc);

g.Dispose();

}


Voili, Voilà
<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 oct. 2005 à 08:53
regarde cette source : http://www.csharpfr.com/code.aspx?ID=33676
ca peut toujours t'intéresser

Sébastien FERRAND
[MVP C#]
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
13 oct. 2005 à 10:03
Merci Seb.

Le pire c'est que j'etais déjà allé voir ta source un fois



Dc pour corriger mon problème j'ai ajouté ton "hacking code" :



protected override void OnInvalidated(InvalidateEventArgs e)

{

// HACK à Seb pour le redessinement d'un fond transparent

//Source : http://www.csharpfr.com/code.aspx?ID=33676

this.SuspendLayout();

this.Width--;

this.Width++;

this.ResumeLayout();

base.OnInvalidated(e);

}



et supprimé la ligne dans le constructeur :



this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

et maintenant ca marche nikel, Merci encore.





<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 oct. 2005 à 13:43
je vais essayer ca tient... bonne idée.

Sébastien FERRAND
[MVP C#]
0

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

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 oct. 2005 à 14:11
un truc me dérange avec ta solution... si tu chevauche un autre controle... tu ne le vois pas par transparence...

Sébastien FERRAND
[MVP C#]
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 oct. 2005 à 14:13
en plus, le carré rouge... qui est normalement dessiné sur le fond de ma forme est décalé :'(

Sébastien FERRAND
[MVP C#]
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
13 oct. 2005 à 14:32
Je suis d'accord pour le pb de chevauchement, mais c'est normal car je prend l'image du control parent à mon control.

Pour ton carré rouge, il fo géré le décalage de ton image par rapport à la position de ton control.

Donne moi ta source si tu ve, v essayer de voir ca entre 2 lignes de codes. Dur dur, de taffer en mm tps ;-)


<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 oct. 2005 à 14:44
c'était juste pour tester ta technique... par rapport à l'exemple que je t'ai donné...
le décalage, c'est pas un souci... il faut juste connaitre la hauteur de la barre de titre ;)

finalement, même si ca clignote un peu leur du redimensionnement... je préfère ma méthode, au moins les chevauchements sont corrects... désolé

Sébastien FERRAND
[MVP C#]
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
13 oct. 2005 à 14:49
non, c'est pas grave, chaque code est différent et a son utilité.

J'avais juste besoin d'un doublebuffer avec un fond transparent pour mon contol.

Merci encore de ton aide.


<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
0
Rejoignez-nous