elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Para que dejeis de preguntar de una vez por los menus
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Para que dejeis de preguntar de una vez por los menus  (Leído 47,839 veces)
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Para que dejeis de preguntar de una vez por los menus
« en: 3 Diciembre 2009, 19:58 pm »

MODIFICADO

Añadido:
----------
- portabilidad
- texto centrado


Ya se que todo el codigo que viene a continuacion es una morcilla de las de Burgos, pero si mirais el ejemplo que hay al final, vereis como se simplifica todo a la hora de utilizar los menus.

Menu.h
Código
  1.  
  2. /*
  3.  
  4. IMPORTANTE: Cuando el menu ya no sea util, ultilizar siempre la funcion finalizarMenu
  5.  
  6. */
  7.  
  8. #ifndef MENU_H
  9. #define MENU_H
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. /*
  16. * Para compilar en UNIX desactivar la definicion de WINDOWS y activar la de UNIX
  17. * Para otros SO desactivar ambas.
  18. */
  19.  
  20. #ifndef WINDOWS
  21.    #define WINDOWS
  22. #endif
  23. /*
  24. #ifndef UNIX
  25.     #define UNIX
  26. #endif
  27. */
  28.  
  29. #define MENU_OK                   0L
  30. #define MENU_ERROR                1L
  31. #define MENU_MEMORIA_INSUFICIENTE 2L
  32.  
  33. #define MENU_MODO_NORMAL      0L
  34. #define MENU_MODO_ULTIMA_CERO 1L
  35.  
  36. struct Menu
  37. {
  38.    char*         titulo;
  39.    char*         texto;
  40.    char**        opciones;
  41.    int           numOpciones; /* numero de opciones */
  42.    int           maxlen;
  43.    unsigned long lFlags;
  44. };
  45. typedef struct Menu Menu;
  46.  
  47. void inicializarMenu(Menu* menu,char* titulo, char* texto, char* opciones[]);
  48. int mostrarMenu(Menu* menu,int modo);
  49. void finalizarMenu(Menu* menu);
  50.  
  51. #endif /* MENU_H */
  52.  

menu.c
Código
  1. #include "menu.h"
  2.  
  3. void inicializarMenu(Menu* menu, char* titulo, char* texto, char* opciones[])
  4. {
  5.   menu->lFlags = MENU_OK;
  6.  
  7.   if(titulo == NULL)
  8.      menu->titulo = NULL;
  9.   else
  10.   {
  11.       if((menu->titulo = (char*) malloc(strlen(titulo) * sizeof(char) + 1)))
  12.           strcpy(menu->titulo,titulo);
  13.      else
  14.      {
  15.         menu->lFlags |= MENU_ERROR | MENU_MEMORIA_INSUFICIENTE;
  16.         menu->texto = NULL;
  17.      }
  18.   }
  19.  
  20.   if(texto == NULL)
  21.      menu->texto = NULL;
  22.   else
  23.   {
  24.      if((menu->texto = (char*) malloc(strlen(texto) * sizeof(char) + 1)))
  25.         strcpy(menu->texto,texto);
  26.      else
  27.      {
  28.         menu->lFlags |= MENU_ERROR | MENU_MEMORIA_INSUFICIENTE;
  29.         menu->texto = NULL;
  30.  
  31.         if(menu->titulo)
  32.         {
  33.            free(menu->titulo);
  34.            menu->titulo = NULL;
  35.         }
  36.      }
  37.   }
  38.  
  39.   if(opciones == NULL)
  40.      menu->opciones = NULL;
  41.   else
  42.   {
  43.      menu->numOpciones = -1;
  44.  
  45.      while(opciones[ ++(menu->numOpciones) ][0]);
  46.  
  47.      if((menu->opciones = (char**) malloc(menu->numOpciones * sizeof(char*))))
  48.      {
  49.         int i=0;
  50.  
  51.         menu->maxlen = 0;
  52.  
  53.         for(i=0 ; i < menu->numOpciones ; i++)
  54.         {
  55.            if
  56.            (
  57.               (menu->opciones[i] =
  58.               (char*) malloc(strlen(opciones[i]) * sizeof(char) + 1))
  59.            )
  60.            {
  61.               strcpy(menu->opciones[i],opciones[i]);
  62.  
  63.               if(strlen(menu->opciones[i]) > menu->maxlen)
  64.                  menu->maxlen = strlen(menu->opciones[i]);
  65.            }
  66.            else
  67.            {
  68.               int j;
  69.  
  70.               for(j=0 ; j<i ; j++)
  71.                  free(menu->opciones[j]);
  72.  
  73.               free(menu->opciones);
  74.  
  75.               menu->opciones = NULL;
  76.               menu->numOpciones = 0;
  77.  
  78.               if(menu->texto)
  79.               {
  80.                  free(menu->texto);
  81.                  menu->texto = NULL;
  82.               }
  83.  
  84.               if(menu->titulo)
  85.               {
  86.                  free(menu->titulo);
  87.                  menu->titulo = NULL;
  88.               }
  89.  
  90.               menu->lFlags |= MENU_ERROR | MENU_MEMORIA_INSUFICIENTE;
  91.            }
  92.         }
  93.      }
  94.      else
  95.      {
  96.         menu->lFlags |= MENU_ERROR | MENU_MEMORIA_INSUFICIENTE;
  97.         menu->opciones = NULL;
  98.  
  99.         if(menu->texto)
  100.         {
  101.            free(menu->texto);
  102.            menu->texto = NULL;
  103.         }
  104.  
  105.         if(menu->titulo)
  106.         {
  107.            free(menu->titulo);
  108.            menu->titulo = NULL;
  109.         }
  110.      }
  111.   }
  112. }
  113.  
  114. int mostrarMenu(Menu* menu,int modo)
  115. {
  116.   int i=0, opcion=0;
  117.  
  118.   if(menu->numOpciones)
  119.   {
  120.       do{
  121.  
  122.          #ifdef WINDOWS
  123.             system("CLS");
  124.          #elif defined UNIX
  125.             system("clear");
  126.          #endif
  127.  
  128.          if(menu->titulo)
  129.          {
  130.             for(i=0 ; i<80 ; i++)
  131.                 printf("=");
  132.  
  133.             printf("%*s\n", 40 + strlen(menu->titulo) / 2, , menu->titulo);
  134.  
  135.             for(i=0 ; i<80 ; i++)
  136.                 printf("=");
  137.          }
  138.  
  139.          if(menu->texto)
  140.              printf("%-*s%s\n\n",40 - menu->maxlen / 2 - 8, " ", menu->texto);
  141.  
  142.          for(i=0 ; i < menu->numOpciones ; i++)
  143.          {
  144.             if(modo == MENU_MODO_ULTIMA_CERO && i == menu->numOpciones - 1)
  145.             {
  146.                if(menu->numOpciones > 10)
  147.                   printf("%*s 0. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", 40 + menu->maxlen / 2,
  148.                                            menu->opciones[i]);
  149.                else
  150.                   printf("%*s0. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", 40 + menu->maxlen / 2,
  151.                                           menu->opciones[i]);
  152.             }
  153.             else
  154.             {
  155.                if(modo != MENU_MODO_ULTIMA_CERO)
  156.                {
  157.                   if(menu->numOpciones >= 10)
  158.                   {
  159.                      printf("%*s%2d. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", i+1,
  160.                                                40 + menu->maxlen / 2, menu->opciones[i]);
  161.                   }
  162.                   else
  163.                   {
  164.                      printf("%*s%d. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", i+1,
  165.                                               40 + menu->maxlen / 2, menu->opciones[i]);
  166.                   }
  167.                }
  168.                else
  169.                {
  170.                   if(menu->numOpciones > 10)
  171.                   {
  172.                      printf("%*s%2d. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", i+1,
  173.                                                40 + menu->maxlen / 2, menu->opciones[i]);
  174.                   }
  175.                   else
  176.                   {
  177.                      printf("%*s%d. %-*s\n", 40 - menu->maxlen / 2 - 4, " ", i+1,
  178.                                               40 + menu->maxlen / 2, menu->opciones[i]);
  179.                   }
  180.                }
  181.             }
  182.          }
  183.          printf("%-*s>", 40 - menu->maxlen / 2 - 8, " ");
  184.  
  185.         if(!scanf("%d", &opcion))
  186.         {
  187.            while(getchar() != '\n');
  188.            scanf("%d", &opcion);
  189.         }        
  190.  
  191.       }while
  192.       (
  193.          (
  194.             (modo != MENU_MODO_ULTIMA_CERO) ? (opcion < 1) : (opcion < 0)
  195.          )
  196.          ||
  197.          (
  198.             (modo != MENU_MODO_ULTIMA_CERO) ?
  199.                (opcion >  menu->numOpciones)
  200.                :
  201.                (opcion >= menu->numOpciones)
  202.          )
  203.       );
  204.  
  205.       return opcion;
  206.   }
  207.  
  208.   return -1;
  209. }
  210.  
  211. void finalizarMenu(Menu* menu)
  212. {
  213.   if(menu->texto)
  214.   {
  215.      free(menu->texto);
  216.      menu->texto = NULL;
  217.   }
  218.  
  219.   if(menu->opciones)
  220.   {
  221.       int i=0;
  222.  
  223.       for(i=0 ; i < menu->numOpciones ; i++)
  224.       {
  225.           if(menu->opciones[i])
  226.           {
  227.               free(menu->opciones[i]);
  228.               menu->opciones[i] = NULL;
  229.           }
  230.       }
  231.       free(menu->opciones);
  232.       menu->opciones = NULL;
  233.   }
  234.  
  235.   menu->numOpciones = 0;
  236. }
  237.  

ejemplo: (tener en cuenta que menu.h y menu.c tienen que estar en el mismo directorio donde este el fichero con la funcion principal)
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include "menu.h"
  5. #include "menu.c" /* solo si no se va crear un proyecto*/
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.    Menu menu;
  10.    char *opciones[] = {"Continuar","Salir",""}; /* la ultima opcion siempre es una cadena vacia*/
  11.    int opcion;
  12.  
  13.    inicializarMenu(&menu,"MENU DE PRUEBA","Escoger una opcion:",opciones);
  14.  
  15.    do{
  16.        opcion=mostrarMenu(&menu,MENU_MODO_ULTIMA_CERO);
  17.  
  18.        switch(opcion)
  19.        {
  20.            case 1:
  21.                printf("Has escogido continuar.\n");
  22.                break;
  23.            case 0:
  24.                printf("Has escogido salir.\n");
  25.                break;
  26.        }
  27.    }while(opcion!=0);
  28.  
  29.    /* ¡¡¡¡¡IMPORTANTE!!!!! */
  30.    finalizarMenu(&menu);
  31.  
  32.    return 0;
  33. }
  34.  

En lo que es el menu, me gustaria completar alguna opcion mas, pero el codigo ya es funcional.

Si el codigo no funciona, avisad, ya que es una adaptacion del codigo que realmente tengo guardado. Lo he puesto asi para evitar incluir mas headers y mas codigo.

El codigo de ejemplo lo he imprivosado sobre la marcha. Si hubiese algun error revisad el codigo, que no creo que haya darle muchas vueltas.


« Última modificación: 10 Febrero 2010, 16:55 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #1 en: 4 Diciembre 2009, 22:03 pm »

Esta bastante bien el codigo, como consejo te diria que en vez de pensar en sumarle opciones le mejores la portabilidad. No tiene sentido que sea exclusivo de Windows solamente por system y fflush  ;D.

Un saludo!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
^Winder^


Desconectado Desconectado

Mensajes: 2.776


El mundo no es tuyo, es de todos.


Ver Perfil
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #2 en: 4 Diciembre 2009, 23:22 pm »

Ahora solo falta ponerle una chincheta al tema  ;D
En línea


Yo apoyo la esperanza de Caylees. Frenemos la Leucemia:
www.cayleeshope.com
Libertad conquistada.  (Justicia ;-))
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #3 en: 5 Diciembre 2009, 02:29 am »

Jajajaja!

Lo de la portabilidad ya lo estaba pensando, al codigo ya tiene algunos mesecillos y ultimamente he estado pensando en la portabilidad.

Lo de system("PAUSE"), tiene facil solucion, para lo del fflush(stdin) ya tengo una alternativa y una solucion, pero lo de limpiar la pantalla... me parece que no hay ningun equivalente estandar para limpiarla, ¿no?

Le hecho un vistazo y a ver que sale.

¡Hasta luego!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #4 en: 5 Diciembre 2009, 02:32 am »

Ahora solo falta ponerle una chincheta al tema  ;D

Para eso estan los privados  ;)

do-while: con compilacion condicional podes hacerlo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #5 en: 5 Diciembre 2009, 03:07 am »

bueno, ya estan los cambios, he incluido un header y un fichero fuente mas, porque ahi esta la funcion que evita el fflush(stdin) antes de la lectura de un dato entero. (a parte creo que tambien hay funciones que pueden resultar utiles...) Tambien he eliminado las llamadas a system, ahora no queda tan bonito, pero esportable.

EI, si quieres completar el codigo con la compilacion condicional... yo desconozco las ordenes equivalentes en otros systemas operativos, asi que sirectamente evito utilizarlas, y tampoco he utilizado la compilacion condicional mas que para comprobar errores con printf's para ver los valores de las variables. :silbar:

Asi contribuimos a mejorar el codigo un poco entre todos.

¡Hasta luego!

He eliminado los dos ficheros añadidos. (por una sola funcion era meter demasiado codigo que no venia a cuento)

Ultima modificacion:
Código
  1. #ifdef WINDOWS
  2.   system("CLS");
  3. #elif defined UNIX
  4.   system("clear");
  5. #endif
  6.  

¿Es correcto?

Para los mac's y otros sistemas operativos no conozco analogos, pero sigo buscando.
« Última modificación: 5 Diciembre 2009, 05:49 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #6 en: 5 Diciembre 2009, 06:05 am »

Si, asi es correcto. Podes usar un else para luego poner el codigo para MAC.
clear podria funcionar pero de seguro trae problemas por el tema de la consola.

Yo dejaria el codigo asi para mantenerlo limpio. Eso si, las llamadas a system no me gustan para nada, pero si lo queres estandar solo puedes codificar tus propias funciones, y de seguro agregas codigo que tal vez sea innecesario.
Evitar la compilacion condicional de seguro es complicado si queres una funcion estandar para limpiar la pantalla.

Me refiero a algo asi con el tema de la pausa:

Código
  1. #include <stdio.h>
  2. #define PAUSE printf("Presiona una tecla..."); fgetc(stdin);
  3.  
  4. int main()
  5. {
  6.  PAUSE
  7.  return 0;
  8. }  

Esto lo digo como detalle, como ya dije, para tareas como esa llamar a system no es un problema importante.    

Un saludo!
« Última modificación: 5 Diciembre 2009, 07:28 am por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #7 en: 5 Diciembre 2009, 08:18 am »

Ok. Pues, de momento asi lo dejo. Ahora me queda algun detalle sobre la presentacion (alineacion delos textos) y pulir los flags, que los puse a ultima hora.

Hasta luego!

Bueno, creo que mas o menos ya esta. Si hay alguna idea, bienvenida sea.

Hasta luego!

EI: juntando mensajes.

¡Hola a todos!

Despues de la ultima modificacion, la funcion mostrarMenu, producia un error en tiempo de ejecucion, devido a un error que cometi. Ya esta corregido, y el codigo es funcional.

¡Hasta luego!
« Última modificación: 21 Diciembre 2009, 01:36 am por Eternal Idol » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #8 en: 2 Enero 2010, 04:48 am »

Hola, de vuelta al foro (por ahora que estoy de vacaciones aunque sea) y un intento de cooperación un mes después del ultimo comentario, espero que valga, a ver:

Respecto a la función de limpiar la pantalla:

En un entorno Windows:
Citar
To accomplish this task for a Win32 console application, use one of the following methods:
 - Use a system function.
 - Write a function that will programmatically clear the screen.

La primera seria un system("cls"), que es lo que usa ahora, y la segunda opción:

Código
  1. /* Standard error macro for reporting API errors */
  2. #define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s on line %d\n", __FILE__, GetLastError(), api, __LINE__);}
  3.  
  4. void cls( HANDLE hConsole )
  5. {
  6.    COORD coordScreen = { 0, 0 };    /* here's where we'll home the
  7.                                         cursor */
  8.    BOOL bSuccess;
  9.    DWORD cCharsWritten;
  10.    CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
  11.    DWORD dwConSize;                 /* number of character cells in
  12.                                         the current buffer */
  13.  
  14.    /* get the number of character cells in the current buffer */
  15.  
  16.    bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
  17.    PERR( bSuccess, "GetConsoleScreenBufferInfo" );
  18.    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  19.  
  20.    /* fill the entire screen with blanks */
  21.  
  22.    bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ',
  23.       dwConSize, coordScreen, &cCharsWritten );
  24.    PERR( bSuccess, "FillConsoleOutputCharacter" );
  25.  
  26.    /* get the current text attribute */
  27.  
  28.    bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
  29.    PERR( bSuccess, "ConsoleScreenBufferInfo" );
  30.  
  31.    /* now set the buffer's attributes accordingly */
  32.  
  33.    bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes,
  34.       dwConSize, coordScreen, &cCharsWritten );
  35.    PERR( bSuccess, "FillConsoleOutputAttribute" );
  36.  
  37.    /* put the cursor at (0, 0) */
  38.  
  39.    bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );
  40.    PERR( bSuccess, "SetConsoleCursorPosition" );
  41.    return;
  42. }

Fuente: http://support.microsoft.com/kb/99261

... también vi por ahi implementaciónes en inline ASM con llamadas de DOS, pero no las encuentro ahora.


Ahora bien, falta la implementación UNIX, que resulta ser un poco más... amena  ;D:

Código
  1. #include <stdio.h>
  2.  
  3. int
  4. main(void)
  5. {
  6. printf("\033[H\033[J"); // Esto es to, esto es todo amigos
  7. return 0;
  8. }
Fuentes:
  http://www.programmersheaven.com/mb/beginnercpp/137205/137377/re-clear--screen/
  http://homepages.cwi.nl/~tromp/tetris.html
  http://196.1.111.155/download_util/download/MODIFY07.txt?id=uniqueid
  http://okmij.org/ftp/packages/tournament-sched.c
  http://www.geekinterview.com/question_details/16718
  ...
  Y demás fuentes gratuitos que obtuve por ahi, en fin, el hecho es que funciona Ok, y debería funcionar Ok en cualquier terminal UNIX que use secuencias de Escape (desde LINUX, por los BSDes, AIX... bla bla bla)



Ahora bien, otro tema es que esta parte del code...
Código
  1. /*
  2. * Para compilar en UNIX desactivar la definicion de WINDOWS y activar la de UNIX
  3. * Para otros SO desactivar ambas.
  4. */
  5.  
  6. #ifndef WINDOWS
  7.    #define WINDOWS
  8. #endif
  9. /*
  10. #ifndef UNIX
  11.     #define UNIX
  12. #endif
  13. */

...resulta bastante "sucia" por así llamarle (y con todo respeto), ya que existen macros dadas para cada sistema (ver fuente http://msdn.microsoft.com/en-us/library/b0084kay.aspx), con lo que puedes usar _WIN32 y _WIN64 para definir un Windows, y cualquier otro sistema usara la secuencia de escape (si sale un Bug por ahi se solucionará, pero esa secuencia debe funcionar hasta en un BeOS)


Espero haber aportado suficiente

Un saludo Gente, Feliz 2010

@EI, rato que no me pasaba por aqui, un saludo!
En línea

OpenBSDFreeBSD
.;.


Desconectado Desconectado

Mensajes: 354


Ver Perfil
Re: Para que dejeis de preguntar de una vez por los menus
« Respuesta #9 en: 22 Enero 2010, 13:04 pm »

Ahora ya si que anda perfecto .
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ATENCION: no os dejeis engañar
Ingeniería Inversa
Raton 4 4,069 Último mensaje 6 Mayo 2004, 06:31 am
por byebye
Programa para grabar cds dif-x con menus
Software
david.canovas 1 2,332 Último mensaje 14 Noviembre 2004, 01:44 am
por Sourraund
Ayuda para crear menus interactibos tipo dvd para vcd
Multimedia
warriorlost 3 4,606 Último mensaje 29 Diciembre 2005, 13:42 pm
por Sourraund
[Ehn-Dev 2010] FAQ - Hilo para preguntar todas las dudas acerca del concurso! « 1 2 ... 9 10 »
Programación General
Littlehorse 98 48,131 Último mensaje 1 Diciembre 2010, 00:13 am
por Littlehorse
PROGRAMA PARA CREAR MENUS PARA DVD QUE LEA TAMBIEN EXE O SWF ?
Multimedia
rocagt 2 5,188 Último mensaje 7 Mayo 2011, 13:18 pm
por Songoku
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines