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

C++Builder Discussion :

Problème pour récupérer les composantes RVB d'un TColor [FAQ]


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut Problème pour récupérer les composantes RVB d'un TColor
    Bonjour à tous

    J'ai un souci pour récupérer les composantes RVB d'un TColor

    Si dans mon TColor, je met une couleur primaire comme clRed ou clBlue,
    Aucun problème.

    En me référant a la FAQ, je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       TColor Couleur = clRed;
     
       BYPE Rouge = GetRValue(Couleur);
       BYTE Vert = GetGValue(Couleur);
       BYPE Bleu = GetBValue(Couleur);
    Jusque là, pas de problème

    Or, dès que je met Couleur = clAppWorkSpace;

    Plus rien ne va, les composantes Couleur me donne la couleur Noir

    Est ce que quel'un aurait une solution

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Si vous mettez votre curseur sur clAppWorkSpace en appuyant sur Ctrl et que vous cliquiez le curseur qui devient une main, vous allez dans Graphics.hhp et on y lit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const TColor clAppWorkSpace = 0x8000000c;
    ce qui est presque noir. En fait, vous avez Rouge=12 en décimal, soit effectivement c en hexadécimal, et les deux autres composantes à 0 et c'est ce qu'on obtient à l'exécution de votre code.

    À bientôt
    Gilles

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci pour ta réponse.

    Mais, pourquoi la couleur clAppWorkSpace est grise quand on la sélectionne dans un TColorBox ?

  4. #4
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Il semble que ce soit bien cette couleur-là, par exemple le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::ColorBox1Change(TObject *Sender)
    {
    TColor Couleur = ColorBox1->Selected;
    ShowMessage("Rouge="+IntToStr(GetRValue(Couleur))
               +" Vert="+IntToStr(GetGValue(Couleur))
               +" Bleu="+IntToStr(GetBValue(Couleur)));
    }
    donnera bien Rouge=12 et les deux autres composantes à 0.

    Si vous rajoutez un TLabel et que vous écriviez :

    on voit bien un gris, peut-être un peu plus foncé que celui proposé dans le composant.

    À bientôt
    Gilles

  5. #5
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    En fait pour expliquer plus clairement, cette couleur est la couleur des arrière plan des applications dans windows. Par exemple, dans word, la couleur du fond de l'écran derrière ces pages est de cette couleur.

    Je veux utiliser cette couleur pour mon application quand elle est au repos.

    Ce que je ne comprend pas, c'est que lorsque j'utilise cette couleur pour peindre ma form en coloriant le Canvas, la couleur correspond, par contre lorsque je veux utiliser cette couleur dans OpenGL, la couleur ne correspond pas.

    C'est ça qui me pose problème.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       TColor Couleur = clAppWorkSpace
       Canvas->Brush->Color = Couleur;
       Canvas->Pen->Color = Couleur;
       Canvas->Rectangle(0, 0, Form->Width, Form->Height);
    là aucun problème, la couleur correspond.

    Or dès que je veux intégré ma couleur à OpenGL, cela ne va plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            TCouleur Couleur = clAppWorkSpace;
     
            float Rouge = float(GetRValue(CouleurCible));
            float Vert = float(GetGValue(CouleurCible));
            float Bleu = float(GetBValue(CouleurCible));
     
            glClearColor(Rouge, Vert, Bleu, 1.0f);
    J'obtiens la Couleur que tu me dis.
    Pourquoi ces 2 couleurs ne sont pas identiques ?

  6. #6
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Je ne sais pas utiliser OpenGL avec C++ Builder6, je ne peux tester la fonction glClearColor.

    Cela dit, d'après son nom, vous faites un Clear, c'est curieux, cela expliquerait peut-être que les composantes soient remises à 0.

    À bientôt
    Gilles

  7. #7
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Cette fonction efface la zone de dessin avec la couleur passé en paramètre.

    Comme j'ai 12 0 0 dans mes composantes couleurs, elle m'efface l'écran avec cette couleur. Moi je voudrais qu'elle soit de la même couleur que si je l'avais effacé en dessinant sur le Canvas. C'est là qu'est le problème.

    Pourquoi les couleurs ne correspondent pas.

  8. #8
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    Tout simplement parce que vous n'avez pas des valeurs RGB de la couleur.

    TColor peut avoir principalement 4 formats
    00bbggrr : utilisation de la fonction RGB
    010000nn : utilisation de la fonction PaletteIndex
    02bbggrr : utilisation de la fonction PaletteRGB
    800000nn : constante définie dans Graphics.PAS en utilisant les constantes Windows.

    Dans ton cas, on est dans le dernier cas, une constante Windows... Donc pas de données RGB...

    Le truc est donc de trouver un moyen de convertir une constante Windows en sa valeur RGB. (probablement GetSysColor)

  9. #9
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Alors pourquoi quand je fait cela avec une couleur primaire style le rouge (clRed) ou le bleu (clBlue), il n'y a pas de problème. cela ne devrait pas marcher non plus.

    Je me suis référé a la FAQ pour la récupération des composantes RGB d'un TColor donc, cette technique ne marche pas tout le temps ??

  10. #10
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par kurul1
    Alors pourquoi quand je fait cela avec une couleur primaire style le rouge (clRed) ou le bleu (clBlue), il n'y a pas de problème. cela ne devrait pas marcher non plus.
    Si. Il ne font pas confondre les constantes de couleurs système avec les constantes de couleurs classiques, même si elles sont mélées. clRed n'est rien d'autre que la couleur rouge, 0x000000FF. Les constantes systèmes sont des couleurs logiques, 0x800000xx.
    clRed n'est en aucun cas une constante de couleur système.

    Citation Envoyé par kurul1
    Je me suis référé a la FAQ pour la récupération des composantes RGB d'un TColor donc, cette technique ne marche pas tout le temps ??
    Effectivement, cette méthode ne fonctionne pas avec les couleurs systèmes. Une correction sera faite dans la prochaine mise à jour. Merci de nous l'avoir signalé !

    Arnaud

  11. #11
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Je comprend mieux maintenant, merci pour ta réponse

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

Discussions similaires

  1. Problème pour récupérer les clés crées
    Par guigui5931 dans le forum JDBC
    Réponses: 2
    Dernier message: 09/05/2007, 13h46
  2. Réponses: 12
    Dernier message: 04/09/2006, 17h59
  3. Réponses: 12
    Dernier message: 25/06/2006, 23h24
  4. Réponses: 1
    Dernier message: 07/06/2006, 18h56
  5. Réponses: 2
    Dernier message: 26/10/2004, 17h42

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