viernes, 19 de abril de 2013


Programando en Borland C++ 5.02 (Cap.II)

Hola amigos del Blog.
En esta entrega aprenderemos a pintar en pantalla “Cajas” o rectángulos mediante rutinas que faciliten la tarea.
Las “Cajas” podrán tener borde de distintos tipos (simple, doble, ancho…) y con su color propio.
Para ello nos crearemos una estructura que contenga la información de cada una de nuestras “Cajas”.

struct rCaja
{int Fila, Columna, Largo, Alto, Tinta, Papel, Marco, Fondo;} Caja;

Parece que todos los elementos se entienden con claridad. El elemento ”Fondo” se usa para poner el color de fondo en casos en el que el ”Marco” sea especial como veremos en el ejemplo.
De esta manera, en nuestro programa principal bastaría con llamar a la función “PintaCaja” con los elementos de la estructura debidamente asignados, para pintar una “Caja” en pantalla.
Veamos cómo quedaría la función y el programa principal:

#include   <conio.h>
#include   <stdio.h>
#include   <string.h>
#include   <time.h>
#include   <dos.h>
#include   <windows.h>

//======================================================================
// Colores
// http://sertocestutoriales.blogspot.com.es/
// https://www.youtube.com/user/sertoces
//=======================================================================
 

#define NEGRO    0
#define AZUL     1
#define VERDE    2
#define CYAN     3
#define GRANATE  4
#define MORADO   5
#define MARRON   6
#define BLANCO   7
#define GRIS     8
#define AZULB    9
#define VERDEB   10
#define CYANB    11
#define ROJO     12
#define LILA     13
#define AMARILLO 14
#define BLANCOB  15
#define BRILLO   128
 
struct rCaja
{ int Fila, Columna, Largo, Alto, Tinta, Papel, Marco, Fondo; } Caja;

//========================================================================
// Funcion Caja

// http://sertocestutoriales.blogspot.com.es/
// https://www.youtube.com/user/sertoces
//========================================================================
 
 
void PintaCaja (rCaja Caja)
{
 char ESI, ESD, EII, EID, HS, HI, VI, VD;
 int  i, j, PapelEsp;
  _setcursortype(_NOCURSOR);
 PapelEsp=Caja.Papel;
 if (Caja.Marco <0) //Si es menor que cero nos Mandan un character determinado
 {   //lo convertimos a positivo y lo usamos como MARCO.
  i = Caja.Marco*-1;
  ESI=i; ESD=i; EII=i; EID=i; HS=i; HI=i; VI=i; VD=i;
 }
 else
 //En función del tipo de MARCO inicializamos las esquinas y las líneas Verticales y
 //Horizontales
 switch (Caja.Marco)
 {
  case 1:  ESI=218; ESD=191; EII=192; EID=217; HS=196; HI=196; VI=179; VD=179;  break; //Linea simple
  case 2:  ESI=201; ESD=187; EII=200; EID=188; HS=205; HI=205; VI=186; VD=186;  break; //Linea doble
  case 3:  ESI=219; ESD=219; EII=219; EID=219; HS=223; HI=220; VI=219; VD=219;  break; //Linea ancha
  case 4:  ESI=220; ESD=220; EII=223; EID=223; HS=220; HI=223; VI=219; VD=219;  break; //Linea Ancha corta
  case 5:  ESI=219; ESD=219; EII=223; EID=223; HS=223; HI=223; VI=219; VD=219;  break; //Linea Ancha corta-abajo
  case 6:  ESI=220; ESD=220; EII=219; EID=219; HS=220; HI=220; VI=219; VD=219;  break; //Linea Ancha corta-arriba
  case 7:  ESI= 43; ESD= 43; EII= 43; EID= 43; HS= 45; HI= 45; VI=221; VD=221;  break; //Linea texto
  case 8:  ESI=254; ESD=254; EII=254; EID=254; HS=254; HI=254; VI=254; VD=254;  break; //Linea puntos
  case 9:  ESI=250; ESD=250; EII=250; EID=250; HS=250; HI=250; VI=250; VD=250;  break; //Linea puntos
  default: ESI= 32; ESD= 32; EII= 32; EID= 32; HS= 32; HI= 32; VI= 32; VD= 32;  break;
 }
 gotoxy (Caja.Columna, Caja.Fila);
 if (Caja.Marco==4 || Caja.Marco==6) PapelEsp=Caja.Fondo;
 if (PapelEsp>7) textcolor(Caja.Tinta+BRILLO); else textcolor(Caja.Tinta);
 textbackground(PapelEsp);
 cprintf("%c",ESI);
 for (i = 1; i < Caja.Largo-1; i++) cprintf("%c",HS);
 cprintf("%c",ESD);
 if (Caja.Papel>7) textcolor(Caja.Tinta+BRILLO); else textcolor(Caja.Tinta);
 textbackground(Caja.Papel);
 
 for (j=1; j<Caja.Alto-2; j++)
 {
  gotoxy (Caja.Columna, Caja.Fila+j);
  cprintf("%c",VI);
  for (i = 1; i < Caja.Largo-1; i++) cprintf("%c",32);
  cprintf("%c",VD);
 }
 if (Caja.Marco==4 || Caja.Marco==5) PapelEsp=Caja.Fondo; else PapelEsp=Caja.Papel;
 gotoxy (Caja.Columna, Caja.Fila+j);
 if (PapelEsp>7) textcolor(Caja.Tinta+BRILLO); else textcolor(Caja.Tinta);
 textbackground(PapelEsp);
 cprintf("%c",EII);
 for (i = 1; i < Caja.Largo-1; i++) cprintf("%c",HI);
 cprintf("%c",EID);
}
//========================================================================
// FIN Funcion Caja
//========================================================================


//************************************************************************ 
//************************************************************************

//========================================================================
// Programa principal
//========================================================================
main()
{
 //--------------------------------------------------------------------
 //Test de Caja
 //--------------------------------------------------------------------
 gotoxy(20,2);
 printf("Pulsa una tecla");

rCaja MyCaja;
 MyCaja.Fila = 1;
 MyCaja.Columna = 60;
 MyCaja.Largo = 20;
 MyCaja.Alto = 26;
 MyCaja.Tinta = CYANB;
 MyCaja.Papel = VERDE;
 MyCaja.Fondo = AMARILLO;
 for (MyCaja.Marco = 0; MyCaja.Marco < 10; MyCaja.Marco++)
 {
  PintaCaja (MyCaja);
  getch();
 }
}
//=======================================================================
// FIN Programa principal

// http://sertocestutoriales.blogspot.com.es/
// https://www.youtube.com/user/sertoces
//=======================================================================


Os dejo como tarea pintar un “efecto sombra” a la “Caja”.

Espero que os sea útil e instructivo.

En la próxima entrega veremos cómo se pueden simular “Botones”.


Si os ha gustado suscribíos a mi canal y compartid esta entrada.



Gracias a todos.
/* lo que yo hago ___________________________*/ /*___________________________________________________________*/