C++.NET ListBox avec polices différentes

Signaler
Messages postés
10
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
17 février 2006
-
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011
-
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

Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

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#
Messages postés
10
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
17 février 2006

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.
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

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#
Messages postés
10
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
17 février 2006

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
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

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#
Messages postés
10
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
17 février 2006

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


}
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

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#
Messages postés
10
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
17 février 2006

Malheureusement non je ne peux pas compiler avec e->bounds...
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

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#