# Como hago un entorno grafico programado en C



## titorealico (Oct 18, 2005)

Bueno, reconozco que es un poco desubicado mi tema ya q como este es un foro de electrónica no podría estar haciendo esta pregunta de programación, pero como no conozco ningún foro confiable de programación, prefiero crear el tema acá.

Estoy haciendo un programa para un proyecto final de una materia de la facultad que se llama informática II, el proyecto consiste en: tener un software hecho en C (lenguaje de la materia) que controle dos motores paso a paso que muevan un espejo y teniendo un laser apuntando a ese espejo, poder formar figuras geométricas en la pared.

El tema es que como es el proyecto final de la materia, a mi me gustaría hacer este software con un pequeño entorno grafico como para darle un poco mas de presentación al proyecto, el entorno grafico solo lo quiero para los menus, etc bien simple !

El problema es que no se como hacer ese entorno grafico programando desde C

alguien me puede ayudar???
Gracias !


----------



## MaMu (Oct 18, 2005)

Mira, es dificil de explicar, ya que ademas de ser muchas cosas habria que ver que es lo que quieres hacer... pero puedes pegarle una revisada a este mini tutorial, es bastante sencillo.

http://www.ib.cnea.gov.ar/~icom/CursoC/graficos.shtml


----------



## eljoseeee (Oct 19, 2006)

Si utilizas Linux el mismo SO tiene aplicaciones para realizar entornos graficos tanto en KDE como en Gnome y hay muchisima información en internet. La programacion en ambos es en C asi q no te costará mucho trabajo hacerlo.

Si usas windows necesitaras de algun programilla, tipo labwindows,..... son faciles de usar


----------



## Meliklos (Oct 25, 2010)

revivo este tema porque tengo el mismo problema...
lamentablemente el link de mamu ya no me lo toma....

aclaro que estoy en Win y no voy a usar linux! en realidad encontre un ejemplo de barra de progreso, el problema es que cuando pongo el ejecutable lo hace sin problemas, peo cuando habro el Turbo C y desde ahi abro el programa y lo quiero ejecutar, dice que no inicialice los graficos...cuando en realidad si!


----------



## elbrujo (Oct 25, 2010)

a ver el codigo


----------



## Meliklos (Oct 25, 2010)

ups...cierto 
bueno, problema resuelto...era cuestion de reacomodar, leer un poco mas y listo 
igualmente subo lo que tengo hecho que puede servir!


```
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>

#define CNT_ROW 5  //Counter in ProgressBar's --> Col position
#define CNT_COL 40  //Counter in ProgressBar's --> Row position

#define PROGRESS_X1 200//ProgressBar's --> Starting  position
#define PROGRESS_X2 460//ProgressBar's --> Ending position

#define PROGRESS_Y1 55 //ProgressBar's --> Starting Height
#define PROGRESS_Y2 85 //ProgressBar's --> Ending Height

#define delayTime 50  //Speed of ProgressBar

int main(void)
{
   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int i,j,cnt=0,clrflag=0;
   clrscr();
   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "c:\\tc\\bgi");

   /*-------Introduction Line----------*/
   setcolor(LIGHTGREEN);
   settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
   outtextxy(5,100,"Graphical ProgressBar");

   setcolor(CYAN);
   j=PROGRESS_X1;
   cnt=5;
   for(i=j;i<PROGRESS_X2;i++){
      delay(delayTime);
      gotoxy(CNT_COL,CNT_ROW);
      printf("%d",cnt);
      rectangle(j,PROGRESS_Y1,i,PROGRESS_Y2);
      if(i==(j+10)){
     j=j+13;
     i=j;
     if(clrflag==1){
       clrflag=0;
       setcolor(CYAN);
     }
     else{
       clrflag=1;
       setcolor(BLUE);
     }
     cnt=cnt+5;
      }
   }

   setcolor(WHITE);
   outtextxy(5,260,"Press Any Key to Return...");




   /* clean up */
   getch();
//   closegraph();
   return 0;
}
```


----------



## albertoxx (Oct 25, 2010)

A tan bonito que era el turbo C = que el turbo pascal todavia los tengo alli empolvados.... , pero lo malo es que ahora despues del windows vista ya no mucho que funcionan y mas para la comunicacion con los puertos LPT y Serial y no digamos con los USB, creo que le seria mas facil hacer el programa en visual C y con componentes de botoncitos y grafiquitas (Canvas) lo pueda hacer visual y controlar el motor por el LPT con una libreria tipo inpout32.dll


----------



## elbrujo (Oct 25, 2010)

Una rutina de esas como es interactiva con algun evento/accion/proceso tenes que engancharla para que el incremento sea representativo con la accion. Por ejemplo si reccorres una base de datos, que el puntero sea la referencia sobre donde esta y cuanto falta para EOF


----------



## Meliklos (Oct 25, 2010)

si, estaba haciedo ese enganche...
tengo otro programa que copia lineas de unos ficheros y las pasa a uno nuevo...
vos decis que la variable del for (que copia las lineas) sea la misma que el for para incrementar la barra de progreso??


----------



## albertoxx (Oct 25, 2010)

Se los hize un procedimiento asi es mas facil que lo puedan intercalar en cualquier despliegue de progreso solo tienen que saber el no. de veces a hacer y el procedimiento se encarga de la dibujada y del calculo del porcentaje aqui les va el codigo ya lo compile y lo probe y funciona bien. lo que no se es como se hace para que aparesca como codigo? aqui en el foro

#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <IO.H>

#define delayTime 50  //Speed of ProgressBar

//Parametros
//XPos,YPos  posiciones donde aparecera la barra de progreso
//Widht,Height ancho y alto de la barra de progreso
//Maximo : Cantidad maxima de veces ejemplo 500 
//Actual : Valor actual del progreso ejemplo numero de 1 a 500

void DrawProgress(int XPos,int YPos,int PWidth,int PHeight,
        int Maximo,int Actual){
int Prog;
char stPor[40];

   setcolor(WHITE);
   rectangle(XPos,YPos,XPos+PWidth,YPos+PHeight);
   setfillstyle(1,BLACK);
   bar(XPos+1,YPos+1,XPos+PWidth-1,YPos+PHeight-1);
   setfillstyle(1,BLUE);
   Prog = int((Actual*(PWidth-1)) / Maximo);
   bar(XPos+1,YPos+1,XPos+Prog,YPos+PHeight-1);
   Prog = int((Actual*100)/Maximo);
   sprintf(stPor,"%d%%",Prog);
   outtextxy(XPos+1,YPos,stPor);
}

int main(void)
{
   /* request auto detection */
  int gdriver = DETECT, gmode, errorcode;
  int i,j,cnt=0,clrflag=0;
  clrscr();
  /* initialize graphics and local variables */
  initgraph(&gdriver, &gmode, "P:\\PROGRAMS\\tc\\bgi");

  /*-------Introduction Line----------*/
  setcolor(LIGHTGREEN);
  settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
  outtextxy(5,100,"Graphical ProgressBar");

  setcolor(CYAN);
  cnt=5;
  for(i=1;i<50;i++){
    DrawProgress(20,20,100,20,50,i);
    delay(delayTime);
  }

  setcolor(WHITE);
      outtextxy(5,260,"Press Any Key to Return...");
 /* clean up */
    getch();
   //   closegraph();
      return 0;
    }


----------



## elbrujo (Oct 25, 2010)

Meliklos dijo:


> si, estaba haciedo ese enganche...
> tengo otro programa que copia lineas de unos ficheros y las pasa a uno nuevo...
> vos decis que la variable del for (que copia las lineas) sea la misma que el for para incrementar la barra de progreso??



En terminos generales una barra de proceso esta indicando proceso y debe ser representativa en terminos de porcentaje con el proceso que esta representando.. asi cuando inicia el proceso se evalua y en funcion al avance del mismo se vaya completando.

No es una barra grafica que varia en el tiempo o en un conteo independiente.


----------



## Meliklos (Oct 26, 2010)

bueno, la cosa es unir los siguientes pedazos de código...

la parte de la barra de progreso que esta en el post #6 con la parte de cargar copiar lineas de unos ficheros a otro...

```
void cargardatos(FILE *f,FILE *tabla1,FILE *tabla2,FILE *tabla3)
{
	char cadena[1000];
	char nombre[0x80];
	int m;

	unsigned long frec;
//	setcolor(WHITE);
//	settextstyle(3,0,1);
//	outtextxy(10,40,"\nIngrese la ruta de acceso a los archivos de datos:\n");

	//establecer una direccion que te lleve a la ruta dada
	tabla1=fopen("c:\\tc\\tabla1.txt","w");
	tabla2=fopen("c:\\tc\\tabla2.txt","w");
	tabla3=fopen("c:\\tc\\tabla3.txt","w");
	for(m=0;m<64;m++){
		fprintf(tabla1,"%d\t",m);
		fprintf(tabla2,"%d\t",m);
		fprintf(tabla3,"%d\t",m);
		sprintf(nombre,"c:\\tc\\fase\\%d.s2p",m);
		f=fopen(nombre,"r");
		if(f==NULL){
			printf("\nEl archivo no existe.\n");
			return;
		}
		else{
			while(!feof(f)){
				fgets(cadena, 1000,f);
				sscanf(cadena,"%lu",&frec);
				if(frec==1201000000)fputs(cadena,tabla1);
				if(frec==1300000000)fputs(cadena,tabla2);
				if(frec==1399000000)fputs(cadena,tabla3);
			}
		}
		fclose(f);
	}
	fclose(tabla1);
	fclose(tabla2);
	fclose(tabla3);
	return;
}
```


----------



## albertoxx (Oct 26, 2010)

No es como en el post 6 pero te puede dar una idea, ahora si quieres solo 1 barrita tendrias que hacer un ciclo donde sumes el largo de todos los archivos posibles y luego con ese dato ir calculando el progreso ( con 2 barras se mira bonito  los setups de instalacion usan dos barras mientras 1 indica el progreso general la otra indica el progreso de modulo.

void DrawProgress(long XPos,long YPos,long PWidth,long PHeight,
        long Maximo,long Actual){
long Prog;
char stPor[40];

   setcolor(WHITE);
   rectangle(XPos,YPos,XPos+PWidth,YPos+PHeight);
   setfillstyle(1,BLACK);
   bar(XPos+1,YPos+1,XPos+PWidth-1,YPos+PHeight-1);
   setfillstyle(1,BLUE);
   Prog = long((Actual*(PWidth-1)) / Maximo);
   bar(XPos+1,YPos+1,XPos+Prog,YPos+PHeight-1);
   Prog = long((Actual*100)/Maximo);
   sprintf(stPor,"%d%%",Prog);
   outtextxy(XPos+1,YPos,stPor);
}

void cargardatos(FILE *f,FILE *tabla1,FILE *tabla2,FILE *tabla3)
{
    char cadena[1000];
    char nombre[0x80];
    int m;
        long FileSize,CarLeidos;

    unsigned long frec;

    //establecer una direccion que te lleve a la ruta dada
    tabla1=fopen("c:\\tc\\tabla1.txt","w");
    tabla2=fopen("c:\\tc\\tabla2.txt","w");
    tabla3=fopen("c:\\tc\\tabla3.txt","w");
    for(m=0;m<64;m++){
                //barra de progreso general
                DrawProgress(1,1,200,20,64,m);
        fprintf(tabla1,"%d\t",m);
        fprintf(tabla2,"%d\t",m);
        fprintf(tabla3,"%d\t",m);
        sprintf(nombre,"c:\\tc\\fase\\%d.s2p",m);
        f=fopen(nombre,"r");
        if(f==NULL){
            printf("\nEl archivo no existe.\n");
            return;
        }
        else{
                        FileSize = filelength(f);
                        CarLeidos = 0;
            while(!feof(f)){
                fgets(cadena, 1000,f);
                                CarLeidos = CarLeidos + strlen(cadena);
                                //dibujando la barra de progreso de archivo
                                DrawProgress(1,30,200,20,FileSize,CarLeidos);
                sscanf(cadena,"%lu",&frec);
                if(frec==1201000000)fputs(cadena,tabla1);
                if(frec==1300000000)fputs(cadena,tabla2);
                if(frec==1399000000)fputs(cadena,tabla3);
            }
        }
        fclose(f);
    }
    fclose(tabla1);
    fclose(tabla2);
    fclose(tabla3);
    return;
}


----------



## Meliklos (Oct 26, 2010)

alberto lo pruebo y te digo 

una dudilla....

tengo los parametros que decis...

void DrawProgress(long XPos,long YPos,long PWidth,long PHeight,
long Maximo,long Actual)

y en mi codigo serian: 
#define CNT_ROW 5  //Counter in ProgressBar's --> Col position
#define CNT_COL 40  //Counter in ProgressBar's --> Row position

#define PROGRESS_X1 200//ProgressBar's --> Starting  position
#define PROGRESS_X2 460//ProgressBar's --> Ending position

#define PROGRESS_Y1 55 //ProgressBar's --> Starting Height
#define PROGRESS_Y2 85 //ProgressBar's --> Ending Height

#define delayTime 50  //Speed of ProgressBar


cuales representan los que vos me decis??

se que tienen que ser el enganche con el proceso....pero me confuso en donde engancharlo...
maso menos sigo tus pasos alberto...del codigo que pusiste pero no va todavia...


----------

