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

MFC Discussion :

[MFC] gestion de couleurs


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut [MFC] gestion de couleurs
    Bonjour,

    dans l'une des vues de mon interface, j'aimerai fait apparaitre des voyants lumineux un peu comme des diodes qui prennent différentes couleurs, peuvent clignoter, etc... N'ayant pas trouvé de classe qui permette de faire ça directement, j'ai décidé (et d'ailleurs je ne suis pas sûr que ça soit très subtil), de créer une classe qui hérite de CEdit.

    J'aimerai pouvoir changer la couleur de fonc de ce CEdit. J'ai utilisé la faq :
    http://<br /> http://c.developpez.c...CtlColor<br />
    mais j'ai placé les valeurs de RGB à 255,0,255 et le fond reste blanc. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BOOL CDel::OnEraseBkgnd(CDC* pDC) 
    {
    	m_pBrushReadOnly = new CBrush(RGB(0,255,255));
        pDC->SetBkColor(RGB(255,0,255));
    	return TRUE
    }
    Je ne comprends pas pourquoi.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    hum hum ,
    il me semble que tu as mal lu mon post dans la faq....
    et rappel la fonction est generée par classwizard.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    lol! je me suis planté dans le copier/coller. Le code que j'ai copié tout à l'heure c'était un test que j'avais fait vu que ce que j'avais fait à partir de la faq ne marchait pas!!! Mon "vrai" code c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    HBRUSH CDel::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	m_pBrushReadOnly = new CBrush(RGB(0,255,255));
        pDC->SetBkColor(RGB(255,0,255));
        return (HBRUSH)m_pBrushReadOnly->GetSafeHandle();
    }
    Ce qui correspond mieux à la faq. Ceci dit j'ai toujours un fond blanc....

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    re,
    autre erreur ,
    le new il faut le faire qu'une fois sinon tu vas generer de multiples brush bonjour les fuites gdi. (regarde mon post).
    apres tu y rentre dans la fonction en debug ?

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    yep, j'ai remis le if (j'ai compris à quoi il sert maintenant ;-p)

    Par contre, j'ai mis un breakpoint et je ne passe jamais dans la fonction. L'appel n'est pas automatique?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    dans ta fenetre qui contient le controle:
    tu as attaché un control edit avec l'aide de classwizard ?
    et surtout tu as changé la classe de CEdit de ce controle par ton controle CDel ?
    a mon avis non ...

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Si je l'ai fait

    D'ailleurs j'ai intercepté WM_CHAR comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CDel::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    	return;
    }
    et ça marche bien, puisque je ne peux pas écrire dans l'Edit, par contre la couleur ça marche pas...

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    le message tu l'as mis avec class wizard ou manuellement ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    J'intercepte les deux messages à l'aide du classwizard.

    par contre je n'ai pas bien compris ce qu'était reflect dans :
    "reflect" =WM_CTLCOLOR

    dans le classwizard j'ai juste sélectionné WM_CTLCOLOR, de même que j'ai sélectionné WM_CHAR et qu'il m'a pour les deux proposé un nom de méthode automatiquement. Ensuite j'ai fait "Edit Code"

    voila

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu dois avoir un message avec =WM_CTLCOLOR dans la liste des messages.
    ces messages apparaissent en premier dans la liste ...
    tu as donc pris le mauvais message.
    tu dois avoir dans le message_map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
    	//{{AFX_MSG_MAP(CMyEdit)
    	ON_WM_CTLCOLOR_REFLECT()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    sinon c'est pas bon.


  11. #11
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut Merci!!!!!
    Effectivement je n'utilisai pas le bon message...
    Désolé.

    Bon ben mon problème est résolu.
    Par contre, si quelqu'un pouvait m'expliquer le différence entre WM_CTLCOLOR et =WM_CTLCOLOR ou plus généralement la différence entre les messages "reflected from control" et les autres messages.

    Merci

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    re,
    Dans les MFC chaque contrôle envoie un message au parent pour demander sa couleur
    De ce fait si on veut gérer les couleurs des contrôles il suffit d’intercepter le message WM_CTLCOLOR au niveau de la fenêtre parent.
    Voir faq :
    http://c.developpez.com/faq/vc/?page...alogBkgndColor

    Ce qui n’est pas forcement pratique, puisque ça oblige a définir les couleurs au niveau de la fenêtre parent.

    Avant les MFC 4.0 on n’avait pas le choix.
    Pour améliorer le traitement des couleurs MS à rajouter avec les MFC 4.0 la notion de message reflected qui permet de définir la couleur au niveau du contrôle .

    Cette technique permet la combinaison des deux méthodes, celle de la personnalisation au niveau du parent avec WM_CTLCOLOR et celle du message reflected au niveau du contrôle.
    Le message au niveau du contrôle étant préfixé d’un =

    Au final il est donc normal que le message WM_CTLCOLOR ne fonctionne pas au niveau du contrôle.

    Ps:si c'est suffisamment clair je rajouterais cette explication dans la faq.


  13. #13
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut Bonne idée
    Personnellement j'ai trouvé ça très clair. Je pense effectivement que ce serait une bonne idée d'ajouter ça à la faq. Tant l'expliquation sur les "reflected message" que l'exemple avec les couleurs me semblent judicieux.

    merci pour l'expliquation.

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

Discussions similaires

  1. Application MFC - MDI - Gestion des couleurs étrange
    Par m.olivier.valentin dans le forum MFC
    Réponses: 10
    Dernier message: 01/06/2009, 08h54
  2. [MFC] Gestion d'un bus GPIB
    Par angeromudelparis dans le forum MFC
    Réponses: 8
    Dernier message: 04/10/2005, 12h25
  3. [Debutant] gestion des couleurs ??
    Par MaxiMax dans le forum OpenGL
    Réponses: 5
    Dernier message: 26/03/2004, 08h34
  4. [MFC] RichEdit et couleurs
    Par basnifo dans le forum MFC
    Réponses: 12
    Dernier message: 25/01/2004, 17h07
  5. [MFC]gestion du controle MaskedEdit
    Par dj_kyl dans le forum MFC
    Réponses: 2
    Dernier message: 27/11/2003, 19h58

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