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
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
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
oui il suffit d'intercepter le message avec classwizard ,la fonction est alors générée,comme dans le post de la faq.Envoyé par tonycalv
hum je ne comprends pas ta question.Envoyé par tonycalv
la fonction fait partie de la classe (apres generation avec classwizard), et appelée sur le message WM_CTLCOLOR.
la classe CDC est la classe de dessin (device context).Envoyé par tonycalv
chaque fenetre a besoin d'un dc pour dessiner dans sa surface cliente.
nCtlColor specifie le type de contrôle demandant la couleur:
danq l'exemple de la faq je n'utilise que le dc ...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
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...
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
ah bon premiere nouvelle ,tu as des preuves de ce que tu avances ?Envoyé par Médinoc
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.
je ne comprends pas tes questions lol,Envoyé par tonycalv
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
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/wm_ctlcolor_.aspEnvoyé par farscape
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.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
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.
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 :
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).Envoyé par farscape
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:
Dans le cas du WM_CTCTCOLOR sur la dialogue ,encore une fois je ne pense pas qu’il s’agisse du message d’origine :
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;
Extrait MFC sur classe CWnd :
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 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)
Donc les MFC gardent la compatibilité avec l’ancien message, mais ne l’utilise pas .
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); }
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…
OK, compris.
Je ne m'étais pas assez penché sur les MFC...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager