problèmes avec CWnd::OnCtlColor

problèmes avec CWnd::OnCtlColor - C++ - Programmation

Marsh Posté le 20-10-2008 à 18:24:00    

salut à tous,
 
Dans un précédent post, je posais le problème de rafraichissement de CEdit (ré-écriture par dessus du texte sans effacement de la valeu r précédente).
 
Je viens de m'apercevoir que ça vient de ce que je fais la fonction Windows OnCtlColor, ce qui implique deux questions :
 
1) : Pourquoi le fait de rendre le fond transparent d'un CEdit me provoque le problème décrit ci-dessus et comment le résoudre? (lorsque je retire la partie :  
 

Code :
  1. pDC->SetBkMode(TRANSPARENT);


 
ça marche mieux)
 
2) Pourquoi la fonction OnCtlColor n'est pas appelée pour redessiner mes "picture control"? En effet, je ne rentre jamais dans cette condition :
 

Code :
  1. if( pWnd->GetDlgCtrlID() == IDC_G_FOND )
  2. {
  3.  pDC->SetBkMode(TRANSPARENT);      // Set the Background Mode to TRANSPARENT
  4.  hbr = m_cDesign.m_Brush_Hollow;
  5. }


 
avec IDC_G_FOND qui est un picture control de type Bitmap
 
Voilà, merci d'avance pour vos lumières!!!!

Reply

Marsh Posté le 20-10-2008 à 18:24:00   

Reply

Marsh Posté le 21-10-2008 à 03:29:41    

Pour ta seconde question, comme expliqué ici :
http://msdn.microsoft.com/en-us/library/0wwk06hc(VS.80).aspx
ou plus clairement ici :
http://msdn.microsoft.com/en-us/library/bb432504.aspx
 
WM_CTLCOLOR / OnCtlColor n'est appelé que pour, je cite, "list boxes, the list boxes of combo boxes, message boxes, button controls, edit controls, static controls, and dialog boxes".
 
Je te laisse conclure.


Message édité par antsite le 21-10-2008 à 03:31:02
Reply

Marsh Posté le 21-10-2008 à 23:33:20    

C'est ce que j'avais lu mais un picture control, c'est un static control, non (une variable de contrôle est un CStatic)?

Reply

Marsh Posté le 22-10-2008 à 05:53:13    

oui tu as raison je n'ai pas fait attention.
 
Les differents styles de controles static ne reagissent pas tous de la meme maniere a WM_CTLCOLOR. Par exemple MSDN dit de ne pas traiter ce message pour SS_SIMPLE il me semble, ou du moins le HBRUSH retourne est inutilise.
 
Hypothese :
Pour un SS_BITMAP si on y reflechit un peu : ce controle contient un bitmap, donc le systeme y peint uniquement un bitmap, une couleur de fond n'a pas de sens dans cette situation ? Surtout que MSDN dit bien que le control BITMAP sera automatiquement redimensionne a la taille du bitmap.
 
Donc que veux-tu faire au juste ? Tes controles static seront dimensionnes automatiquement a la taille du bitmap, donc a quel moment comptes-tu voir une couleur de fond ?


Message édité par antsite le 22-10-2008 à 13:05:39
Reply

Marsh Posté le 22-10-2008 à 12:24:21    

je voudrais modifier la couleur de fond pour rendre tranparent un GIF animé (en utilisant ne classe spéciale); mon contrôle est d'un type qui dérive de CStatic.
Remarque : le gif animé est crée avec un fond transparent mais dans MFC, le fond est de la couleur du sytème (gris moisi) alors que ce gif peut être mis par dessu un bitmap.
 
A la base, j'utilisais WM_CTLCOLOR pour d'autres bitmap "fixes" mais au final, ça ne sert à rien, comme tu le précisais.
 
Sinon, as-tu une idée pour remédier au problème du fond tranparent utilisé sur un CEdit?
 

Reply

Marsh Posté le 23-10-2008 à 01:56:20    

Non je n'ai pas d'idee, mais je te suggere de clarifier ton probleme et de citer le post auquel tu fais reference (ou au moins donner le lien) pour avoir plus chance d'obtenir des reponses.


Message édité par antsite le 23-10-2008 à 01:56:38
Reply

Marsh Posté le 23-10-2008 à 12:32:40    

en fait c'est dans ce même post, il s'agit de ma première question posée

Reply

Marsh Posté le 23-10-2008 à 12:51:20    

je parlais de l'autre topic cite au debut.
 
je n'ai jamais essaye de rendre le fond d'un edit transparent, c'est peut-etre possible, essaie en faisant SetBkMode(TRANSPARENT) et en retournant le hollow_brush comme dans ta question 2 dans OnCtlColor. Honnetement je doute que ca marche aussi facilement, mais si c'est le cas et bien n'hesite pas a nous le faire savoir !

Reply

Marsh Posté le 24-10-2008 à 17:08:11    

salut,
 
Si, de cette manière ça marche nickel!!!  
 
Mais le problème, c'est que lorsque je mets à jour la variable de valeur (CString) associée au CEdit, cette nouvelle valeur est réecrite par dessus visuellement parlant; par exemple si j'affiche "5" puis "6", alors le 6 sera affiché sur le 5... Suis-je clair..??

Reply

Marsh Posté le 25-10-2008 à 01:35:02    

oui oui j'avais bien compris, mais regarde ce qu'il fait :
- edit est vide, ok le fond est hollow-brush donc c transparent avec ce qu'il y a en dessous
- edit est maintenant rempli avec du texte, si tu ecris qqch de nouveau, le background utilise pour effacer avant reecriture est toujours HOLLOW_BRUSH et donc il n'efface pas ce qui est en dessous, ton ancien texte est reecrit par dessus, sans etre efface (ben oui c'est bien ca un HOLLOW_BRUSH).
 
C'est ce a quoi je pensais en disant que ca m'etonnerait quoi ca soit aussi simple  ;)  
 
sinon il semblerait que la solution soit de creer non pas un HOLLOW_BRUSH mais un brush avec dedans ton bitmap (le fond/background quoi), ainsi ca donnera l'illusion que ton edit est transparent (en fait il ne l'est pas, c'est juste que son fond est pareil a ce qu'il y a en dessous).
 
http://www.codeproject.com/KB/mobi [...] trols.aspx
 
C'est pour Windows Mobile, mais il n'y a pas de raison que ca ne marche pas ailleurs.
 
http://www.codeproject.com/KB/mobile/transparent_controls/transparent_controls.jpg

Reply

Marsh Posté le 25-10-2008 à 01:35:02   

Reply

Marsh Posté le 25-10-2008 à 13:02:40    

Merci beaucoup , je vais essayer de m'en inspirer!!
Je te tiens au courant.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed