Editbox et couleur

[Résolu]
Signaler
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
Malgré une lecture des différentes sources et réponses sur le sujet, je n'arrive toujours pas à réaliser ce que je veux!

Je suis en train de faire une source générale sur les editbox, et je cherche à en changer les couleurs de texte et d'arrière-plan!
Cette source se voulant générale et intégrable dans de futures applications, je cherche à faire uniquement des fonctions que j'appelerai quand j'en aurais besoin!
Voici ma fonction de changement de couleur:

BOOL EDITChangeColor(t_edit edit, COLORREF back, COLORREF fore, BOOL VIEWERROR)
{
HDC hdcedit = GetDC(edit.handle);
if (SetBkColor(hdcedit, back) == CLR_INVALID)
{
if(VIEWERROR) EDITVoirErreur(GetLastError());
return FALSE;
}
if(SetTextColor(hdcedit, fore) == CLR_INVALID)
{
if(VIEWERROR) EDITVoirErreur(GetLastError());
return FALSE;
}
return TRUE;
}

typedef struct s_edit
{
HWND handle;
long id;
} t_edit;

Première erreur que je ne comprends pas, le HDC que je reçois n'est pas le meme que celui du wParam du message WM_CTLCOLOREDIT! (lecture des 2 et affichage dans un editbox à l'intérieur du case WM_CTLCOLOREDIT) Pourquoi et comment faire pour obtenir le bon HDC (autrement qu'en prenant le wParam puisque je ne veux pas passer le case WM_COLOREDIT!
Ensuite, je voudrais ne pas etre obligé d'appeler cette fonction dans WM_CTLCOLOREDIT, mais dans n'importequel autre fonction!
Par exemple par appui sur un bouton, ou par lecture d'une commande dans un fichier... Est-ce possible? Je pense que oui, mais je ne trouve pas comment! Il faut que j'integre les HBRUSH à la fonction, mais je ne sais pas où!
[mailto:julienbj@hotmail.com Savon]

8 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ben tu es tetu hein...
Siffit de mettre InvalidateRect(hedit, 0, 1); dans ton bouton et laisser le code dans WM_CTLCOLOREDIT

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
C'est bien dans WM_CTLCOLOREDIT que tu dois traiter et pour forcer l'appel de nimporte ou suffit d'un InvalidateRect().

ciao...
BruNews, MVP VC++
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Pour l'instant, je l'appelle uniquement dans WM_CTLCOLOREDIT
Voici l'appel:

case WM_CTLCOLOREDIT:
return EDITChangeColor(lParam, RGB(...), RGB(...), TRUE);

=>J'ai changé le prototype de ma fonction et j'ai mis un HWND à la place du t_edit! (d'ou le lParam)

Mais rien ne se passe, l'editbox reste inchangé!
Alors que si je mets dans le prototype de la fonction un HDC à la place du t_edit (et je désactive alors le GetDC) ça fonctionne bien! Tu as une idée du pourquoi?
Je pense que le GetDC me renvoie pas le bon HDC, mais je sais pas comment faire pour obtenir un HDC sur mon editbox autrement que par GetDC! J'ai vu la fonction CreateDC, mais je ne comprends pas trop son fonctionnement

Sinon, merci pour l'idée du InvalideRect, c'est très fort!
[mailto:julienbj@hotmail.com Savon]
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu dois te servir du hdc donne par le systeme (wParam) dans WM_CTLCOLOREDIT.

ciao...
BruNews, MVP VC++
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Et il y a vraiment aucun moyen de pas passer par wParam?
Je peux pas récupérer ce HDC par le handle du controle (qui est dans le lParam ET SURTOUT dans ma structure)?
Ou alors un moyen de changer les couleurs de l'editbox à partir de son handle plutot que par un HDC?

Et pour confirmation, un HDC, ça représente bien une sorte de zone graphique qui contiendrait dans mon cas
[mailto:julienbj@hotmail.com Savon]
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
le hdc est l'identifiant de ton device context a repeindre au moment ou le system te le passe, c'est celui ci que tu dois utiliser.

ciao...
BruNews, MVP VC++
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Oui, mais le problème c'est que je veux pas utiliser cette fonction dans le message WM_CTLCOLOREDIT mais dans une fonction qui est appeler quand je clique sur un bouton par exemple! Ca veut dire que je ne peux pas utiliser les wParam et lParam, la seule chose que je connais de mon editbox sont son handle et son identifiant (assigné avec SetWindowLong)

Sinon ce que je pourrais faire, c'est appeler moi meme cette fonction en faisant un SendMessage mais auquel cas il faut quand meme que je récupère le HDC de mon editbox
C'est a dire que dans ma fonction EDITChangeColor(...) je fais un SendMessage(Dlg, WM_CTLCOLOREDIT, ??, edit.handle). Tu penses que ça pourrait marcher?
Mais il faut encore que je récupere le HDC (avec GetDC?)
[mailto:julienbj@hotmail.com Savon]
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
OK, comme ca c'est clait!
:approve)
je te remercie, ça marche bien! (voir très bien!)
MERCI beaucoup pour le temps passé!
[mailto:julienbj@hotmail.com Savon]