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] hériter CStatic


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut [MFC] hériter CStatic
    Bonjour,

    alors voilà, j'ai utilisé cette faq pour créer un CStatic avec de la couleur. Et je viens de prendre conscience qu'il y a un truc que je n'ai pas compris dans la mfc, c'est cette histoire de m_hWnd.
    Pourquoi, dans ma classe héritée de CStatic (que j'ai appelé CColorStatic), mon m_hWnd est toujours NULL?
    Le truc c'est que je ne peux pas faire un ::Create(), car j'ai dessiné mon CStatic à la souris dans l'éditeur (je l'ai ensuite lié à une variable membre via DDX_Control).

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    m_hWnd c'est le handle Win32 de la fenêtre .
    si il est null c'est que le subclass du contrôle par DodataExchange (par l'intermediaire du premier UpateData(FALSE)) n' est pas fait...

    donc tu travailles peut être avec la mauvaise variable...
    en bref y a un chisme quelque part...


  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    si il est null c'est que le subclass du contrôle par DodataExchange (par l'intermediaire du premier UpateData(FALSE)) n' est pas fait...
    Que veux-tu dire par là? En effet, je ne fais pas de UpdateData, mais où dois-je le mettre?
    Sinon, j'ai essayé un truc: dans le OnInitDialog de la fenêtre qui contient mon CColorStatic ( : public CStatic ) j'ai vu que si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaFenetre::OnInitDialog()
    {
    monStatic.SetBkColor();
    CDialog::OnInitDialog(RGB(255,0,0));
    }
    Là ça ne marche pas(m_hWnd = NULL)
    et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaFenetre::OnInitDialog()
    {
    CDialog::OnInitDialog();
    monStatic.SetBkColor(RGB(255,0,0));
    }
    Là ça ne marche pas non plus (le CStatic garde la couleur par défaut, celle que j'ai choisi lors de la création dans la fenêtre de propriétés, soit un gris foncé vraiment très moche), mais le m_hWnd n'est plus NULL.

    Voilà ma fonction SetBkColor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CColorStatic::SetBkColor(COLORREF clrCtlBk, COLORREF clrCtlText)
    {
        m_crTextClr = clrCtlText; 
        m_crTextBk = clrCtlBk; 
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
     
        if(m_hWnd) Invalidate();
    }
    Il y a quelque chose qui cloche?


    Citation Envoyé par farscape
    donc tu travailles peut être avec la mauvaise variable...
    voyons, ce n'est pas mon genre...

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    si tu relis la faq sur le post UpdateData c'est expliqué :
    le premier UpdateData est fait sur OnInitDialog ou OnInitialUpdate de la classe de base .
    si ta colorisation ne fonctionne pas c'est que tu n'as pas intercepté le bon message .
    le message c'est =WM_CTLCOLOR le = voulant dire reflected...

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Il vient bien dans CtlColor quand je fais invalidate() ,mais la couleur du CStatic n'est pas modifiée. Pour tester, j'ai fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
    {
        m_crTextClr = RGB(255,255,255); 
        m_crTextBk = RGB(0,0,0); 
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
     
        pDC->SetTextColor(m_crTextClr);
     
        return m_hbrColorBk;
    }
    et je fais un Invalidate à la fin du OnInitDialog de la fenêtre "propriétaire". Il passe bien dans CtlColor(), toutes mes valeurs sont ok, mais la couleur ne change pas. J'ai l'impression qu'il y a quelque chose qui m'échappe

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    hum ok rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pDC->SetBkMode(TRANSPARENT);

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    ça ne change rien

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    la brosse doit etre créée une seule fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::CreateSolidBrush(m_crTextBk);
    on retournera m_hbrColorBk.
    vu que tu as fait le boulot dans la fonction SetBkColor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
    {
        pDC->SetTextColor(m_crTextClr);
        pDC->SetBkMode(TRANSPARENT);
     
        return m_hbrColorBk;
    }
    et tu me confirmes que tu as bien ça dans ton message map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
        //{{AFX_MSG_MAP(CColorStatic)
        ON_WM_CTLCOLOR_REFLECT()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    oui, j'ai tout cela. A la limite, le plus simple c'est que je te donne tout le code:
    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
    22
    23
    24
    25
    26
    27
    // ColorStatic.h
    #pragma once 
     
    // class CColorStatic, design based on the CTplCtrl class by Farscape, src and doc can be found on
    // this adress: <a href="http://c.developpez.com/faq/vc/?page=Colorisations#SetColorCtrl" target="_blank">http://c.developpez.com/faq/vc/?page...s#SetColorCtrl</a>
     
    class CColorStatic : public CStatic
    {
    public:
        CColorStatic();
        virtual ~CColorStatic();
     
        void            SetBkColor        (COLORREF clrCtlBk = RGB(192, 192, 192), // couleur de fond
                                         COLORREF clrCtlText = RGB(0, 0, 0));     // couleur d'écriture.               
        HBRUSH            CtlColor        (CDC* pDC, UINT nCtlColor);
        virtual BOOL    OnChildNotify    (UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult );
     
    protected:
        HBRUSH        m_hbrColorBk;    // brush de fond
        COLORREF    m_crTextBk;        // couleur de fond
        COLORREF    m_crTextClr;    // couleur du texte
     
        //{{AFX_MSG(CbaseStatic)
        //}}AFX_MSG
     
        DECLARE_MESSAGE_MAP()
    };
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    //ColorStatic.cpp
    #include "stdafx.h"
     
    #include "ColorStatic.h"
     
    CColorStatic::CColorStatic()
    {
        m_crTextClr =    RGB(255,255,255); 
        m_crTextBk =    RGB(0,0,0); 
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
    }
     
    CColorStatic::~CColorStatic()
    {
        ::DeleteObject(m_hbrColorBk);
    }
     
    BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
        //{{AFX_MSG_MAP(CColorStatic)
        ON_WM_CTLCOLOR_REFLECT()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    void CColorStatic::SetBkColor(COLORREF clrCtlBk, COLORREF clrCtlText)
    {
        if(m_hWnd) Invalidate();
    }
     
    HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
    {
        m_crTextClr = RGB(255,255,255);
        m_crTextBk = RGB(0,0,0);
        if (m_hbrColorBk) ::DeleteObject(m_hbrColorBk);
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
     
        pDC->SetTextColor(m_crTextClr);
     
        pDC->SetBkMode(TRANSPARENT);
     
        return m_hbrColorBk;
    }
     
    BOOL CColorStatic::OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult )
    {
        // interception du message reflect
        if(message >= WM_CTLCOLORMSGBOX && message <= WM_CTLCOLORSTATIC)
        {            
            UINT nCtlType = message - WM_CTLCOLORMSGBOX;
            ASSERT(nCtlType >= CTLCOLOR_MSGBOX);
            ASSERT(nCtlType <= CTLCOLOR_STATIC);
     
            CDC dcTemp; dcTemp.m_hDC = (HDC)wParam;
     
            HBRUSH hbr = CtlColor(&dcTemp, nCtlType);
            // fast detach of temporary objects
            dcTemp.m_hDC = NULL;
            *pLResult = (LRESULT)hbr;
            return TRUE;
        }
        return CStatic::OnChildNotify( message,wParam, lParam,pLResult );
    }
    * ici, la fonction SetBkColor ne fait rien qu'un Invalidate (c'est pour le test). C'est elle que j'apelle depuis la fenêtre propriétaire.
    * mon CColorStatic est déclaré ainsi:
    et "lié" ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DDX_Control(pDX, IDC_MON_STATIC,        m_static);
    Enfin le OnInitDialog de la fenêtre "propriétaire":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BOOL CBEMainDialog::OnInitDialog()
    {
        CDialog::OnInitDialog();
    [...]
     
        m_static.SetBkColor();
        return FALSE;    
    }

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    heu vire moi
    OnChildNotify c'etait pour le template pour gérer le message des couleurs!
    de plus ta fonction setbackcolor est vide !

    bon on reprend rapido j'ai fais ça:

    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
    22
    23
    24
    25
    26
    27
     
    // ColorStatic.h
     #pragma once 
     
    // class CColorStatic, design based on the CTplCtrl class by Farscape, src and doc can be found on
    // this adress: <a href="http://c.developpez.com/faq/vc/?page=Colorisations#SetColorCtrl" target="_blank">http://c.developpez.com/faq/vc/?page...s#SetColorCtrl</a>
     
    class CColorStatic : public CStatic
    {
    public:
        CColorStatic();
        virtual ~CColorStatic();
     
        void            SetBkColor(COLORREF clrCtlBk = RGB(192, 192, 192), // couleur de fond
                                   COLORREF clrCtlText = RGB(0, 0, 0));     // couleur d'écriture.               
        HBRUSH            CtlColor        (CDC* pDC, UINT nCtlColor);
     
    protected:
        HBRUSH      m_hbrColorBk;    // brush de fond
        COLORREF    m_crTextBk;        // couleur de fond
        COLORREF    m_crTextClr;    // couleur du texte
     
        //{{AFX_MSG(CbaseStatic)
        //}}AFX_MSG
     
        DECLARE_MESSAGE_MAP()
    };
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    CColorStatic::CColorStatic()
    {
        m_crTextClr =     RGB(255,255,255); 
        m_crTextBk =      RGB(0,0,0); 
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
    }
     
    CColorStatic::~CColorStatic()
    {
        ::DeleteObject(m_hbrColorBk);
    }
     
    BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
        //{{AFX_MSG_MAP(CColorStatic)
        ON_WM_CTLCOLOR_REFLECT()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    void CColorStatic::SetBkColor(COLORREF clrCtlBk, COLORREF clrCtlText)
    {
        m_crTextClr = clrCtlText;
        m_crTextBk = clrCtlBk;
        if (m_hbrColorBk) ::DeleteObject(m_hbrColorBk);
        m_hbrColorBk =    ::CreateSolidBrush(m_crTextBk);
     
        if(m_hWnd) Invalidate();
    }
     
    HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
    {
     
        pDC->SetTextColor(m_crTextClr);
        pDC->SetBkMode(TRANSPARENT);
     
        return m_hbrColorBk;
    }

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Bonbonbon... hum, comment dire... je viens de voir un petit détail. Ho, pas grand chose, mais bon tout de même... le CStatic sur lequel je travaillais était de type Picture, et non de type Text. J'ai changé ça, et forcément, maintenant ça marche.
    euh, sinon bah j'ai des amis au pôle nord, je crois que je vais aller faire un tour par là-bas le temps de me faire oublier un peu...

    encore merci farscape

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par r0d
    Bonbonbon... hum, comment dire... je viens de voir un petit détail. Ho, pas grand chose, mais bon tout de même... le CStatic sur lequel je travaillais était de type Picture, et non de type Text. J'ai changé ça, et forcément, maintenant ça marche.
    euh, sinon bah j'ai des amis au pôle nord, je crois que je vais aller faire un tour par là-bas le temps de me faire oublier un peu...

    encore merci farscape
    Besoin de vacances ?

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    Besoin de vacances ?
    Des vacances, c'est quoi? C'est quand on ne programme pas? Bon bah dans ce cas, je vais avoir deux jours de vacances dès demain, car là, je crois qu'il ne vaut mieux pas que je touche un clavier du week-end

    Sinon, c'est clair que j'ai bien besoin de vacances, mais hélas, ce ne sera pas pour tout de suite -cry-

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

Discussions similaires

  1. [MFC] CStatic et couleur de fond
    Par r0d dans le forum MFC
    Réponses: 2
    Dernier message: 20/04/2006, 18h17
  2. [MFC] Un simple affichage d'image dans CStatic
    Par rabobsky dans le forum MFC
    Réponses: 2
    Dernier message: 02/03/2006, 12h28
  3. Réponses: 7
    Dernier message: 25/03/2005, 14h05
  4. [MFC] CStatic en gras
    Par hpfx dans le forum MFC
    Réponses: 8
    Dernier message: 12/01/2004, 14h10
  5. [MFC]arriere plan pour un objet de la classe CStatic
    Par gabriel knight dans le forum MFC
    Réponses: 13
    Dernier message: 28/07/2003, 10h42

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