C++.NET ListBox avec polices différentes

guilt92 Messages postés 10 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 17 février 2006 - 3 févr. 2006 à 14:16
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011 - 9 févr. 2006 à 12:24
Bonjour,

je voudrais savoir si il est possible d'avoir des polices différentes selon chaque item d'une listBox, et si oui comment. Peut on appliquer un style a un String que l'on insère ensuite dans la liste ?
Par exemple ma listBox aurait les items suivants :

Item1
Item2
Item3

Merci.

9 réponses

cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
3 févr. 2006 à 20:24
Non, tu vas devoir utiliser la propriété DrawMode à OwnerDrawVariable ou OwnerDrawFixed (suivant comment tu veux gérer tes chaînes de caractère) afin de dessiner toi même la liste dans l'évenement DrawItem

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
0
guilt92 Messages postés 10 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 17 février 2006
5 févr. 2006 à 17:27
Merci pour cette réponse mais n'étant pas expert en C++ .Net j'avoue que je ne comprend pas trop. Si il était possible d'avoir plus de détails cela m'aiderait beaucoup, merci.
0
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
5 févr. 2006 à 17:48
Le mode OwnerDraw permet de dessiner toi même chaque élement du contrôle ListeBox.
Quand tu te mets en mode OwnerDrawFixed, les "string" sont stockées dans la ListBox et sont transmises dans la structure passée à l'évenment DrawItem.

En effet, en t'abonnant à l'évenement DrawItem et en précisant un des deux modes OwnerDraw, tu pourras utiliser le GDI pour dessiner chaque élement. Quant à l'obtention du contexte de dessin, tout le nécessaire est passé en paramètre de l'évenement DrawItem.

Quant au mode OwnerDrawVariable, il s'agit d'un mode dans lequel tu dois gérer toi même les strings, c'est pratique dans certains cas, mais je ne pense pas que cela soit adapté à ce que tu veux faire.

Bn courage

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
0
guilt92 Messages postés 10 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 17 février 2006
5 févr. 2006 à 18:16
Merci beaucoup je pense que je commence à comprendre. D'après les tests que j'ai pu faire quand je passe en mode OwnerDrawFixed et que j'ajoute des items "normalement" (list->item->add(objet)) ils n'apparaissent pas, il faut que je les mette en forme dans la fonction list_DrawItem c'est cela ? Si oui si tu pouvais m indiquer comment faire au travers d'un exemple ca serait génial.

Merci encore pour ton aide
0

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

Posez votre question
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
5 févr. 2006 à 18:30
Oui c'est tout à fait cela ! Un exemple tout bête :



private
void list_DrawItem(
object sender,
DrawItemEventArgs e)

{
ListBox list = (
ListBox)sender;

e.DrawBackground();
e.Graphics.DrawString(list.Items[e.Index].ToString(),
list.Font,
new
SolidBrush(
Color.FromArgb(
255,
127,
0)),

e.Bounds);


}

Bon codage

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
0
guilt92 Messages postés 10 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 17 février 2006
7 févr. 2006 à 19:46
Merci encore, cela ne fonctionne toujours pas mais je sens qu on avance !
Ci joint une partie de mon code adapté du tiens (en c++ .NET je crois que le tien etait en C# non ?)
L'idée est que par exemple pour ce test quand je click sur le bouton 1 cela ajoute le mot test a la liste, et pour le moment cela ne fonctionne pas et en revanche un message s afficher mais il n est pas dans la liste, il est juste de la bonne couleur..

Merci encore et d avance :)



private: System::Void listBox1_DrawItem(System::Object * sender, System::Windows::Forms::DrawItemEventArgs * e)


{


e->DrawBackground();


e->Graphics->DrawString(listBox1->Items->ToString(),


listBox1->Font,



new SolidBrush(couleur.Orange),


40,40);


}



private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)


{


Object *item=
new Object();


item=S"test";



this->listBox1->Items->Add(item);


}
0
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
7 févr. 2006 à 19:52
Au hasard :

e->Graphics->DrawString(listBox1->Items->ToString(),
listBox1->Font,
new SolidBrush(couleur.Orange),
e->Bounds);

De même vérifie que tu est bien en mode OwnerDrawFixed.

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
0
guilt92 Messages postés 10 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 17 février 2006
9 févr. 2006 à 10:45
Malheureusement non je ne peux pas compiler avec e->bounds...
0
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
9 févr. 2006 à 12:24
Essaye ça :



private: System::Void listBox1_DrawItem(System::Object * sender, System::Windows::Forms::DrawItemEventArgs * e)


{


System::Windows::Forms::ListBox * list =
dynamic_cast<System::Windows::Forms::ListBox*>(sender);


System::Drawing::PointF * pt =
__nogc
new System::Drawing::PointF(e->Bounds.Left,e->Bounds.Top);


e->DrawBackground();


e->Graphics->DrawString(list->Items->ToString(),


listBox1->Font,



new SolidBrush(System::Drawing::Color::Orange),


*pt);


}



Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
0
Rejoignez-nous