Changer couleur texte dans richedit [Résolu]

Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
- - Dernière réponse : yoyo269
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
- 14 juin 2005 à 21:54
Comment changer la couleur du texte ecrit dans une richedit ?
pourquoi:

hdc = BeginPaint(GetDlgItem(hDlg, IDC_EDIT_RECU), &paintstruct);
SetTextColor(hdc, RGB(255, 0, 0));

ne marche pas?
merci
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
3
Merci
Voilà ta fonction modifiée :

void ajouter_message(LPCTSTR texte)
{
ZeroMemory(recu, 10000);
GetDlgItemText(hDlg, IDC_EDIT_RECU, recu, 10000);


ZeroMemory(&Format, sizeof(CHARFORMAT2));
Format.cbSize = sizeof(CHARFORMAT2);
Format.dwMask = CFM_COLOR;
Format.crTextColor = RGB(255, 0, 0);
Selection.cpMin = strlen(recu); //pour mettre le curseur
Selection.cpMax = strlen(recu); //à la fin du RichEdit
SendMessage(GetDlgItem(hDlg, IDC_EDIT_RECU), EM_EXSETSEL, 0, (LPARAM) &Selection);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_RECU), EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &Format);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_RECU), EM_REPLACESEL, 0, (LPARAM)(LPCTSTR) Texte);
}

Dis-moi si ça va mieux maintenant.

YOYO, @+.
YOYO

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de yoyo269
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Salut melkiorlenecrarque,

après avoir moi aussi galéré sur les richedits je commence à les comprendre un peu mieux.
Je suis donc heureux de partager mes connaissances (blablabla...)
Voilà ce qui t'intéresse pour changer la couleur du texte :

CHARFORMAT2 Format;
CHARRANGE Selection;
ZeroMemory(&Format, sizeof(CHARFORMAT2));
Format.cbSize = sizeof(CHARFORMAT2);
Format.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
Format.dwEffects = 0;
Format.yHeight = 170;
Format.yOffset = 0;
Format.crTextColor = RGB(0,0,0);
Format.bCharSet = ANSI_CHARSET;
Format.bPitchAndFamily = DEFAULT_PITCH;
sprintf(Format.szFaceName, "%s", "MS Sans Serif");
Selection.cpMin = 0;
Selection.cpMax = strlen(TexteContenuDansLeRichEdit);
SendMessage(Handle, EM_EXSETSEL, 0, (LPARAM) &Selection);
SendMessage(Handle, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &Format);

J'espère que ça t'auras bien aidé.
Si t'as des questions là-dessus, je suis dispo.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
ok merci yoyo sa ma bien aidé, j'étais parti plutot dans une PARAFORMAT2 mais je savais pas utiliser le membre wShadingStyle .

sinon la sa me change la couleur de tout le texte,
tu pe me donner une piste pour changer la couleur en cours d'utilisation ?

merci yoyo
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
En fait t'as juste à régler la sélection.
Selection.cpMin = 0; // pour le minimum
Selection.cpMax = 2;// pour le maximum

Ce code là va te sélectionner les 2 ou 3 premiers caractères.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
oui j'arrive à mettre en couleur les mots souhaités, mais à chaque fois que je remet un texte en couleur dans le richedit, les caracteres precedant redeviennent noir !!
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Ca c'est bizarre.
Chez moi ça fonctionne nickel (ça me sert pour un chat style msn messenger).
Fais voir ton code pour que je puisse y voir un peu plus clair.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include <stdio.h>
#include "resource.h"


#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"comctl32.lib")


#define WM_SOCKET WM_USER+5



HINSTANCE hinst;
HWND hDlg;
HICON icon;
CHARFORMAT2 Format;
CHARRANGE Selection;;


WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN sin;


char data[255];
char recu[10000];



void connection_serveur();
void envoyer();
void recevoir();
void ajouter_message(LPCTSTR texte);
BOOL CALLBACK AppProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);



// fonction gérant les message concernant la boite de dialogue principale
BOOL CALLBACK AppProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
hDlg = hdlg;
SetDlgItemText(hDlg, IDC_EDIT_RECU, "SendMessage, par melkior le necrarque.\r\n\r\n\r\n");
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON_ENVOYER), FALSE);
icon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_ROUGE));
SetClassLong(hDlg, GCL_HICON, (LONG)icon );
SetTimer(hDlg, 1, 2000, NULL);
break;

case WM_TIMER:
connection_serveur();
KillTimer(hDlg, 1);
break;


case WM_CTLCOLOREDIT:
if(GetWindowLong((HWND)lParam, GWL_ID) == IDC_EDIT_RECU)
{
SetTextColor((HDC) wParam, RGB(255,0,0));
}
break;


case WM_SOCKET:
{
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON_ENVOYER), TRUE);
icon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_VERT));
SetClassLong(hDlg, GCL_HICON, (LONG)icon );
ajouter_message("connection établie\r\n\r\n");
break;
case FD_READ:
recevoir();
break;
case FD_CLOSE:
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON_ENVOYER), FALSE);
icon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_ROUGE));
SetClassLong(hDlg, GCL_HICON, (LONG)icon );
break;
}
}


case WM_COMMAND:
switch(wParam)
{
case IDC_BUTTON_ENVOYER:
envoyer();
break;
case IDCANCEL:
EndDialog(hDlg,0);
}
default:
break;
}
return 0;
}


// fonction principale, c'est la premiere executée
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
InitCommonControlsEx(NULL);
LoadLibrary("RICHED32.DLL");
hinst = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_CLIENT), hDlg, AppProc);
return 0;
}


void connection_serveur()
{
ajouter_message("Connection à Niconetx");
Sleep(1000);
ajouter_message(".");
Sleep(1000);
ajouter_message(".");
Sleep(1000);
ajouter_message(".\r\n");
Sleep(1000);

WSACleanup();
WSAStartup(MAKEWORD(2,0), &WSAData);


sin.sin_addr.s_addr = inet_addr("192.168.0.16");
sin.sin_family = AF_INET;
sin.sin_port = htons(4100);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);


bind(sock, (SOCKADDR *)&sin, sizeof(sin));


WSAAsyncSelect(sock, hDlg, WM_SOCKET, FD_CONNECT | FD_READ | FD_CLOSE);

connect(sock, (LPSOCKADDR)&sin, sizeof(sin));
}


void envoyer()
{
ZeroMemory(data, 250);
GetDlgItemText(hDlg, IDC_EDIT_ENVOI, data, 250);
send(sock, data, sizeof(data), NULL);
SetDlgItemText(hDlg, IDC_EDIT_ENVOI, "");
strcat(data, "\r\n");
ajouter_message(data);
}


void recevoir()
{
ZeroMemory(data, 250);
recv(sock, data, sizeof(data), NULL);
strcat(data, "\r\n");
ajouter_message(data);
}


void ajouter_message(LPCTSTR texte)
{
ZeroMemory(recu, 10000);
GetDlgItemText(hDlg, IDC_EDIT_RECU, recu, 10000);
strcat(recu, texte);
SetDlgItemText(hDlg, IDC_EDIT_RECU, recu);
UpdateWindow(hDlg);


ZeroMemory(&Format, sizeof(CHARFORMAT2));
Format.cbSize = sizeof(CHARFORMAT2);
Format.dwMask = CFM_COLOR;
Format.crTextColor = RGB(255,0,0);
Selection.cpMin = strlen(recu)-strlen(data);
Selection.cpMax = strlen(recu);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_RECU), EM_EXSETSEL, 0, (LPARAM) &Selection);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_RECU), EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &Format);


}
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Par contre juste pour info, quand tu as la réponse à ta question, pense à cliquer sur le bouton Réponse acceptée de la réponse concernée.

Je me penche sur ton code. (j'espère que personne va se ramener par derrière ).

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Déjà commence par mettre ça :

CHARFORMAT2 Format;
CHARRANGE Selection;

dans ta fonction ajouter_message et pas en global, ça sert à rien.
Sinon à part ça je vois pas.
Tiens-moi au courant.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
c'est fait !!!! je n'ai plus de cheveux!!!!

Je ne vois vraiment pas pourquoi lorsque je rajoute un texte, la ligne precedente redevient noir !!!!!

Y a pas moyen de changer la couleur par defaut?
un peu comme dans un notepad?

merci à mon futur sauveur !!!
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Ah peut-être que si je sais pourquoi.
En fait comme tu fais tu n'ajoutes pas du texte dans le RichEdit, mais tu remets tout d'un bloc.
Ce qu'il faut faire c'est ajouter le petit bout que tu reçois.
Je vais te refaire ta fonction ajouter_message.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
Ouiiii! Tu as trouvé l'erreur !!!
mille à toi Yoyo !!

Je n'aurais jamais pensé à remplacer une selection vide pour ajouter mon texte !!!
C'est vraiment tordu les RichEdit !!

Merci d'avoir partagé don savoir et ton experience dans ce domaine!!
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
De rien melkiorlenecrarque. C'est tout à fait normal.
Tout ce que je sais je l'ai appris en très grosse partie sur cppfrance, donc je perpétue juste le savoir.
Au fait, c'est que tu comptes faire un chat ?

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
0
Merci
Oui c'est pour un pote: il a un serveur FTP sur un reseau local en residence universitaire,
donc il partage avec le partage de fichier windows le racourci vers son serveur ftp, et le client de mon application pour qu'on puisse lui envoyer des messages en cas de problemes ou de remarques.
Pour l'instant c'est un simple NetSend mais faut que le service windows soit activé et ce n'est pas le cas de tout les PC.

En meme temps sa me permet de decouvrir la programmation reseau.
Commenter la réponse de melkiorlenecrarque
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Ok.
Bon courage et bonne continuation.

P.S: moi aussi je suis sur un chat en ce moment.

YOYO, @+.
YOYO
Commenter la réponse de yoyo269
Messages postés
25
Date d'inscription
lundi 5 novembre 2001
Statut
Membre
Dernière intervention
11 septembre 2005
0
Merci
Merci beaucoup yoyo269. Celà répond excatement à mes intérogation.

Tu as appris à manipuler les richedit grâce à MSDN ou à une autre doc?

Si oui, tu êux me donner un lien, ou une ref.



Merci
Commenter la réponse de cs_BlackNeo
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
0
Merci
Lol ta quelques mois de retard pour les remerciements :D


void Aurevoir( void ); //Bonne journée
Commenter la réponse de cs_Joky
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
Salut BlackNeo,

tout d'abord merci de tes remerciements (c'est jamais trop tard pour ça ;) ).
Sinon j'ai appris en piochant dans diverses sources sur cppfrance. Pour ça il a fallu faire du tri et de temps en temps un peu d'aide de la MSDN pour des compléments d'infos (surtout pour les types de variables).
Si tu veux d'autres infos sur les RichEdit tu peux me demander, je ferai mon possible pour te répondre.

P.S. : tu comptes faire quoi avec ton RichEdit ?

YOYO, @+.
YOYO
Commenter la réponse de yoyo269