Font listbox, ou dessin personalisé de composants

Soyez le premier à donner votre avis sur cette source.

Vue 7 848 fois - Téléchargée 534 fois

Description

C'est une demande régulière dans le forum : comment utiliser le dessin personnalisé des composant ( comme listbox, combobox, stringgrid ...). La méthode est poutant simple et permet d'obtenir des résultats visuellement insteressants.

La propriété utile dans ce cas est ListBox.Style :
lbStandard : dessin classique
lbOwnerDrawFixed : dessin personalisé mais dont les éléments ont tous la même taille
lbOwnerDrawVariable : dessin complètement personalisé ( c'est le cas ici )

Source / Exemple :


procedure TForm1.FormCreate(Sender: TObject);
begin
  FontsListBox.Items.Assign(Screen.Fonts);
end;

procedure TForm1.FontsListBoxMeasureItem(Control: TWinControl;
  Index: Integer; var Height: Integer);
begin
  // La fonte est associée à celle du canevas pour pouvoir en déterminer
  // sa hauteur en pixels.
  FontsListBox.Canvas.Font.Name:=FontsListBox.Items[Index];
  FontsListBox.Canvas.Font.Size:=FontsListBox.Font.Size;
  // le +1 n'est ajouté que pour pouvoir dessiner les lignes de séparation
  // Sans, les lignes c'est inutile
  Height:=FontsListBox.Canvas.TextHeight(FontsListBox.Items[Index])+1;
end;

procedure TForm1.FontsListBoxDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with FontsListBox.Canvas do
  begin
    // Dessin du fond avec la couleur par défaut
    // Delphi gère lui-même dans ce cas la sélection
    FillRect(Rect);
    // Dessin de la ligne de séparation
    // Ce n'est pas plus joli, mais ça montre bien les éléments de différentes tailles
    Pen.Color:=Font.Color;
    MoveTo(Rect.Left,Rect.Top);
    LineTo(Rect.Right,Rect.Top);
    // Dessin du texte en fonction de la fonte en cours
    Font.Name:=FontsListBox.Items[Index];
    Font.Size:=FontsListBox.Font.Size;
    if odSelected In State
      Then Font.Color := clHighLightText
      Else Font.Color := clBtnText;
    // le +1 n'est ajouté que pour pouvoir dessiner les lignes de séparation
    // Sans, les lignes c'est inutile
    TextOut(Rect.Left, Rect.Top+1, FontsListBox.Items[Index]);
  end;
end;

Conclusion :


Il aurai peut-être été mieux de faire un composant, mais ce n'est pas le but de ce source.
-------------
Cette source et quelques autres sur : http://nono40.developpez.com

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
18 mai 2004

c super ce que tu as fait en 2002 mais nous somme en 2004, il fo le pousser plus loin ta source...
Par exemple comment on peut redessiner la partie basse du control, c à dire la partie ou c vide d'Item!

Je cherche depuis 1 an et je trouve pas! Bon en mm temps je ne fais pas ke ça!
Messages postés
71
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
24 février 2012

Salut Nono!

Je programme un tchat, et je cherche une source pour pouvoir afficher différentes polices et couleurs dans le même objet. Est-ce-qu'avec une ListBox, il est possible de garder les propriétés du texte formaté, c'est-à-dire pouvoir faire un copier/coller d'un mot dans ce qui est affiché?
Avec RichEdit, c'est possible, mais je n'arrive pas à afficher d'image...
Merci de ton aide, je vais continuer à étudier cette source... à+
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
Non, c'est du fait maison... Je n'ai pas installé le répertoire Demos sur mon PC.
Il n'y a pas cinquante méthodes non plus pour arriver au résultat.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
En dehors des lignes séparatrices, cet exemple ne serait-il pas inspiré de l'exemple fourni par Borland dans le répertoire Demos/OwnerLst ?

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.