C/Visual C - Sombra en ANSI C

 
Vista:

Sombra en ANSI C

Publicado por Esteban (3 intervenciones) el 28/10/2008 02:15:16
De antemano gracias por la ayuda que me puedan brindar.

Lo que me tiene gastando tiempo es lo siguiente...

Tengo una función que yo mismo desarrollé (muy básica) que me permite mostrar un cuadro de diálogo (en consola), con titulo, mensaje y dos botones (simulados), que los hago funcionar capturando las teclas de dirección.
Ahora, lo que quiero es poner una sombra detrás de este cuadro de dialogo para hacer que se vea un poco más atractivo.
Recuerden que estoy en modo Consola, y sería muy fácil simplemente poner negro alrededor del cuadro de diálogo, pero yo quiero utilizar los colores de gris sobre negro, para la sombra y el texto que quedará debajo del cuadro de diálogo.

¿Me explico? Es decir, cuando utilizas Borland y se muestra un cuadro de diálogo, ése cuadro muestra una sombra, ese es el efecto que quiero conseguir... se puede?

Gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Sombra en ANSI C

Publicado por Armando Nava (127 intervenciones) el 28/10/2008 14:58:23
Si, si se puede.

No se siestas usando graphics.h

Simplemente ve como quieres que quede el efecto y dibuja las lineas correspondientes, o los rectangulos en el color que quieres.

Esta funcion simula un cuadro de texto tipo windows. pero le puedes dar el efcto que quieras.

/* ENTRADA */
// Subrrutina para leer una cadena desde el teclado
// Parametros (x,y) posicion donde se colocara
// la caja de texto.

void entrada(int x, int y)
{

int i;
int color = LIGHTBLUE,azul=BLUE;
char sysdat[20], borra[1];
char verifica;

setfillstyle(SOLID_FILL, color);

bar(x,y,x+70,y+20);

setcolor(azul);
line(x,y,x+70,y);
line(x,y,x,y+20);

setcolor(WHITE);
line(x+70,y+20,x+70,y);
line(x+70,y+20,x,y+20);

// rectangle(x,y,x+70,y+20);

setcolor(15);

outtextxy(x-70,y+7,"COMAND:>");

moveto(x+5,y+7);
borra[1]=NULL;
i=0;

while( i<6 && (verifica= retrazo()) != 28 ){

verifica=verifica*1;
sysdat[i]=getch();

if(sysdat[i]==13){
sysdat[i]=NULL;
}

if(sysdat[i]==8) { //backspace
sysdat[i-1]=NULL;
i-=2;

if(i<0) {
setfillstyle(SOLID_FILL,GREEN);
bar(x+2,y+2,x+68,y+18);
setcolor(15);
moveto(x+5,y+7);
i=0;
sysdat[0]=NULL;

}
else{
setfillstyle(SOLID_FILL,GREEN);
bar(x+2,y+2,x+68,y+18);
setcolor(15);
moveto(x+5,y+7);
outtext(sysdat);
i++;

}

}

else {
borra[0]=sysdat[i];
outtext(borra);
i++;
}

}

sysdat[i]=NULL;
moveto(x+80,y+7);
outtext(sysdat);

}


/* VERIFICA */
// Funcion auxiliar de ENTRADA

char retrazo(void) {
char t;
t=inport(0x60);
return(t);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Sombra en ANSI C

Publicado por Esteban Andrade (3 intervenciones) el 28/10/2008 22:23:19
Muchas gracias por tu contestación; y abusando de ti, te mando un ejemplo de las funciones de mi proyecto ( mas o menos para explicarte nuevamente mi problema ).

Aquí pongo un cuadro en el centro de la pantalla, con el efecto que deseo buscar, y después (al presionar una tecla), llamo a la función Mensaje(), que abre un cuadro de diálogo, en ése cuadro es que deseo aplicar el efecto de sombra, pero como no sé que es lo que va a ver debajo de él, logicamente no puedo forzar a mi gusto, debería de haber algo que me cambie el color del texto que ya tengo en pantalla o algo así.

Reitero mi agradecimiento.

#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <string.h>

const DOBLE = 1;
const SIMPLE = 2;

void Rellenar(int,int,int,int,char);
void Color(int,int);
void Caja(int,int,int,int,int);
void Centrar(char *, int);
int Mensaje(char *, char *, char *, char *, int, int);

int main() {
Color(7,0); clrscr();
Color(1,7);
Rellenar(1,1,79,25,'°');
Color(7,0);
Rellenar(17,9,49,9,'°');
Color(15,1);
Caja(15,8,49,9,DOBLE);
Color(14,1);
Centrar("Si observas la sombra de este cuadro", 10);
Centrar("sabr s cu l es el efecto de sombra", 11);
Centrar("que deseo implementar.",12);
Color(7,1);
Centrar("Presiona una tecla...", 14);

getch();

Mensaje(" En mis di logos c¢mo lo puedo aplicar? ",
" ¨ ? ", " Salir ", " Regresar ", 15,5);

return 0;
}

void Color(int frente, int fondo) {
textcolor(frente);
textbackground(fondo);
}

void Rellenar( int x, int y, int ancho, int alto, char c ) {
int x1 = wherex();
int y1 = wherey();

gotoxy( x, y );
for( int i = x; i < x + ancho; i++ ) {
for( int j = y; j < y + alto; j++ ) {
gotoxy( i, j );
cprintf("%c", c);
}
}
gotoxy( x1, y1 );
}

int leeTecla() {
int key, modifiers;
while( bioskey(1) == 0 );
key = bioskey(0);
return key;
}

void Centrar( char texto[], int Row ){
int x = wherex(), y = wherey(), mitad = strlen(texto)/2;
gotoxy(40-mitad, Row);
cprintf( "%s", texto );
gotoxy(x,y);
}

int Mensaje(char msg[], char tit[], char b1[], char b2[], int cT, int cF) {
char buffer[4096];
int opcion = 0, x1 = (40-strlen(msg)/2)-2, x2 = strlen(msg)+5;
int x3 = x1+x2-strlen(b1)-strlen(b2)-8;
_setcursortype(_NOCURSOR);
gettext(1,1,80,25,buffer);
Color(cT,cF);
Caja(x1, 9, x2, 6, DOBLE);
Centrar( tit, 9 );
Centrar(msg, 11);
Re:
Color(cT, cF);
gotoxy(x3,13); cprintf(" %s ", b1);
gotoxy(x3+strlen(b1)+4, 13); cprintf(" %s ", b2);
Color(15,7);
if( opcion == 0 ) { gotoxy(x3,13); cprintf(" %s ", b1); }
else { gotoxy(x3+strlen(b1)+4, 13); cprintf(" %s ", b2); }
int tecla = leeTecla();

if( tecla == 19712 ) { opcion++; if(opcion == 2) {opcion = 0;} }
else if( tecla == 19200 ) { opcion--; if(opcion == -1) { opcion=1; } }
else if( tecla == 7181 ) { puttext(1,1,80,25,buffer); return opcion; }
else if( tecla == 283 ) { return 1; }
goto Re;
}

void Caja( int x, int y, int ancho, int alto, int tipo ) {
int x1 = wherex(), y1 = wherey();
char esi, esd, eii, eid, ver, hor;

Rellenar(x,y,ancho,alto,' ');
if( tipo == DOBLE ) {
esi = 'É'; esd = '»';
eii = 'È'; eid = '¼';
ver = 'º'; hor = 'Í';
} else {
esi = 'Ú'; esd = '¿';
eii = 'À'; eid = 'Ù';
ver = '³'; hor = 'Ä';
}
gotoxy( x , y ); cprintf("%c", esi);
gotoxy( x+ancho-1, y ); cprintf("%c", esd);
gotoxy( x , y+alto-1 ); cprintf("%c", eii);
gotoxy( x+ancho-1, y+alto-1 ); cprintf("%c", eid);
for(int i = x+1; i < x+ancho-1; i++ ) {
gotoxy(i, y ); cprintf("%c", hor);
gotoxy(i, y+alto-1); cprintf("%c", hor);
}
for( i = y+1; i < y+alto-1; i++ ) {
gotoxy(x ,i); cprintf("%c",ver);
gotoxy(x+ancho-1,i); cprintf("%c",ver);
}
gotoxy(x1,y1);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Sombra en ANSI C

Publicado por Armando Nava (127 intervenciones) el 29/10/2008 01:39:30
Saludos

En cuestión efecto lo puedes hacer, debes tratar los grafico y la cuestión datos por separado.

La ventana o cuadro de texto tiene ciertas propiedades x_inicio, y_inicio, x_fin, y_fin.

Lo que te hace falta es guardar las propiedades de datos, tuve un problema similar y use estructuras para guardar mis datos, así podía refrescar la pantalla y redibujar los cambios.

----------------------------------------
struct compuerta {
int tipo; //Tipo de compuerta
int x,y; //Posicion
int id; //Identificador dentro de la estructura
int *ent1; //puntero para el valor de entrada1
int *ent2; //puntero para el valor de entrada2
int salida; //variable que almacena el valor de la salida 3
int en_uso; //variable que indica si la compuerta esta en uso
int resuelta; //indica si ya se resolvio la compuerta
}gates[100];
-----------------------------------------------
gates[ID].id=ID;
gates[ID].tipo=compuerta;
gates[ID].x=x_pos;
gates[ID].y=y_pos;
gates[ID].en_uso=1;
gates[ID].ent1=&ZETA;
gates[ID].ent2=&ZETA;
ID++;
-------------------------------------------------

#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <string.h>

const DOBLE = 1;
const SIMPLE = 2;

void Rellenar(int,int,int,int,char);
void Color(int,int);
void Caja(int,int,int,int,int);
void Centrar(char *, int);
int Mensaje(char *, char *, char *, char *, int, int);

int main() {
Color(7,0); clrscr();
Color(1,7);
Rellenar(1,1,79,25,'°');
Color(7,0);
Rellenar(17,9,49,9,'°');
Color(15,1);
Caja(15,8,49,9,DOBLE);
Color(14,1);
Centrar("Si observas la sombra de este cuadro", 10);
Centrar("sabr s cu l es el efecto de sombra", 11);
Centrar("que deseo implementar.",12);
Color(7,1);
Centrar("Presiona una tecla...", 14);

getch();
Color(15,7);
Rellenar(20,10,45,6,'°');
Mensaje(" En mis di logos c¢mo lo puedo aplicar? ",
" ¨ ? ", " Salir ", " Regresar ", 15,5);

return 0;
}

void Color(int frente, int fondo) {
textcolor(frente);
textbackground(fondo);
}

void Rellenar( int x, int y, int ancho, int alto, char c ) {
int x1 = wherex();
int y1 = wherey();

gotoxy( x, y );
for( int i = x; i < x + ancho; i++ ) {
for( int j = y; j < y + alto; j++ ) {
gotoxy( i, j );
cprintf("%c", c);
}
}
gotoxy( x1, y1 );
}

int leeTecla() {
int key, modifiers;
while( bioskey(1) == 0 );
key = bioskey(0);
return key;
}

void Centrar( char texto[], int Row ){
int x = wherex(), y = wherey(), mitad = strlen(texto)/2;
gotoxy(40-mitad, Row);
cprintf( "%s", texto );
gotoxy(x,y);
}

int Mensaje(char msg[], char tit[], char b1[], char b2[], int cT, int cF) {
char buffer[4096];
int opcion = 0, x1 = (40-strlen(msg)/2)-2, x2 = strlen(msg)+5;
int x3 = x1+x2-strlen(b1)-strlen(b2)-8;
_setcursortype(_NOCURSOR);
gettext(1,1,80,25,buffer);
Color(cT,cF);
Caja(x1, 9, x2, 6, DOBLE);
Centrar( tit, 9 );
Centrar(msg, 11);
Re:
Color(cT, cF);
gotoxy(x3,13); cprintf(" %s ", b1);
gotoxy(x3+strlen(b1)+4, 13); cprintf(" %s ", b2);
Color(15,7);
if( opcion == 0 ) { gotoxy(x3,13); cprintf(" %s ", b1); }
else { gotoxy(x3+strlen(b1)+4, 13); cprintf(" %s ", b2); }
int tecla = leeTecla();

if( tecla == 19712 ) { opcion++; if(opcion == 2) {opcion = 0;} }
else if( tecla == 19200 ) { opcion--; if(opcion == -1) { opcion=1; } }
else if( tecla == 7181 ) { puttext(1,1,80,25,buffer); return opcion; }
else if( tecla == 283 ) { return 1; }
goto Re;
}

void Caja( int x, int y, int ancho, int alto, int tipo ) {
int x1 = wherex(), y1 = wherey();
char esi, esd, eii, eid, ver, hor;

Rellenar(x,y,ancho,alto,' ');
if( tipo == DOBLE ) {
esi = 'É'; esd = '»';
eii = 'È'; eid = '¼';
ver = 'º'; hor = 'Í';
} else {
esi = 'Ú'; esd = '¿';
eii = 'À'; eid = 'Ù';
ver = '³'; hor = 'Ä';
}
gotoxy( x , y ); cprintf("%c", esi);
gotoxy( x+ancho-1, y ); cprintf("%c", esd);
gotoxy( x , y+alto-1 ); cprintf("%c", eii);
gotoxy( x+ancho-1, y+alto-1 ); cprintf("%c", eid);
for(int i = x+1; i < x+ancho-1; i++ ) {
gotoxy(i, y ); cprintf("%c", hor);
gotoxy(i, y+alto-1); cprintf("%c", hor);
}
for( i = y+1; i < y+alto-1; i++ ) {
gotoxy(x ,i); cprintf("%c",ver);
gotoxy(x+ancho-1,i); cprintf("%c",ver);
}
gotoxy(x1,y1);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar