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 :

récupérer le format d'un caractère (pb de calcul logique)


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut récupérer le format d'un caractère (pb de calcul logique)
    Bonjour,

    j'aurais besoin d'un petit coup de pouce en logique.

    J'ai un CRichEditCtl dans une boite de dialogue. L'utilisateur peut appliquer les mises en formes classiques (gras, italique et souligné) sur les parties du texte qu'il désire.

    J'ai besoin de récupérer les zones de mise en forme pour transformer le texte au format HTML.

    J'ai pensé à faire une boucle pour vérifier le mise en forme de chaque caractère et à l'aide de booléen insérer les balises nécessaires.

    Mon problème est: quel test faut-il mettre dans mes if?
    Pour mettre la mise en forme on met le dwMask et on fait un ou exclusif avec le dwEffects. J'ai beau faire plein de calcul, je n'arrive pas à trouver l'opération inverse.

    Si une bète en calcul logique pouvait me donner un coup de main, ou si vous avez une autre idée...

    Pour info, j'ai une fonction qui fait l'inverse, c'est à dire, partir du texte HTML et le mettre en forme dans le CRichEditCtl
    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
     
    void CHTMLEditionDlg::HTMLtoTEXTFormat(CString htmlText)
    {
    	CString strTextFormat(htmlText);
    	int index;
    	CHARFORMAT Cfm;
    	Cfm.cbSize = sizeof(CHARFORMAT);
     
    	//on affiche le texte
    	m_commentaire.SetWindowTextA(strTextFormat);
     
    	//on remplace les <U></U> par des zones soulignées
    	index = strTextFormat.Find("<U>",0);
    	while(index!=-1 && index<strTextFormat.GetLength())
    	{
    		int iFin = strTextFormat.Find("</U>",index);
    		strTextFormat.Format("%s%s",strTextFormat.Left(iFin),strTextFormat.Mid(iFin+4));
    		m_commentaire.SetSel(iFin,iFin+4);
    		m_commentaire.ReplaceSel("",false);
    		strTextFormat.Format("%s%s",strTextFormat.Left(index),strTextFormat.Mid(index+3));
    		m_commentaire.SetSel(index,index+3);
    		m_commentaire.ReplaceSel("",false);
    		//on applique la mise en forme
    		m_commentaire.SetSel(index,iFin-3);
    		m_commentaire.GetSelectionCharFormat(Cfm);
    		Cfm.dwMask = CFM_UNDERLINE;
    		Cfm.dwEffects ^= CFE_UNDERLINE; 
    		m_commentaire.SetSelectionCharFormat(Cfm); 
     
    		//on passe à la balise suivante
    		index = strTextFormat.Find("<U>",0);
    	}
     
    	//on remplace les <I></I> par des zones en italique
    	index = strTextFormat.Find("<I>",0);
    	while(index!=-1 && index<strTextFormat.GetLength())
    	{
    		int iFin = strTextFormat.Find("</I>",index);
    		strTextFormat.Format("%s%s",strTextFormat.Left(iFin),strTextFormat.Mid(iFin+4));
    		m_commentaire.SetSel(iFin,iFin+4);
    		m_commentaire.ReplaceSel("",false);
    		strTextFormat.Format("%s%s",strTextFormat.Left(index),strTextFormat.Mid(index+3));
    		m_commentaire.SetSel(index,index+3);
    		m_commentaire.ReplaceSel("",false);
    		//on applique la mise en forme
    		m_commentaire.SetSel(index,iFin-3);
    		m_commentaire.GetSelectionCharFormat(Cfm);
    		Cfm.dwMask = CFM_ITALIC;
    		Cfm.dwEffects ^= CFE_ITALIC; 
    		m_commentaire.SetSelectionCharFormat(Cfm); 
     
    		//on passe à la balise suivante
    		index = strTextFormat.Find("<I>",0);
    	}
     
    	//on remplace les <B></B> par des zones en gras
    	index = strTextFormat.Find("<B>",0);
    	while(index!=-1 && index<strTextFormat.GetLength())
    	{
    		int iFin = strTextFormat.Find("</B>",index);
    		strTextFormat.Format("%s%s",strTextFormat.Left(iFin),strTextFormat.Mid(iFin+4));
    		m_commentaire.SetSel(iFin,iFin+4);
    		m_commentaire.ReplaceSel("",false);
    		strTextFormat.Format("%s%s",strTextFormat.Left(index),strTextFormat.Mid(index+3));
    		m_commentaire.SetSel(index,index+3);
    		m_commentaire.ReplaceSel("",false);
    		//on applique la mise en forme
    		m_commentaire.SetSel(index,iFin-3);
    		m_commentaire.GetSelectionCharFormat(Cfm);
    		Cfm.dwMask = CFM_BOLD;
    		Cfm.dwEffects ^= CFE_BOLD; 
    		m_commentaire.SetSelectionCharFormat(Cfm); 
     
    		//on passe à la balise suivante
    		index = strTextFormat.Find("<B>",0);
    	}
     
    	//on remplace les liens pas des zones soulignées bleues
    	//TODO
     
    	//on remplace les <BR> par des sauts de ligne
    	index = strTextFormat.ReverseFind('<');
    	if(index != -1)
    		index = strTextFormat.Find("<BR>",index);
    	while(index!=-1 && index>=0)
    	{
    		strTextFormat.Format("%s\r\n%s",strTextFormat.Left(index),strTextFormat.Mid(index+4));
    		m_commentaire.SetSel(index,index+4);
    		m_commentaire.ReplaceSel("\r\n",false);
    		index = strTextFormat.ReverseFind('<');
    		if(index != -1)
    			index = strTextFormat.Find("<BR>",index);
    	}
     
    	m_commentaire.SetFocus();
    }

  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
    Je dirais simplement tu itères caractère par caractère.
    avec une structure pour support et un tableau d'éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
      struct ITEM
      {
      CString chaine ;
      int nAttribut ;
      } item;
    CArrray<ITEM,ITEM> arItems;
    tant que le caractère lu a le même attribut que celui stocké dans item.nAttribut:
    tu concatènes avec item.chaine.

    si c'est différent :
    tu ajoutes item a arItems:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    arItems.Add(item);
    tu vides item et tu affectes les nouvelles valeurs etc..
    a la fin tu as un tableau des chaines avec les mêmes attributs.
    a convertir en html.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut
    Je dois pas bien comprendre ton raisonnement car je ne vois pas du tout comment l'appliquer à mon problème.

    Ce que j'ai compris de ta méthode est: quand j'applique la mise en forme, je récupère la chaine concernée et dans nAttribut je met la mise en forme de cette chaine. Sauf que cette chaine peut etre modifiée après sa mise en forme, on peut changer la mise en forme d'une partie seulement de cette chaine, et cette chaine peut etre à plusieurs endroits avec des mises en forme différentes.

    Etant données toutes les manipulations possibles sur le texte contenu dans mon CRichEditCtl, je pense que la technique la plus simple est de récupérer la mise en forme au moment où l'utilisateur clique sur Ok. Mais je trouve pas comment faire...

  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
    la mise en forme tu la récupères à la fin pas au fur et à mesure des modifications:quand tu dois générer l'html.
    A ce moment la tu parcours toute la chaine saisie pour y prélever les différents attributs.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut
    Merci pour ton aide, mon problème étant juste de trouver ça (je devais être trop fatiguée vendredi ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //#define NOTHING			1073741824
    #define BOLD			1073741825
    #define ITALIC			1073741826
    #define UNDERLINE			1073741828
    #define BOLD_ITALIC		1073741827
    #define BOLD_UNDERLINE		1073741829
    #define ITALIC_UNDERLINE		1073741830
    #define BOLD_ITALIC_UNDERLINE	1073741831
    Voici ma fonction, si ça intéresse quelqu'un.
    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
     
    CString CHTMLEditionDlg::TEXTFormatToHTML(CString text)
    {
    	CString strHTML(text);
    	int index;
    	CHARFORMAT Cfm;
    	Cfm.cbSize = sizeof(CHARFORMAT);
     
    	//on enlève tous les \r car \r\n comptés comme 1 caractère dans le CRichEditCtl
    	//alos qu'ils sont comptés 2 dans la CString
    	index = strHTML.Find("\r",0);
    	while(index!=-1 && index<strHTML.GetLength())
    	{
    		strHTML.Delete(index,1);
    		index = strHTML.Find("\r",index);
    	}
    	int textEditSize = strHTML.GetLength();
     
    	//on parcourt tous les caractères et on regarde leur format
    	bool gras = false, italique = false, souligne = false;
    	int offset = 0;//pour la correspondance d'indice sur la chaine strHTML
    	for(int i=0; i<textEditSize; i++)
    	{
    		//on récupère le format du caractère
    		m_commentaire.SetSel(i,i+1);
    		m_commentaire.GetSelectionCharFormat(Cfm);
    		//si le caractère est en gras
    		if((Cfm.dwEffects == BOLD) || (Cfm.dwEffects == BOLD_ITALIC) || (Cfm.dwEffects == BOLD_UNDERLINE) || (Cfm.dwEffects == BOLD_ITALIC_UNDERLINE))
    		{
    			//si le caractère précédent n'était pas en gras on insère la balise de début
    			if(!gras)
    			{
    				gras = true;
    				strHTML.Insert(i+offset,"<B>");
    				offset += 3;
    			}
    		}
    		else
    		{
    			//s'il n'est pas en gras, on vérifie que le précédent ne l'était pas
    			//si le caractère précédent était en gras, on insère la balise de fin
    			if(gras)
    			{
    				gras = false;
    				strHTML.Insert(i+offset,"</B>");
    				offset += 4;
    			}
    		}
    		//si le caractère est en italique
    		if((Cfm.dwEffects == ITALIC) || (Cfm.dwEffects == BOLD_ITALIC) || (Cfm.dwEffects == ITALIC_UNDERLINE) || (Cfm.dwEffects == BOLD_ITALIC_UNDERLINE))
    		{
    			//si le caractère précédent n'était pas en italique on insère la balise de début
    			if(!italique)
    			{
    				italique = true;
    				strHTML.Insert(i+offset,"<I>");
    				offset += 3;
    			}
    		}
    		else
    		{
    			//s'il n'est pas en italique, on vérifie que le précédent ne l'était pas
    			//si le caractère précédent était en italique, on insère la balise de fin
    			if(italique)
    			{
    				italique = false;
    				strHTML.Insert(i+offset,"</I>");
    				offset += 4;
    			}
    		}
    		//si le caractère est souligné
    		if((Cfm.dwEffects == UNDERLINE) || (Cfm.dwEffects == BOLD_UNDERLINE) || (Cfm.dwEffects == ITALIC_UNDERLINE) || (Cfm.dwEffects == BOLD_ITALIC_UNDERLINE))
    		{
    			//si le caractère précédent n'était pas souligné on insère la balise de début
    			if(!souligne)
    			{
    				souligne = true;
    				strHTML.Insert(i+offset,"<U>");
    				offset += 3;
    			}
    		}
    		else
    		{
    			//s'il n'est pas souligné, on vérifie que le précédent ne l'était pas
    			//si le caractère précédent était souligné, on insère la balise de fin
    			if(souligne)
    			{
    				souligne = false;
    				strHTML.Insert(i+offset,"</U>");
    				offset += 4;
    			}
    		}
    	}
    	//si on a ouvert une balise souligné on la ferme à la fin
    	if(souligne)
    		strHTML.Insert(textEditSize+offset,"</U>");
    	//si on a ouvert une balise italique on la ferme à la fin
    	if(italique)
    		strHTML.Insert(textEditSize+offset,"</I>");
    	//si on a ouvert une balise gras on la ferme à la fin
    	if(gras)
    		strHTML.Insert(textEditSize+offset,"</B>");
     
    	//on remplace le \n par des <BR>
    	index = strHTML.Find("\n",0);
    	while(index!=-1 && index<strHTML.GetLength())
    	{
    		strHTML.Format("%s<BR>%s",strHTML.Left(index),strHTML.Mid(index+1));
    		index = strHTML.Find("\n",index);
    	}
     
    	return strHTML;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer taille format poids image stocker
    Par jarod71 dans le forum Langage
    Réponses: 1
    Dernier message: 18/03/2007, 15h35
  2. Récupérer une sous chaine de caractère
    Par Alexandre` dans le forum C
    Réponses: 9
    Dernier message: 27/02/2007, 00h15
  3. Réponses: 2
    Dernier message: 15/12/2006, 13h40
  4. Récupérer le nombre après le caractère #
    Par JackBeauregard dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2006, 20h46
  5. Réponses: 7
    Dernier message: 29/05/2006, 14h46

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