Changer couleur texte dans richedit

Résolu
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008 - 10 févr. 2005 à 13:07
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

18 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2005 à 12:21
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
1
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 févr. 2005 à 14:54
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
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
10 févr. 2005 à 15:41
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
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 févr. 2005 à 15:56
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
0

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

Posez votre question
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
10 févr. 2005 à 19:15
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 !!
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 févr. 2005 à 19:25
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
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
10 févr. 2005 à 19:46
#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);


}
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
11 févr. 2005 à 18:38
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
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
11 févr. 2005 à 18:46
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
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
12 févr. 2005 à 11:51
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 !!!
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2005 à 12:15
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
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
12 févr. 2005 à 16:10
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!!
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2005 à 16:16
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
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
13 févr. 2005 à 12:29
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.
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
13 févr. 2005 à 12:57
Ok.
Bon courage et bonne continuation.

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

YOYO, @+.
YOYO
0
cs_BlackNeo Messages postés 25 Date d'inscription lundi 5 novembre 2001 Statut Membre Dernière intervention 11 septembre 2005
14 juin 2005 à 21:18
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
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 juin 2005 à 21:22
Lol ta quelques mois de retard pour les remerciements :D


void Aurevoir( void ); //Bonne journée
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
14 juin 2005 à 21:54
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
0
Rejoignez-nous