martes, 1 de diciembre de 2020

Cuadro de texto (Parte 2 de 2 )

Se define un cuadro o rectángulo donde se muestra un texto, que se adapta al tamaño. Esta es la continuación.


 


Existe también un método privado que se utiliza para saber el numero de líneas que se mostrará en el cuadro. Este método es el siguiente:

    void numlineas()
    {      
        int cont;
        int espacio = 0;
        char* mtexto = (char*)stexto.c_str();
        nlineas = 1;
        int maxCont = strlen(mtexto);
        if (tancho + espaciado > ancho && ancho > espaciado)
        {
            // no cabe en una linea  
            string resto = stexto;
            string trozo;
            char caracter[] = " ";
            char* caracter2;
            int nuevoancho = 0;
            int nc = 0;
            int restoancho = 0;
            do
            {
                cont = 1;
                trozo = resto.substr(0, cont);
                mtexto = (char*)trozo.c_str();
                nuevoancho = al_get_text_width(fuente, mtexto);
                espacio = 0;
                while (nuevoancho + espaciado < ancho)
                {
                    trozo = resto.substr(cont, 1);
                    caracter2 = (char*)trozo.c_str();
                    if (strcmp(caracter2, caracter) == 0)
                    {
                        espacio = cont;
                    }
                    cont++;
                    trozo = resto.substr(0, cont);
                    mtexto = (char*)trozo.c_str();
                    nuevoancho = al_get_text_width(fuente, mtexto);
                }
                nc = resto.length();
                trozo = resto.substr(cont, 1);
                caracter2 = (char*)trozo.c_str();
                nlineas++;
                if (espacio > 0 && cont < nc && strcmp(caracter2, caracter) != 0)
                {
                    resto = resto.substr(espacio);
                }
                else
                {
                    resto = resto.substr(cont);
                }
                restoancho = al_get_text_width(fuente, resto.c_str());
            } while (restoancho + espaciado > ancho);
        }
    }


Este método es igual al de pintar pero sin mostrar nada, y actualizando el valor de nlineas.

Código completo de la clase

class Mensaje 
{    
    string stexto;
    ALLEGRO_FONT* fuente;
    int espaciado;
    // para delimitar el rectangulo de vision     
    int mx1, my1;
    int mx2, my2;
    // ancho y alto del rectangulo
    int ancho, alto;
    // ancho total del texto enviado
    int tancho;
    int talto;
    // lineas que muestra por cada pantalla
    int nlineas;
    void numlineas()
    {      
        int cont;
        int espacio = 0;
        char* mtexto = (char*)stexto.c_str();
        nlineas = 1;
        int maxCont = strlen(mtexto);
        if (tancho + espaciado > ancho && ancho > espaciado)
        {
            // no cabe en una linea  
            string resto = stexto;
            string trozo;
            char caracter[] = " ";
            char* caracter2;
            int nuevoancho = 0;
            int nc = 0;
            int restoancho = 0;
            do
            {
                cont = 1;
                trozo = resto.substr(0, cont);
                mtexto = (char*)trozo.c_str();
                nuevoancho = al_get_text_width(fuente, mtexto);
                espacio = 0;
                while (nuevoancho + espaciado < ancho)
                {
                    trozo = resto.substr(cont, 1);
                    caracter2 = (char*)trozo.c_str();
                    if (strcmp(caracter2, caracter) == 0)
                    {
                        espacio = cont;
                    }
                    cont++;
                    trozo = resto.substr(0, cont);
                    mtexto = (char*)trozo.c_str();
                    nuevoancho = al_get_text_width(fuente, mtexto);
                }
                nc = resto.length();
                trozo = resto.substr(cont, 1);
                caracter2 = (char*)trozo.c_str();
                nlineas++;
                if (espacio > 0 && cont < nc && strcmp(caracter2, caracter) != 0)
                {
                    resto = resto.substr(espacio);
                }
                else
                {
                    resto = resto.substr(cont);
                }
                restoancho = al_get_text_width(fuente, resto.c_str());
            } while (restoancho + espaciado > ancho);
        }
    }
public:
    void Crear(const char* t, ALLEGRO_FONT* f, int x1, int y1, int x2, int y2, int _espaciado = 4)
    {
        stexto = t;
        espaciado = _espaciado;
        ancho = 0;
        CambiarFuente(f);
        Cuadro(x1, y1, x2, y2);
    }
    
    void Cuadro(int x1, int y1, int x2, int y2)
    {
        mx1 = min(x1, x2);
        mx2 = max(x1, x2);
        my1 = min(y1, y2);
        my2 = max(y1, y2);
        ancho = abs(mx1 - mx2);
        alto = abs(my1 - my2);
        if ( ancho > 0) numlineas();
    }
    void CambiarFuente(ALLEGRO_FONT* f) {
        tancho = al_get_text_width(f, stexto.c_str());
        talto = al_get_font_line_height(f) + espaciado;
        fuente = f;
        if ( ancho > 0) numlineas();
    };
    void Pinta()
    {
        int cont;
        int espacio = 0;
        char* mtexto = (char*)stexto.c_str();
        int linea = 0;
        int ni;
        int altura = 0;
        float exacto;
        ALLEGRO_COLOR black = al_map_rgb(0, 0, 0);
        ALLEGRO_COLOR blue = al_map_rgb(0, 200, 250);
        al_draw_rectangle(mx1, my1, mx2, my2, black, 0);
        if (tancho + espaciado > ancho && ancho > espaciado ) 
        {
            // no cabe en una linea  
            string resto = stexto;
            string trozo;
            char caracter[] = " ";
            char* caracter2;
            int nuevoancho = 0;
            int nc = 0;
            int restoancho = 0;
            do 
            {
                cont = 1;
                trozo = resto.substr(0, cont);
                mtexto = (char*)trozo.c_str();
                nuevoancho = al_get_text_width(fuente, mtexto);
                espacio = 0;
                while (nuevoancho + espaciado < ancho) 
                {
                    trozo = resto.substr(cont, 1);
                    caracter2 = (char*)trozo.c_str();
                    if (strcmp(caracter2, caracter) == 0) 
                    {
                        espacio = cont;
                    }
                    cont++;
                    trozo = resto.substr(0, cont);
                    mtexto = (char*)trozo.c_str();
                    nuevoancho = al_get_text_width(fuente, mtexto);
                }
                nc = resto.length();
                trozo = resto.substr(cont, 1);
                caracter2 = (char*)trozo.c_str();
                if (espacio > 0 && cont < nc && strcmp(caracter2, caracter) != 0) 
                {
                    trozo = resto.substr(0, espacio);
                    mtexto = (char*)trozo.c_str();
                    resto = resto.substr(espacio);                   
                }
                else 
                {
                    trozo = resto.substr(0, cont);
                    mtexto = (char*)trozo.c_str();
                    resto = resto.substr(cont);
                }
                altura = alto - (talto * nlineas);
                exacto = (alto / nlineas);
                ni = int(exacto);
                al_draw_text(fuente, blue, mx1 + 1, my1 + (ni * linea) - (talto / 2) + (ni / 2), 0, mtexto);
               
                linea++;               
                restoancho = al_get_text_width(fuente, resto.c_str());
            } while (restoancho + espaciado > ancho);
            mtexto = (char*)resto.c_str();
            al_draw_text(fuente, blue, mx1 + 1, my1 + (ni * linea) - (talto / 2) + (ni / 2), 0, mtexto);
           
        }
        else 
        {
            if ( ancho > espaciado)
              al_draw_text(fuente, blue, mx1 + 1, my1 + ((alto - talto) / 2), 0, mtexto);
        
        }
    }
};


A continuación se muestra un ejemplo con la clase en funcionamiento.



Si deseas probar el código del ejemplo haz click aquí para descargar. 

No hay comentarios:

Publicar un comentario

Antes de publicar un comentario

Todos los comentarios que se realicen en el blog son moderados.

Debido a esto es muy probable que tu comentario no aparezca de inmediato ya que previamente debe ser revisado para evitar un mal uso (SPAM).

Podrán realizar comentario cualquiera que tenga una cuenta de Google.

Related Posts Plugin for WordPress, Blogger...