IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] RichEdit et couleurs


Sujet :

MFC

  1. #1
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut [MFC] RichEdit et couleurs
    Salut

    J'utilise un RichEdit dans mon application boite de dialogue ( un programme de chat). Je mets la ligne d'une couleur quand j'écris et d'une autre couleur lorsque je recois.
    Le problème c'est qu'au bout de 255 caractères dans le Richedit et lorsque je fais un UpdateData(false) tous les caractères prennent la meme couleur.
    J'aimerais savoir pourquoi cela se produit et comment l'empécher.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    il faut passer par les callback pour lire et recuperer la chaine avec ses attributs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    // callback for read from control
    DWORD CALLBACK StreamOutCallback( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb )
    {
    	CString* strWholeString = reinterpret_cast<CString*>(dwCookie);
     
    	// I hope this allocation/deallocation better then manipulation with CStrings
    	char* szInThisCall = new char[cb+1];
    	memcpy( szInThisCall, reinterpret_cast<char*>(pbBuff), cb );
    	szInThisCall[cb] = '\0';
     
    	// This is the main trik! Control can call this function for just a part of string!
    	(*strWholeString ) += szInThisCall;
     
    	delete	[] szInThisCall;
     
    	*pcb = cb;
     	return 0;
    }
    // recuperation des infos.
    CString str;
    EDITSTREAM es = {(DWORD)&str, 0, StreamOutCallback};
    CRichEditCtrl* re = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT); 
    re->StreamOut(SF_RTF, es);
     
    DWORD CALLBACK CAboutDlg::StreamInCallback(DWORD dwCookie, 
    								  LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
    {
    	CString* strWholeString = reinterpret_cast<CString*>(dwCookie);
            memcpy(pbBuff,(const char *)*strWholeString,strWholeString->GetLenght());
    *pcb =strWholeString->GetLenght();
    return 0;
    }
    // lecture
     
    CRichEditCtrl* re = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT); 
     
    CString str; 
    // chargement de str ici
     
    EDITSTREAM es = {(DWORD)&str, 0, StreamInCallback};
    es.dwError = 0; 
    re->StreamIn(SF_RTF,es);

    voila j'ai pas teste c'est du couper/coller arrangé ...


  3. #3
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    Ca m'a l'air bien compliqué !! je ne sais meme pas comment mettre en place ces fonctions callback ...

    N'y a t'il pas plus simple ??

    mon code pour ajouter du texte au RichEdit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CChatReseauDlg::AjoutLigneRichEditTxt(CString txt, int policeTexte)
    {
    	UpdateData(true);
     
    	long int iTextLength = m_ctrlTxt.GetTextLength();  // bug si >255
    	m_ctrlTxt.SetSel(iTextLength,iTextLength);
    	//m_ctrlTxt.SetSel(-1, -1);
    	if (policeTexte==1)      PoliceRichEditTxt("Comic sans MS",RGB(0,30,90),RGB(242,230,190),170,false,false);
    	else if (policeTexte==2) PoliceRichEditTxt("Comic sans MS",RGB(90,30,0),RGB(242,230,190),170,false,false);
    	m_ctrlTxt.ReplaceSel((LPCTSTR)("\n" + txt));
     
    	UpdateData(true);
    }
    PoliceRichEditTxt(...) est une fonction que j'ai créé qui change la police avec la fonction SetSelectionCharFormat().

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    oui mais pour sauvergarder le contenu et le restitue au richedit il faut proceder comme ça si on ne veut pas perdre les differents attributs
    polices et couleurs.
    les fonctions tu les mets tel quel dans ton source il ne reste qu'a determiner l'emplacement ou tu les evoques .
    j'ai modifier le code sur la recuperation pour placer le resultat dans une CString meme chose pour la lecture (a partir du contenue de la CString) alors que l'on peut lire et ecrire directement dans un fichier.


  5. #5
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    Je vais essayer ca ce soir mais je comprends pas grand chose ...

    Si ce sont des callback on est censé ne jamais les appeller (sauf a l'initialisation) c'est bien ça ??
    Ou dois-je donc les mettre en place ??
    Est ce que je peux garder ma fonction pour ajouter du texte ? :o

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il y a une callback pour charger le richedit :
    DWORD CALLBACK StreamInCallback(DWORD dwCookie,
    LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
    au fait tu vireras le CAboutDlg:: mauvais copier coller .!
    et une pour recuperer son contenue.
    tu peux les declarer en tant que fonctions membre de la classe ou tu bosses
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static DWORD CALLBACK StreamInCallback(DWORD dwCookie, 
    						  LPBYTE pbBuff, LONG cb, LONG FAR 
    *pcb); 
    static DWORD CALLBACK StreamOutCallback( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb );
    tu peux aussi en avoir qu'une seule pour la lecture/ecriture mais il alors lui passer le context en argument etc ...
    la lecture peut se faire par exemple dans le initdialog pour une boite de dialogue .
    et la sauvegarde sur le OnOkt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // recuperation des infos.
    CString str; // chaine de chute pour les infos
    EDITSTREAM es = {(DWORD)&str, 0, StreamOutCallback};
    CRichEditCtrl* re = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT);
    re->StreamOut(SF_RTF, es);
    tu peux garder l'ancienne methode mais sache que suivant ce que tu fait tu perdras les attributs.
    exemple d'implementation complet dans ma classe CAbout pour faire afficher le descriptif de mes modfications de mon prog contenues dans un fichier rtf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App About
    static CString g_sDescriptionFile;
    CString g_appPath;
    BOOL g_bNewFile=TRUE;
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    	static DWORD CALLBACK RichEditStreamCallback(DWORD dwCookie, 
    						  LPBYTE pbBuff, LONG cb, LONG FAR *pcb); 
     
    // Dialog Data
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };	
    	//}}AFX_DATA
     
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	//}}AFX_VIRTUAL
     
    // Implementation
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	virtual BOOL OnInitDialog();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
     
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    	//{{AFX_DATA_INIT(CAboutDlg)
    	//}}AFX_DATA_INIT
    }
     
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CAboutDlg)	
    	//}}AFX_DATA_MAP
    }
     
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    	//{{AFX_MSG_MAP(CAboutDlg)	
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    // App command to run the dialog
    void CVisualGesApp::OnAppAbout()
    {
    	CAboutDlg aboutDlg;
    	aboutDlg.DoModal();
    }
    // ---------------------------------------------------------------------------------------
    DWORD CALLBACK CAboutDlg::RichEditStreamCallback(DWORD dwCookie, 
    								  LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
    {
    	UNREFERENCED_PARAMETER(dwCookie);
     
    	static HANDLE hFile = INVALID_HANDLE_VALUE;
     
    	if(g_bNewFile)
     
    	{
    		g_bNewFile=FALSE;
    		hFile = CreateFile(g_appPath+g_sDescriptionFile,
    			GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    	}
    	if(hFile == INVALID_HANDLE_VALUE)
    		return 1;
     
    	//read some data	
    	DWORD bytesRead;
    	int rt = ReadFile(hFile,pbBuff,cb,&bytesRead,NULL);
    	if(rt == FALSE)
    		return 1;
     
    	*pcb = bytesRead;
     
    	if(bytesRead != (DWORD)cb || bytesRead == 0)
    	{
    		if(hFile != INVALID_HANDLE_VALUE)
    		{
    			CloseHandle(hFile);
    			g_bNewFile=TRUE;
    			hFile = INVALID_HANDLE_VALUE;
    		}
    	}
     
    	return 0;
    }
    // ---------------------------------------------------------------------------------------
    BOOL CAboutDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
    	// TODO: Add extra initialization here
     
    	//get the application path
    	TCHAR buf[_MAX_PATH];
    	_tcscpy(buf,GetCommandLine());
    	//remove the program name
    	int len = _tcslen(buf);
    	for(int loop = len;loop > 0;loop --)
    	{
    		if(buf[loop] == _T('\\'))
    		{
    			buf[loop+1] = 0;
    			break;
    		}
    	}
    	if(loop == 0)
    	{
    		_tgetcwd(buf,sizeof(buf));
    		_tcscat(buf,_T("\\"));
    	}
    	if(buf[0] == _T('\"'))
    		g_appPath = &buf[1];
    	else
    		g_appPath = buf;
     
     
    	CRichEditCtrl* re = (CRichEditCtrl*)GetDlgItem(IDC_SAMPLE_DESCRIPTION); 
    	EDITSTREAM es;
    	es.dwCookie = 0;
        es.dwError = 0; 
        es.pfnCallback = (EDITSTREAMCALLBACK)RichEditStreamCallback;
     
    	re->StreamIn(SF_RTF,es);
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }

  7. #7
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    pfffff c'est vraiment galère !!

    Je vais essayer mais bon je ne garantie rien !

  8. #8
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    J'ai déclaré les fonctions callback dans le .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static DWORD CALLBACK StreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb); 
    static DWORD CALLBACK StreamOutCallback( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb );

    Puis implémentation dans le .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    // callback for read from control
    DWORD CALLBACK CChatReseauDlg::StreamOutCallback( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb )
    {
    	CString* strWholeString = reinterpret_cast<CString*>(dwCookie);
     
    	// I hope this allocation/deallocation better then manipulation with CStrings
    	char* szInThisCall = new char[cb+1];
    	memcpy( szInThisCall, reinterpret_cast<char*>(pbBuff), cb );
    	szInThisCall[cb] = '\0';
     
    	// This is the main trik! Control can call this function for just a part of string!
    	(*strWholeString ) += szInThisCall;
     
    	delete [] szInThisCall;
     
    	*pcb = cb;
    	return 0;
    }
     
     
    DWORD CALLBACK CChatReseauDlg::StreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
    	CString* strWholeString = reinterpret_cast<CString*>(dwCookie);
     
    	memcpy(pbBuff,(const char *)*strWholeString,strWholeString->GetLength());
    	*pcb = strWholeString->GetLength();
    	return 0;
    }


    Ensuite j'utilise la fonction AjoutLigneRichEditTxt() pour ajouter une ligne au RichEdit :
    le RichEdit est associé a la variable membre m_ctrlTxt.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void CChatReseauDlg::AjoutLigneRichEditTxt(CString txt, int policeTexte)
    {
    	//UpdateData(true);
     
    	// On écrit dans le RichEdit
    	//CRichEditCtrl* re = (CRichEditCtrl*)GetDlgItem(IDC_TXT);
    	EDITSTREAM es;
    	es.dwCookie = (DWORD)&txt;
    	es.dwError  = 0;
    	es.pfnCallback = StreamInCallback;
     
    	m_ctrlTxt.StreamIn(SF_RTF, es);
    	//UpdateData(false);
     
    }

    Seulement ca ne fait rien du tout, le RichEdit reste vide !!
    En débuggant sur la callback StreamInCallback() le texte est bien passé en parametre.

    Je ne sais pas si j'ai tout bien compris !


  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    la portion de lecture me semble correcte tu a verifier le contenue de la string dans la callback ?
    le texte est il au format rtf ? ou c'est du texte pur (sans attributs)?
    essaie de faire invalidate sur le richedit apres lecture
    m_ctrlTxt.Invalidate();

  10. #10
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    Ca marche pas mieux
    C'est du texte normal que j'envoie (mais j'aimerais envoyer du texte formaté).
    J'ai également essayé avec SF_TXT mais là le programme ne répond plus !! La callback est appelée en permanence.

    Je ne sais plus quoi faire pour que ca marche !!
    Si quelqu'un a une idée sinon j'abandonne ...

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    hum comment tu l'utilises ta fonction tu ne l'appelle à chaque fois que tu dois inserer une ligne quand même ?
    ces fonctions de lecture/ecriture doivent etre appeler uniquement pour charger le richedit avec un texte issu d'un fichier ou une zone memoire à l'init et lorsque l'on veut sauvegarder le contenu au format rtf.
    pour les phases intermediaires insertion de lignes etc non.

  12. #12
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    Bah si je les appelle a chaque fois ...

    Mais moi a l'initialisation le RichEdit est vide.
    Puis je rajoute des lignes qui peuvent avoir une couleur de texte différente
    Mais je ne sauvegarde jamais dans un fichier le contenu du RichEdit ! (je n'en ai pas besoin)

    Le seul probleme que j'ai avec le code que j'ai ecrit au debut du sujet c'est qu'au bout de 255 caracteres dans le RichEdit toutes les lignes prennent la meme couleur !!

    Comment dois-je faire alors ???

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    essaye ça (j'ai pas essayé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    void CMyRichEdit::SetFormatRange(int nStart, int nEnd, BOOL bBold, COLORREF clr, const char *szFaceName/*=NULL*/)
    {
    	if (nStart >= nEnd)
    		return;
     
    	SetSel(nStart, nEnd);
     
    	DWORD dwEffects = bBold?CFE_BOLD:0;
     
    	CHARFORMAT cfm;
    	cfm.cbSize = sizeof(cfm);
        GetSelectionCharFormat(cfm);
    	if(szFaceName)
     strcpy(cfm.szFaceName,szFaceName);
    // voir les autres params pour intervenir sur la fonte. et surtout dwMask
    /*typedef struct _charformat { 
      UINT     cbSize; 
      DWORD    dwMask; 
      DWORD    dwEffects; 
      LONG     yHeight; 
      LONG     yOffset; 
      COLORREF crTextColor; 
      BYTE     bCharSet; 
      BYTE     bPitchAndFamily; 
      TCHAR    szFaceName[LF_FACESIZE]; 
    } CHARFORMAT; 
    */
    	if ((cfm.dwMask & CFM_COLOR)  && cfm.crTextColor == clr && 
    		(cfm.dwMask & CFM_BOLD) && (cfm.dwEffects & CFE_BOLD) == dwEffects)
    		return;
     
    	cfm.dwEffects = dwEffects;
    	cfm.crTextColor = clr;
    	cfm.dwMask = CFM_BOLD | CFM_COLOR;
            if(szFaceName) cfm.dwMask |=CFM_FACE;
    	SetSelectionCharFormat(cfm);
    }
    void CChatReseauDlg::AjoutLigneRichEditTxt(CString txt, int policeTexte)
    { 
    	long int iTextLength = m_ctrlTxt.GetTextLength();
    	m_ctrlTxt.SetSel(iTextLength,iTextLength); 
    	m_ctrlTxt.ReplaceSel((LPCTSTR)("\n" + txt)); 
    	m_ctrlTxt.SetFormatRange(iTextLength, -1,FALSE, RGB(242,230,190),"Comic sans MS");
    }
    la <> avec ton code c''est que je passe par la fonction SetSelectionCharFormat pour imposer un format au texte ajouter .
    mon implementation est simple j'ai pas gerer les autres attributs de la fonte dispo dans la structure _charformat.

Discussions similaires

  1. [MFC]Changer la couleur d'un onglet...
    Par Deedier dans le forum MFC
    Réponses: 14
    Dernier message: 26/04/2005, 16h07
  2. [MFC]Changer la couleur d'un progress bar
    Par Deedier dans le forum MFC
    Réponses: 1
    Dernier message: 21/04/2005, 18h39
  3. [MFC] gestion de couleurs
    Par Aradesh dans le forum MFC
    Réponses: 12
    Dernier message: 06/04/2005, 08h41
  4. [MFC] Problème avec un RichEdit et couleur
    Par Erakis dans le forum MFC
    Réponses: 1
    Dernier message: 24/03/2005, 14h12
  5. [MFC] inverser la couleur d'un texte
    Par ginounet dans le forum MFC
    Réponses: 6
    Dernier message: 11/06/2004, 20h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo