LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
//A la création de la fenetre
case WM_CREATE:
{unsigned long i 1, j 1;
//On passe l'hinstance de fenetre en global
hInst = hInstance;
//Création de la fenêtre principale
Dlg = CreateWindowEx(WS_EX_WINDOWEDGE, config.lpszClassName, "test", WS_OVERLAPPEDWINDOW | WS_VSCROLL, 0, 0, 200, 200, NULL, NULL, hInstance, NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
et voici la structure t_edit:
typedef struct s_edit
{
HWND handle;
long ID;
COLORREF background;
COLORREF texte;
} t_edit;
Bon, en quelques mots mon problème: CA MARCHE PAS!
En fait je cherche à changer la couleur de mon editbox (ce n'est qu'un programme de test pour la fonction), mais rien ne se passe!
L'editbox reste tel que!
Si je met en commenatire la ligne CHANGE = FALSE dans la fonction EDITChangeCouleur(), la par contre ça fonctionne!
J'ai donc essayer de mettre le CHANGE = FALSE à la fin du case WM_CTLCOLOREDIT, mais toujours le meme problème, je change plus de couleur!
Si vous avez des idées...
Je sasi plus quoi tester!
Ah si BruNews, si jamais tu lis le post jusque la, j'ai mis aussi à la place du SendMessage un InvalidateRect comme tu me l'avais indiqué, mais ça change rien! (alors que ça marhait sur les boutons!!)
Merci d'avance
Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 27 déc. 2004 à 14:27
Le truc important c'est que c'est ta structure qui doit stocker les couleurs et c'est à partir de cette structure que tu doit modifier les param du HDC fournit par WM_CTLCOLOREDIT
un exemple qui crée un EDIT et change de couleur toutes les secondes aléatoirement
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 27 déc. 2004 à 13:41
voici une piste :
crée ta structure t_edit dynamiquement (new, malloc...)
initialise les champs, et crée l' EDIT avec CreateWindow.
associe le t_edit au EDIT avec SetWindowLong ou sauvegarde l'association Id (ou handle) <-> t_edit dans un tableau ou var globale pour pouvoir récupérer un t_edit à parir d'un Id (ou d'un handle)
t_edit* edit = new t_edit;
...
SetWindowLong(hEdt, GWL_USERDATA, (LONG)edit);
lors du traitemment de WM_CTLCOLOREDI, récupère le t_edit à partir du handle par GetWindowLong, et affecte au DC fourni les paramètres de couleiurs mémorisé dans la structure.
t_edit* edit = (t_edit*)GetWindowLong(hEdt, GWL_USERDATA);
Dans ton code, si tu veux modifier les couleurs, modifie les champs de la stucture et appel InvalidateRect qui va se charger d'appeler WM_CTLCOLOREDIT qui va mettre à jours les couleurs avec les nouveaux champs de la structure.
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 200815 27 déc. 2004 à 14:00
BOOL EDITCreate(HWND windowlocation, t_edit *edit, COLORREF background, COLORREF texte, unsigned int xpos, unsigned int ypos, unsigned int width, unsigned int heigth, unsigned long style, BOOL VIEWERROR)
{if ((edit->handle CreateWindow("EDIT", NULL, WS_CHILD | style, xpos, ypos, width, heigth, windowlocation, NULL, 0, NULL)) NULL)
{
if (VIEWERROR)
EDITVoirErreur(GetLastError());
return FALSE;
}
if (edit->ID > 0)
{
//On spécifie l'ID associé à l'editbox
//SetWindowLong renvoie l'ID d'avant la modification (si on cree l'editbox, cet ID est à 0) =>Test sur GetLastError
if (!SetWindowLong(edit->handle, GWL_ID, edit->ID))
{
if (VIEWERROR)
{
int error = GetLastError();
if (error)
{
EDITVoirErreur(error);
EDITDelete(*edit, VIEWERROR);
return FALSE;
}
}
}
}
edit->background = background;
edit->texte = texte;
//EDITChangeColor(edit);
return TRUE;
}
Voici ma fonction de création d'un edit!
J'ai tester avec un malloc mais ça change rien!
De toute façon je pense pas que ça vienne de ça (mais c'était pas impossible) puisque si je vire dans la fonction EDITChangeColor le CHANGE = FALSE, mon editbox change de couleur!
Je dirais plutôt qu'il doit effectuer la ligne CHANGE = FALSE avant que le message est été traité!
Mais même la encore, ça ne me convient qu'à moitié puisque si je met le CHANGE=FALSe non plus dans la fonction, mais dans le traitement du message, ça fait pareil! Alors que la il devrait avoir d'abord me changer l'arrière plan, puis mettre CHANGE à FALSE!
Et le COLORREF de mon arrièreplan de l'editbox devrait avoir changer ce qui n'est pas le cas!
Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]