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 :

Changer la couleur d'un controle


Sujet :

MFC

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

    Informations forums :
    Inscription : Février 2005
    Messages : 36
    Points : 22
    Points
    22
    Par défaut Changer la couleur d'un controle
    salut,

    j'aimerais donner une couleur à un controle (Edit, ListBox, ComboBox) de 2 façcons possibles:

    1) à l'init (OnInitDialog)
    2) dynamiquement lors de l'execution du programme

    merci pour vos réponses

    NB j'utilise les MFC

  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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 36
    Points : 22
    Points
    22
    Par défaut Couleur d'un controle
    salut!!

    J'ai pris connaissance du contenu du lien qui concerne le changement de couleur d'un controle qui est tres clair en général pour une personne se debrouillant assez bien avec visual mais me concernant ce n'est pas tout a fait le cas alors
    voici les questions que je me pose sur le contenu du lien:

    1) une fois que avoir généré une classe dérivée de CEdit (ici CMyEdit) par ClassWizard et apres avoir intercepter le message "reflect" =WM_CTLCOLOR dans la liste des messages
    est ce que la fonction 'HBRUSH CMyEdit::CtlColor' est créée automatiquement par classWizzard ? et dans ce cas est a moi de modifier la définition de cette fonction en y incluant le nom de la classe CMyEdit?

    2) comment est fait l'association entre cette fonction est le controle CEdit concerné?

    3) comment sont utilisés les paramètres( CDC* pDC, UINT nCtlColor) de la fonction et à quoi correspondent exactement ces 2 paramètres??


    je sais ça fait beaucoup de questions pour un si petit contenu mais je ne suis pas un specialiste de visual comme tu peux le constater

    merci pour tes réponses qui ne manqueront pas j'en suis sure d'être claires

    salut

  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 Re: Couleur d'un controle
    Citation Envoyé par tonycalv
    salut!!
    J'ai pris connaissance du contenu du lien qui concerne le changement de couleur d'un controle qui est tres clair en général pour une personne se debrouillant assez bien avec visual mais me concernant ce n'est pas tout a fait le cas alors
    voici les questions que je me pose sur le contenu du lien:

    1) une fois que avoir généré une classe dérivée de CEdit (ici CMyEdit) par ClassWizard et apres avoir intercepter le message "reflect" =WM_CTLCOLOR dans la liste des messages
    est ce que la fonction 'HBRUSH CMyEdit::CtlColor' est créée automatiquement par classWizzard ? et dans ce cas est a moi de modifier la définition de cette fonction en y incluant le nom de la classe CMyEdit?
    oui il suffit d'intercepter le message avec classwizard ,la fonction est alors générée,comme dans le post de la faq.

    Citation Envoyé par tonycalv
    2) comment est fait l'association entre cette fonction est le controle CEdit concerné?
    hum je ne comprends pas ta question.
    la fonction fait partie de la classe (apres generation avec classwizard), et appelée sur le message WM_CTLCOLOR.

    Citation Envoyé par tonycalv
    3) comment sont utilisés les paramètres( CDC* pDC, UINT nCtlColor) de la fonction et à quoi correspondent exactement ces 2 paramètres??
    je sais ça fait beaucoup de questions pour un si petit contenu mais je ne suis pas un specialiste de visual comme tu peux le constater
    merci pour tes réponses qui ne manqueront pas j'en suis sure d'être claires
    salut
    la classe CDC est la classe de dessin (device context).
    chaque fenetre a besoin d'un dc pour dessiner dans sa surface cliente.
    nCtlColor specifie le type de contrôle demandant la couleur:
    nCtlColor:
    CTLCOLOR_BTN Button control
    CTLCOLOR_DLG Dialog box
    CTLCOLOR_EDIT Edit control
    CTLCOLOR_LISTBOX List-box control
    CTLCOLOR_MSGBOX Message box
    CTLCOLOR_SCROLLBAR Scroll-bar control
    CTLCOLOR_STATIC Static control
    danq l'exemple de la faq je n'utilise que le dc ...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    WM_CTLCOLOR est obsolète et si ça se trouve, n'est plus envoyé.
    Il faut utiliser les versions déjà personalisées:
    WM_CTLCOLORBUTTON
    WM_CTLCOLOREDIT
    etc...

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

    Informations forums :
    Inscription : Février 2005
    Messages : 36
    Points : 22
    Points
    22
    Par défaut changement de couleur d'un controle
    salut et merci pour tes precisions

    seulement encore 2 questions (désolé!!)

    1) comment genere tu le message WM_CTLCOLOR? est ce par un sendmessage(WM_CTLCOLOR) à partir du controle à chaque fois que je desire changer de couleur?

    2)le pDC que tu utilises en 1er parametre l'obtient tu par un GetClientRect sur le controle?

    voila j'en ai terminé avec ces questions (du moins je l'espere!!)
    je te remercie déja de ta reactivité

    salut

  7. #7
    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 Médinoc
    WM_CTLCOLOR est obsolète et si ça se trouve, n'est plus envoyé.
    Il faut utiliser les versions déjà personalisées:
    WM_CTLCOLORBUTTON
    WM_CTLCOLOREDIT
    etc...
    ah bon premiere nouvelle ,tu as des preuves de ce que tu avances ?
    mais tu n'as pas precisé de quel message celui de la boite de dialogue ou
    =WM_CTLCOLOR au niveau du controle. celui qui est evoqué dans mon post, parce que je ne savais pas que les messages reflected =wm_ctlcolor etaient obsoletes et surtout plus envoyés.

    Note que pour les messages que tu cites ,le controle envoie au parent un message qui est different suvant le controle pour savoir quelle couleur utiliser .
    il y a donc de fortes chances que ça finisse dans la fonction OnCtlColor (donc WM_CTLCOLOR) au niveau de la boite de dialogue avec l'argument nCtlColor qui distingue le type de controle.

  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 Re: changement de couleur d'un controle
    Citation Envoyé par tonycalv
    salut et merci pour tes precisions

    seulement encore 2 questions (désolé!!)

    1) comment genere tu le message WM_CTLCOLOR? est ce par un sendmessage(WM_CTLCOLOR) à partir du controle à chaque fois que je desire changer de couleur?

    2)le pDC que tu utilises en 1er parametre l'obtient tu par un GetClientRect sur le controle?

    voila j'en ai terminé avec ces questions (du moins je l'espere!!)
    je te remercie déja de ta reactivité

    salut
    je ne comprends pas tes questions lol,
    quel version de visual utilises tu ? (vc6 ou vc.net)
    pourquoi tu n'essaies pas generer le message comme je te l'ai indiqué ?

    pour le 2) la fonction te fournit un DC ,je ne comprends pas ce qui te bloque.
    essaye de generer la fonction et d'appliquer le post de la faq ...
    au pire si tu as peur pour ton projet ,essaye avec un projet bidon
    ou alors celui de mon tuto :
    http://farscape.developpez.com/Samples/SampleSDI.zip

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par farscape
    ah bon premiere nouvelle ,tu as des preuves de ce que tu avances ?
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/wm_ctlcolor_.asp
    In 32-bit versions of Windows, the WM_CTLCOLOR message has been replaced by more specific notifications. These replacements include the following:

    * WM_CTLCOLORBTN
    * WM_CTLCOLOREDIT
    * WM_CTLCOLORDLG
    * WM_CTLCOLORLISTBOX
    * WM_CTLCOLORSCROLLBAR
    * WM_CTLCOLORSTATIC
    PS: Je n'ai aucune preuve de "il n'est plus envoyé", et je n'ai jamais eu l'intention d'en avoir une: le "si ça se trouve" indiquait que je n'étais pas sûr qu'il fonctionne encore.

    Mais le fonctionnement des WM_CTLCOLORXXX est le même que pour WM_CTLCOLOR: C'est toujours le contrôle qui envoit au parent le message pour lui "demander" de quelle couleur il doit être.

  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
    hum je pense que l'on ne parle pas de la même chose .
    je ne parle pas du message WM_CTLCOLOR en tant que tel mais
    Des messages MFC reflected au niveau du contrôle ...
    Relis mon post j’ai mis :
    Citation Envoyé par farscape
    mais tu n'as pas précisé de quel message celui de la boite de dialogue ou
    =WM_CTLCOLOR au niveau du contrôle. celui qui est évoqué dans mon post, parce que je ne savais pas que les messages reflected =wm_ctlcolor étaient obsolètes et surtout plus envoyés.
    Qui sauf erreur de ma part sont bien issues des messages que tu cites ( et je rajoute dans les 2 cas contrôles et dialogue).
    Je pense d’ailleurs que les MFC n’utilisent plus effectivement le message d’origine 16 bits.
    Quand dans classwizard on voit =WM_CTLCOLOR ça n’a rien a voir avec le message WM_CTLCOLOR du 16 bits c’est une combine interne.

    Extrait MFC:
    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
     
    BOOL CWnd::ReflectChildNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    //…..
    // other special cases (WM_CTLCOLOR family)
    	default:
    		if (uMsg >= WM_CTLCOLORMSGBOX && uMsg <= WM_CTLCOLORSTATIC)
    		{
    			// fill in special struct for compatiblity with 16-bit WM_CTLCOLOR
    			AFX_CTLCOLOR ctl;
    			ctl.hDC = (HDC)wParam;
    			ctl.nCtlType = uMsg - WM_CTLCOLORMSGBOX;
    			ASSERT(ctl.nCtlType >= CTLCOLOR_MSGBOX);
    			ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);
     
    			// reflect the message through the message map as OCM_CTLCOLOR
    			BOOL bResult = CWnd::OnWndMsg(WM_REFLECT_BASE+WM_CTLCOLOR, 0, (LPARAM)&ctl, pResult);
    			if ((HBRUSH)*pResult == NULL)
    				bResult = FALSE;
    			return bResult;
    		}
    		break;
    Dans le cas du WM_CTCTCOLOR sur la dialogue ,encore une fois je ne pense pas qu’il s’agisse du message d’origine :
    Extrait MFC sur classe CWnd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    BEGIN_MESSAGE_MAP(CWnd, CCmdTarget)
    	ON_MESSAGE(WM_CTLCOLORSTATIC, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLOREDIT, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLORBTN, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLORLISTBOX, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLORDLG, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLORMSGBOX, OnNTCtlColor)
    	ON_MESSAGE(WM_CTLCOLORSCROLLBAR, OnNTCtlColor)
    Les messages que tu cites sont tous interceptés et redirigés sur une seule fonction:
    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
     
    LRESULT CWnd::OnNTCtlColor(WPARAM wParam, LPARAM lParam)
    {
    	// fill in special struct for compatiblity with 16-bit WM_CTLCOLOR
    	AFX_CTLCOLOR ctl;
    	ctl.hDC = (HDC)wParam;
    	ctl.hWnd = (HWND)lParam;
    	_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
    	ctl.nCtlType = pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX;
    	ASSERT(ctl.nCtlType >= CTLCOLOR_MSGBOX);
    	ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);
     
    	// Note: We call the virtual WindowProc for this window directly,
    	//  instead of calling AfxCallWindowProc, so that Default()
    	//  will still work (it will call the Default window proc with
    	//  the original Win32 WM_CTLCOLOR message).
    	return WindowProc(WM_CTLCOLOR, 0, (LPARAM)&ctl);
    }
    Donc les MFC gardent la compatibilité avec l’ancien message, mais ne l’utilise pas .
    Maintenant d’un point de vue WIN32 tu as raison il faut utiliser les messages que tu cites,
    Mais la on parle MFC et dans ce cas précis ce n’est plus pareil…

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    OK, compris.
    Je ne m'étais pas assez penché sur les MFC...

Discussions similaires

  1. [AC-2003] Changer la couleur d'un controle au survol de la souris
    Par ThieBEN dans le forum IHM
    Réponses: 15
    Dernier message: 31/10/2012, 21h40
  2. [WPF] Changer la couleur pour des controles obligatoires
    Par BenoitM dans le forum Windows Presentation Foundation
    Réponses: 20
    Dernier message: 21/09/2012, 08h41
  3. [AC-2007] Changer la couleur d'un control à la réception du focus
    Par siriusalpha dans le forum IHM
    Réponses: 7
    Dernier message: 12/02/2011, 21h04
  4. Changer la couleur d'un controle
    Par jmde dans le forum VBA Access
    Réponses: 6
    Dernier message: 26/05/2008, 23h24
  5. Comment changer la couleur d'un contrôle ?
    Par HOFER dans le forum Access
    Réponses: 2
    Dernier message: 26/07/2006, 16h38

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