IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Coloriser partiellement les Items d'un TreeView


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut Coloriser partiellement les Items d'un TreeView
    Bonjour,

    j'utilise un TTreeViewpour afficher le résultat d'une requête issue d'un filtre
    Je voudrais dans mes noeuds du TreeView coloriser différemment la partie du text correspondant u critère saisi

    Par exemple si je saisis en critère li et que la requete me renvoie Félix
    je voudrais voir Fé en noir, li en bleu et x en noir

    J'ai trouvé des sujets traitant de la propriété CustomDrawItem mais le canvas est celui de tout le Treeview

    Si quelqu'un a déà fait cela une idée serait bien venue

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Il te faut redessiner tout le texte du nœud

    le OnDraw fourni le Node
    Du node, tu peux avoir la zone via DisplayRect()

    Je te conseille d'utiliser un bitmap intermédiare de la taille renvoyé par DisplayRect
    Il y a des API qui font le travail pour dessiner du texte d'une couleur en fonction du fond mais je ne les connais pas

    une approche manuelle
    tu dessine le fond d'abord
    Via TextWidth tu connaitra la longueur de la zone sélectionnée
    Puis tu dessine sur une autre image, le texte
    Puis via un BitBlt , tu fusionne les deux images, je te laisse trouve la bonne dwRop, je ne sais jamais laquelle est la bonne

    Tu as une autre fonction qui permet aussi de gérer un masque, cela peut-être une autre approche pour le dessin
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour.

    Voici un code utilisant un bitmap pour colorier certaines parties d'un texte.
    A adapter à ton TTreeview.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TextMultiColors(const AStr: array of string; const AColors: array of TColor; Bmp: TBitmap; BkgColor: TColor);
    var
      I, L, T: integer;
    begin
      with Bmp do
      begin
         Canvas.Brush.Color:= BkgColor;
         Canvas.FillRect(Rect(0,0,Width,Height));
         T:= (Height - Canvas.TextHeight('M')) div 2; // centrer verticalement
         L:= 2; // offset gauche de départ
         for I:= 0 to High(Astr) do
         begin
            Canvas.Font.Color:= AColors[I];
            Canvas.TextOut(L, T, AStr[I]);
            L:= L + Canvas.TextWidth(AStr[I]);
         end;
      end;
    end;
    Exemple d'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P: integer;
      Bmp: TBitmap;
      S, SPos: string;
    begin
       S:= edit1.text;
       SPos:= edit2.text; // le sous-texte à trouver
       Bmp:= TBitmap.Create;
       Bmp.Width:= 200;
       Bmp.Height:= 21;
       Bmp.Canvas.Font.Assign(Font);
       P:= Pos(SPos, S);
       if P > 0 then
          TextMultiColors([Copy(S,1,P-1), Copy(S,P,Length(SPos)), Copy(S,P+Length(SPos),MAXINT)],
                       [clBlack,clBlue,clBlack], Bmp, clSilver)
       else
          TextMultiColors([S],[clBlack], Bmp, clSilver);
       Canvas.Draw(100,100,Bmp);
       Bmp.Free;
    end;
    Thierry

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    Merci à vous deux
    J'essaie de travailler là-dessus
    Si je sors un résultat intéressant je mettrai le code en réponse

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    J'ai commencé et on arrive bien à personnaliser l'affichage de la propriété Text du noeud
    Par contre il faut dans l'évènement CustomDrawItem il faut mettre DefaultDraw à False.

    Là l'ensemble du noeud est effacé et à redessiner, Image et bouton d'expand compris.
    Et pour le bouton je sèche.

  6. #6
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour,

    Utilise l'événement OnAdvancedCustomDrawItem au lieu de OnCustomDrawItem,
    et ne modifie pas la valeur DefaultDraw.

    Thierry

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Par défaut
    Citation Envoyé par Delphi-ne Voir le message
    J'ai commencé et on arrive bien à personnaliser l'affichage de la propriété Text du noeud
    Par contre il faut dans l'évènement CustomDrawItem il faut mettre DefaultDraw à False.

    Là l'ensemble du noeud est effacé et à redessiner, Image et bouton d'expand compris.
    Et pour le bouton je sèche.
    pour le bouton d'expand tu a 2 façon de faire :
    - la méthode avec des images déjà faites ( qui peuvent être plus jolies)
    - la méthode à l'ancienne avec drawrect, lineto moveto, ..

    pour cela sur l'item tu as la propriété expand(ed ?) qui te permettra de savoir si ton noeud est plié ou déplié

Discussions similaires

  1. C# WPF Lister les items d'un TreeView
    Par juliensmarties dans le forum C#
    Réponses: 3
    Dernier message: 16/04/2010, 17h20
  2. définir un menu contextuel sur les items d'un treeview
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 05/05/2008, 19h51
  3. [TListView] Déplacer / Arranger les items
    Par Ingham dans le forum Composants VCL
    Réponses: 4
    Dernier message: 14/07/2004, 15h52
  4. Comment espacer les Items d'un TMainMenu ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 15h57
  5. Recuper les items de ListBox d'une autre application [API?]
    Par Shamanisator dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo