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

Delphi Discussion :

Couleur de fonte dans Canvas


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Couleur de fonte dans Canvas
    Je m'arrache les cheveux sur un problème plutôt simple : changer la couleur de la fonte en dessinant dans un Canvas (plus précisément dans un évènement OnCustomDrawItem) :

    ListView1.Canvas.FillRect(Rectangle_sans_importance);
    ListView1.Canvas.Brush.Color:=clBlue;
    ListView1.Canvas.Font.Color:=clWhite;
    ListView1.Canvas.TextRect(FRect,FRect.Left+adj,FRect.Top,Item.Caption);

    Le text est bien affiché mais toujours en noir sur fond blanc. J'en perd mon latin

    Edit : rajouté le FillRect

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Et avec Textout ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListView1.Canvas.TextOut(FRect.Left+adj,FRect.Top,Item.Caption);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Même problème malheureusement

    Pourtant je ne vois pas bien ce que je peu avoir fait de travers, et je suis sûr que ces biens ces lignes qui affichent ce texte (donc c'est pas "autre chose" qui peint par dessus mon texte).

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Chez moi j'ai essayé le code ci dessous, et ca fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.ListView1CustomDraw(Sender: TCustomListView;
      const ARect: TRect; var DefaultDraw: Boolean);
    begin
    ListView1.Canvas.Brush.Color:=clYellow; // Surlignage jaune
    ListView1.Canvas.Font.Color:=clBlue; // Texte en bleu
    ListView1.Canvas.TextOut(10,10,'cool'); // Position du texte et texte à afficher
    end;
    Tu es sur que le problème ne vient pas d'autre part?

    @+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ero-sennin
    Tu es sur que le problème ne vient pas d'autre part?
    Bah il ne reste que l'évènement lui même. Je suis déjà tombé sur un bug car quand on laisse le composant s'occuper du tracé du texte la fonte par défaut "saute" si on trace quelque chose sur le canvas dans l'évènement OnCustomDrawItem qui est déclenché avant (et apparement je suis pas le seul a avoir découvert ce problème).

    Bon ben du coup je crois que je essayer d'écrire sur un canvas virtuel et faire une copie du résultat sur le canvas du composant. Mais bon c'est loin d'être optimal, ça serait mieux si le composant marchait comme il faut

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ero-sennin
    Salut,

    Chez moi j'ai essayé le code ci dessous, et ca fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.ListView1CustomDraw(Sender: TCustomListView;
      const ARect: TRect; var DefaultDraw: Boolean);
    begin
    ListView1.Canvas.Brush.Color:=clYellow; // Surlignage jaune
    ListView1.Canvas.Font.Color:=clBlue; // Texte en bleu
    ListView1.Canvas.TextOut(10,10,'cool'); // Position du texte et texte à afficher
    end;
    Tu es sur que le problème ne vient pas d'autre part?

    @+
    Ca marche comme ça, mais essaye en rajoutant un FillRect avant et en placant le code, dans CustomDrawItem, et la ça ne marche plus

  7. #7
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    J'ai fait un petit essai sur Delphi 7 et ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    var R:TRect;
    begin
     R:=Node.DisplayRect(True);
     with Sender.Canvas do
     begin
      Brush.Color:=clblue;
      Font.Color:=clwhite;
      TextRect(R,R.Left,R.Top,Node.Text);
     end; 
    end;

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Bejaia-In
    J'ai fait un petit essai sur Delphi 7 et ça marche :
    Effectivement, mais à condition de ne rien dessiner sur le canvas avant et pas dans une ListView

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bon le bug semble etre dans la VCL, j'ai réussi à le contourner en utilisant directement les fonctions GDI de l'API Windows (SetTextColor et TextOut)

  10. #10
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Mea-culpa, je me suis trempé de composant.
    néanmoins, j'ai refais l'essai ... et ça marche toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var R:TRect;
    begin
     R:=Item.DisplayRect(drLabel);
     with Sender.Canvas do
     begin
      Brush.Color:=clRed;
      FillRect(Rect(50,50,200,100));
      Brush.Color:=clblue;
      Font.Color:=clwhite;
      TextRect(R,R.Left,R.Top,Item.Caption);
     end;
    end;
    Alors, comme tu affirmais que ça marche pas pour toi, j'ai cherché la petite bête.
    Je crois que le problème viendrais de la propriété "OwnerDraw" du ListView qu'il faut laisser à ... false !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour mettre une couleur de font dans un fieldset
    Par sophie_44 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/11/2010, 08h56
  2. Couleur+Font dans une cellule listIconGadget
    Par fadsys dans le forum PureBasic
    Réponses: 1
    Dernier message: 10/10/2009, 16h50
  3. couleur de font dans un dbgrid
    Par tarmo57 dans le forum Débuter
    Réponses: 16
    Dernier message: 24/10/2008, 22h11
  4. Changer la couleur de "font" dans un objet de type "ImageFont" dans PIL
    Par KINENVEU dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/06/2007, 03h29
  5. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15

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