bon si tu veux je peux te passer ma fonction et tu te debrouille avec.
c une fonction pour limiter des lignes en les coupants.
bon ma fonction est un peu imposante et elle se trouve dans une classe alors je t explique comment je fais.
je charge un texte dans une chaine de caractere.
je calcule le nb max de carateres.
apres je parcour la chaine et je compte le nombre de caratere .a chaque fois qu une ligne(nb de caractere max ou \n) est passer j increment une variable nombre de ligne.je retourne en arriere pour me placer sur un espace pour pas couper des mot o cas ou je couperai sur un mot.
apres je cree un tablo 2d dyna de charactere de type char tablo[nbdeligne][nbdecharactere max]
je creer un tablo 1D de nb ou je range la taille de chaque ligne.
enfin je remplis les tablo 2d par les ligne grace nombre de char dans chaque ligne.
voila la fonction bon c ptetre un peu degueu desole c une partie de mon gui que j ai fait pour mon tpe:
j ai rajouter la declaration de classe pour que tu regarde quel membre est dedans
class ggstextboxsafe:public widget
{
public:
short X,Y,H,W;//coordonnes de la textbox
unsigned int linetodraw;//nbdeligne a afficher
unsigned int linelenght;//taille de la ligne en charactere
short linestart;//ligne ou commencer l affichage.
char *texte;//chaine de charactere initiale
char **buffertexttransform;//chaine de charactere coupe avec les tokens " " "."
short bufferlinenb;//nombre de ligne dans le buffer
char **buffertextfit;//buffer a afficher avec decoupage des chaine en fonction la place des fenetres
widget *parent;
short taillesave;
char espacement;
char handle;
short ymouse;//variable pour le parcour d une textbox
int backgroundcolor;
int textcolor;
int barcolor;
int scrollercolor;
CALLBCK redrawprocess();
CALLBCK ggswidgetcallbck();
CALLBCK ggsmouseproc();
short counter;
//void getcoord(int x,int y,int x1,int y1);
ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,char cespacement=9);
ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,int cbackgroundcolor,int ctextcolor,int cbarcolor,int cscrollercolor,char cespacement=9);
~ggstextboxsafe();
};
ggstextboxsafe::ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,int cbackgroundcolor,int ctextcolor,int cbarcolor,int cscrollercolor,char cespacement)
{
bool exception=false;//booleen pour gerer les exceptions o cas ou les chaine sont impossibles a couper
this->backgroundcolor=cbackgroundcolor;
taillesave=0;
barcolor=cbarcolor;
textcolor=ctextcolor;
scrollercolor=cscrollercolor;
this->ymouse=0;
this->espacement=cespacement;
this->handle=0;
this->parent=gparent;
this->parent->addwidget(this);
short charcounter=0;
texte=new char[strlen(inputtext)+1];//creation d une chaine de taille inputtext
strcpy(texte,inputtext );//copi de la chaine inputtext dans la chaine cree
X=xcoord;//copie des coordonnees
Y=ycoord;
W=w;
H=h;
this->linetodraw=float(H-16)/this->espacement;
bufferlinenb=0;
linelenght=float(strlen(texte))/(text_length(font,this->texte)/float(W-16)+1);//calcul de la taille moyenne d une ligne.
char *ptr=texte;//mise en place de pointeur sur la premier charactere de la chaine.
bufferlinenb=0;//utilisation de cette variable pour compter les chaine crees
ptr=texte;//mise en place de pointeur sur la premier charactere de la chaine.
charcounter=0;
while (*ptr!='\0')//creation de chaine de charactere de la taille des ligne tokenisees
{
charcounter++;//ajout de un dans le compteur de charactere
if (charcounter>=linelenght)//si le compteur de charactere et plus gran ou egal au nb de charactere par ligne
{
if(*ptr=='.' || *ptr=='!' || *ptr==' ' || *ptr=='?')//on test si il y a des token apres lequel on peut couper
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
bufferlinenb++;
charcounter=0;
}
else//sinon on repart en arriere pour trouver un espace dans lequel couper.
{
while(*ptr!=' ' && *ptr!='.' && *ptr!='?' && exception!= true)
{
ptr--;
charcounter--;
if(charcounter<=0){charcounter=linelenght;ptr=ptr+linelenght;exception=true;}
}
ptr++;
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
bufferlinenb++;
charcounter=1;
}
}
if(*ptr=='\n')
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
bufferlinenb++;
charcounter=0;
}
ptr++;
}
if(charcounter!=0)
{
// buffertexttransform[bufferlinenb]=new char[charcounter+1];
bufferlinenb++;
charcounter=0;
}//fin du comptage de ligne....
exception=false;
//buffertexttransform=new char*[bufferlinenb+1];//creationd un tableau de pointeur pour les lignes avec 1 en plus o cas ou char counter n est pas vide lorsque l on rencontre NULL
//for (int i=0;i=linelenght)//si le compteur de charactere et plus gran ou egal au nb de charactere par ligne
{
if(*ptr=='.' || *ptr=='!' || *ptr==' ' || *ptr=='?')//on test si il y a des token apres lequel on peut couper
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=0;
}
else//sinon on repart en arriere pour trouver un espace dans lequel couper.
{
while(*ptr!=' ' && *ptr!='.' && *ptr!='?' && exception!= true)
{
ptr--;
charcounter--;
if(charcounter<=0){charcounter=linelenght;ptr=ptr+linelenght;exception=true;}
}
ptr++;
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=1;
}
}
if(*ptr=='\n')
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=0;
}
ptr++;
}
if(charcounter!=0)
{
// buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=0;
}//fin de creation de lignes....
buffertexttransform=new char*[bufferlinenb+1];//creationd un tableau de pointeur pour les lignes avec 1 en plus o cas ou char counter n est pas vide lorsque l on rencontre NULL
buffertextfit=new char*[bufferlinenb+1];
for (int i=0;i<bufferlinenb+1;i++){ buffertexttransform[i]=new char[linelenght+1]; buffertextfit[i]=new char[linelenght+1]; }
ptr=texte;//copie des ligne tokenise dans le tableau et ajout de NULL pour les terminer
unsigned int counter=0;
for (int t=0;t<bufferlinenb;t++)
{
for (int u=0;u<array[t];u++)
{
counter++;
buffertexttransform[t][u]=*ptr;
if(counter<strlen(inputtext)+1)ptr++;
if(buffertexttransform[t][u]=='\n')
buffertexttransform[t][u]='\0';
}
// if(buffertexttransform[t][u]=='\n')
// buffertexttransform[t][u]='\0';
buffertexttransform[t][u]='\0';
}
for ( int r=0;r<bufferlinenb;r++)//tranformation a effectuer si il s agit de text charge depuis fichier.
{
for (int f=0;f<linelenght;f++)
{
if(buffertexttransform[r][f]==13)buffertexttransform[r][f]='\0';
}
}
linestart=0;
}