Ordonner un message WM_CTLCOLORDLG ?

Résolu
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 18 déc. 2004 à 20:50
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 19 déc. 2004 à 09:34
Bonsoir tout le monde...

Alors la, je reste coincé sans réponses sur le forum aors je vous pose la question (ça pourra en aider d'autres surement)...comment faire pour changer la couleur de fond de dialogbox au "cour du temps", par exemple si on clique sur un bouton ? En clair, j'essaie de simuler un message WM_CTLCOLORDLG...et ça marche...mais le pb c'est que ça change pas la couleur...bref, c'est compliqué..voici le bout de code explicatif :

// instructions fonctions CALLBACK de DialogBox...

     case WM_COMMAND:
        
       switch(LOWORD(wParam)) {
         
          case IDC_COLOR:
             
             hChooseColor.rgbResult = hResultColor;
                 
             if(ChooseColor(&hChooseColor)) {
                    
              hDlgFont = hChooseColor.rgbResult;
              SendMessage(hDlg, WM_CTLCOLORDLG, (WPARAM) 155, (LPARAM) 0); 
             }   
           break;        
         }     
      break;

     case WM_CTLCOLORDLG:
        
       if (wParam == 155) {
                 
        hDlgBrush = CreateSolidBrush(hDlgFont);
        return (long) hDlgBrush;
       }     
      break;

// autres instructions


voila, quand je poste le message par PostMessage, il n'y a rien qui marche...ac SendMessage, j'arrive dans le case WM_CTLCOLORDLG mais ça ne me change pas la couleur de fond...bizarre, non ?
Enfin, si qqun a une tite idée ou piste, je suis preneur! ++ all!

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))

20 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 déc. 2004 à 00:31
Sinon mets un appel:
RedrawWindow(hdlg, 0, 0, RDW_ERASE | RDW_INVALIDATE);

au lieu de tes 2 lignes:
SendMessage(hDlg, WM_CTLCOLORDLG, 0, 0);
InvalidateRect(hDlg, 0, 0);

ciao...
BruNews, MVP VC++
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 déc. 2004 à 05:11
Si tu veux changer la couleur de fond de ta boite de dialogue en cours d'exécution, voici une solution:
Au début de ta DialogProc tu fais ceci:
 static COLORREF macouleur;

ensuite tu fais:
case IDC_COLOR:
//......
if(ChooseColor(&hChooseColor))
{
macouleur = hChooseColor.rgbResult;
InvalidateRect(hDlg,0,0);
}
break;

et enfin:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hDlg,&ps);
RECT rect;
GetClientRect(hDlg,&rect);
HBRUSH couleur=CreateSolidBrush(macouleur);
FillRect(hdc,&rect,couleur);
DeleteObject(couleur);
EndPaint(hDlg,&ps);
return 1;
}

C'est testé et ça marche.
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
18 déc. 2004 à 21:11
WM_CTLCOLORDLG:
return hbrFond;
WM_COMMAND:
if (wparam == ID_BUTTON) {
DeleteObject(hbrFond);
hbrFond = CreateSOlidBrush(0x00FFEA12);
InvalidateRect(hwnd, 0, 0); //Je sais pas si c necessaire
}
return 0;

Je pense que ca devrait marcher, j'ai pas testé..Mais je pense que ca devrait marcher.

++

+2(p - n)
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:16
nan, sa ve tjs pas...voici mon code updaté :

     case WM_CTLCOLORDLG:
        
       if (wParam == 155) {
        
        DeleteObject(hDlgBrush);         
        hDlgBrush = CreateSolidBrush(hDlgFont);
        InvalidateRect(hDlg, 0, 0); 
        return (long) hDlgBrush;
       }     
      break;


Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
18 déc. 2004 à 21:25
J'ai pas dit de faire ca ! regarde bien mon code..
Et pis dans ton appel a CreateSOlidBrush(), c koi ce ke tu mets en param ?? Il faut mettre une couleur (COLORREF) et pas un HBRUSH existant...

+2(p - n)
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:34
et comme ceci ?

          case IDC_COLOR:
             
             hChooseColor.rgbResult = hResultColor;
                 
             if(ChooseColor(&hChooseColor)) {
                    
              hDlgFont = hChooseColor.rgbResult;
              DeleteObject(hDlgBrush);
              hDlgBrush = CreateSolidBrush(hDlgFont);
              InvalidateRect(hDlg, 0, 0); 
             }   
           break;

// instructions

     case WM_CTLCOLORDLG:
         
        return (long) hDlgBrush;    
      break; 


Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:41
voila, la ça marche...ya juste un pb...sa update pas tt seul! fo ke je fasse un minimize et ke je restore pr voir le chg....le updateWindow() ne fait rien...une idée ?

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
18 déc. 2004 à 21:42
InvalidateRect(hwnd, 0, 0) pour 'rafraichir' une fenetre.

+2(p - n)
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:47
Oui mais non...faut quand même que je passe qqch devant la fenetre pour que la partie cachée se redécouvre en étant actualisé...

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:50
voci le code (qui marche) :

          case IDC_COLOR:
                 
             if(ChooseColor(&hChooseColor)) {
                    
              hDlgFont = hChooseColor.rgbResult;
              DeleteObject(hDlgBrush);
              hDlgBrush = CreateSolidBrush(hDlgFont);
              
              SendMessage(hDlg, WM_CTLCOLORDLG, 0, 0);
              InvalidateRect(hDlg, 0, 0); 
             }   
           break;


Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 21:52
Enfin, le code marche mais comme je te dis, sa update pas sous mes yeux, fo "cacher" la fenetre et quand on la fait réapparaitre, les chg sont visibles...

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2004 à 22:01
Va voircomme ça update bien ici:
http://www.cppfrance.com/code.aspx?id=10501

ciao...
BruNews, MVP VC++
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 déc. 2004 à 23:34
Oui, jlai déja dl cette source BruNews....je comprend tjs pas..enfin...ta source je l'ai recompilée ac dev et sa marche nikel ossi, dc je comprend aps...me manque un truc tt con en fait...

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 déc. 2004 à 00:01
stp stp bruNews, dis moi ce qui ne colle pas dans ce code (je te le met en grande partie) :

     case WM_COMMAND:
        
       switch(LOWORD(wParam)) {
         
          case IDC_COLOR:
                 
             if(ChooseColor(&hChooseColor)) {
                    
              hDlgFont = hChooseColor.rgbResult;
              DeleteObject(hDlgBrush);
              hDlgBrush = CreateSolidBrush(hDlgFont);
              
              SendMessage(hDlg, WM_CTLCOLORDLG, 0, 0);
              InvalidateRect(hDlg, 0, 0); 
             }   
           break;


et

     case WM_CTLCOLORDLG:
        
        return (long) hDlgBrush;    
      break; 


Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 déc. 2004 à 00:20
Vu de loin ça aurait l'air d'aller (pour un samedi 0h15).

Sert a quoi ce truc ?
SendMessage(hDlg, WM_CTLCOLORDLG, 0, 0);
y a meme pas les bons params dans les 2 derniers.
C'est InvalidateRect() qui doit provoquer ce message de la part du systeme.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 déc. 2004 à 00:24
ah aussi, pourquoi ne pas faire direct un FillRect() dans WM_PAINT ?

ciao...
BruNews, MVP VC++
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 déc. 2004 à 09:26
Oui lol, mais je veux pas dire de conneries (dc me tapper pas si j'en dis une!!) mais y a t'il un messsage WM_PAINT pr une dialogbox ?? (excuser ma question bete)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 déc. 2004 à 09:31
Oui ya un message WM_PAINT, pas de souci !

+2(p - n)
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 déc. 2004 à 09:33
bruNews> "Sert a quoi ce truc ?" <<< lol, je pensais qu'il fallait envoyer ce message manuellement, j'avais pas compris que InvalidateRect() le faisait! lol ! J'ai essayé ton RedrawWindow() et sa marche sans aucun pb!!! Un grand merci!!!

racpp> Oui, passer par un device, c'est une idée ça! J'y avais pas pensé!! Merci de l'info...FillRect() je n'ai encore jamais utilisé c'est pour ça....^^!

Merci a vous 2!

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 déc. 2004 à 09:34
Mici Alex a toi ossi! :-)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Rejoignez-nous