atomefougere
Messages postés32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 5 décembre 2005
-
29 oct. 2005 à 00:33
ikaemos
Messages postés9Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 4 décembre 2005
-
5 déc. 2005 à 21:31
Salut tout le monde.
Je vous explique mon problème :
J'ai codé un composant qui hérite de la ListBox. Je gère le redimensionnement de ses items en fonction du texte qui doit y être affiché. J'ai notamment surchargé la méthode OnDrawItem pour dessiner mes items.
J'ai un clignotement assez désagréable, que j'ai essayé de supprimer en utilisant le double buffering sur mon composant. Dans le constructeur, j'ajoute donc les instructions :
- Lorsque je n'apelle pas les SetStyle, mes items se dessinent bien, mais ça clignote
- Lorsque j'apelle les SetStyle, mes items ne se dessinent plus. Il semblerait que ce soit le :
SetStyle(System.Windows.Forms.ControlStyles.UserPaint, true);
qui empêche le dessin. Si je le commente, le dessin de fait bien, mais ça clignote toujours.
ikaemos
Messages postés9Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 4 décembre 2005 5 déc. 2005 à 00:31
Bon, pour ceux qui cherchent encore :
J'ai cherché environ 6h avant de trouver la solution :
Pour utiliser le ownerdraw (et donc le double buffering) il faut forcément utiliser le OnPaint... Jusqu'ici tout va bien... ahhh... bah non, pas de OnPaint sur la ListBox....
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 29 oct. 2005 à 00:52
j ai pas deja eu ce probleme, mais j ai une idée
ta classe hérite de ListBox et tu surcharges OnDrawItem pour dessiner ton custom-control
pkoi tu ne override pas le OnPaint à la place ?
atomefougere
Messages postés32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 5 décembre 2005 29 oct. 2005 à 01:00
En fait, je veux surcharger le OnDrawItem pour gérer le dessin de mes items... Je ne vois pas trop comment le OnPaint peut remplacer le OnDrawItem... Je n'ai pas les bons rectangles de dessin, ni les index des items...
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 29 oct. 2005 à 01:21
mmm, oui, scuse moi
t as raison maintenant que j'y pense
les seuls controles personalisés que j'ai fait, c'est des boutons et j'utilise OnPaint
http://www.csharpfr.com/code.aspx?ID=29856 c est pour ca que j'ai eu le reflexe de dire OnPaint
mais sinon, tu peux poster un peu plus de ton code en esperant que quelqu'un trouve le probleme
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 29 oct. 2005 à 10:09
Salut,
UserPaint est justement gzit pour gérer totalement soit même le dessin du contrôle.
Ce qui est étonnant c'est le clignotement, il est en continu ou juste au moment du dessin des items ?
Tu peux montrer le code de dessin en question ?
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 29 oct. 2005 à 13:47
il faut aussi faire une surcharge de OnMeasureItem...
petit conseil aussi, remplace :
if (DesignMode && this.Items.Count == 0)
par
if (DesignMode || this.Items.Count == 0)
ensuite, je te déconseille l'utilisation du style ControlStyles.ResizeRedraw
intercepte plutôt l'évènement Resize du controle et appelle la méthode Invalidate().
atomefougere
Messages postés32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 5 décembre 2005 29 oct. 2005 à 13:53
Salut Sébastien,
En fait, je surcharge déjà le OnMeasureItem. Et comme le ControlStyles.ResizeRedraw ne fonctionne pas, je fais appel a Invalidate() dans le OnSizeChanged...
Sinon tu as raison pour le test, je fais d'ailleurs le bon dans le OnMeasureItem.
atomefougere
Messages postés32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 5 décembre 2005 29 oct. 2005 à 14:03
Oui j'ai fouillé un peu partout... Soit les listBox clignotent comme la mienne, soit elles n'imposent pas le redessin lors du resize, soit les composant héritent de Panel et non de ListBox, et tout est géré à la main...
Donc je sèche un peu. Je vais essayer de faire un mini projet de test pour que vous puissiez y jeter un coup d'oeil.
Sinon, j'ai refais le contrôle...
J'ai eu un problème lorsque j'ajoutais le style UserPaint, donc je l'ai supprimé
J'ai également appelé Invalidate( true ) lorsque la souris est enfoncée au-dessus du contrôle
parce qu'il ne redessinais pas les items lorsque la sélection était modifiée !
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 31 oct. 2005 à 10:58
Non, son utilisation de SetStyle est tout à fait bonne.
En interne la méthode ajoute ou retire le flag spécifié à la valeur existante, suivant l'état du booléen.
atomefougere
Messages postés32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 5 décembre 2005 31 oct. 2005 à 12:25
Salut Ludinski,
Merci d'avoir pris le temps de te pencher sur ton problème, c'est appréciable. Toutefois, je ne suis pas vraiment avancé... Comme le précise coq, il est possible d'appeller la méthode SetStyle plusieurs fois de suite, et elle change la valeur du flag en ne modifiant que la propriété ciblée, celle que l'on passe en paramètre.
Et sinon, dans ton source, tu fais bien une ListBox perso, mais le double buffering n'est pas actif, et le controle scintille donc sur les redimensionnement, or c'est justement le problème que je cherche à résoudre.
Je l'avais indiqué plusieurs fois : Sans le
SetStyle(ControlStyles.UserPaint,
true);
Le dessin fonctionne bien, mais le double buffering n'est pas actif. Si je la rajoute, alors le dessin ne se fait plus.
Une précision :
J'ai réussi à faire fonctionner le double buffering en utilisant le OnPaint. Seulement, ça ne me convient pas vraiment, puisqu'il me faut gérer le dessin de tous les items à cet endroit, et cela devient compliqué lorsque la liste est scrollable.
Peut-être que mon problème n'a pas de solution : la listBox de base scintille beaucoup... Mais je ne désespère pas...
Merci, et si vous avez d'autres idées, j'suis preneur.