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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Menú ¿Dinámico? en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Menú ¿Dinámico? en C  (Leído 3,160 veces)
Gunhack

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Menú ¿Dinámico? en C
« en: 5 Abril 2015, 20:22 pm »

Buenas, no se si tenga algún nombre en especifico este tipo de menús, acabo de hacer esta "plantilla" por así decirlo, sólo que quiero saber si se puede simplificar más o que consejo me darían para hacer los menús así.  ;D


Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <windows.h>
  6.  
  7. using namespace std;
  8. //Define las opciones máximas.
  9. #define opmax 3
  10.  
  11. void SetBG(int ForgC, int BackC);
  12. void menu ();
  13. int tec(int *o1,int *o2,int *o3,int *y,int *t1,int *t2,int *t3);
  14.  
  15. main ()
  16. {
  17.  while (1)
  18.  {
  19.    menu();
  20.  }
  21. }
  22. //Define la función de menú
  23. void menu ()
  24. {
  25.  SetBG(15,0);
  26.  static int o1=14,o2=0,o3=0,y=0,t1=0,t2=15,t3=15;
  27.  
  28. do{
  29.    system("cls");
  30.    cout << "\n   MENU";
  31.    cout << "\n==========";
  32.    SetBG(t1,o1);
  33.    cout << "\n\n*Opcion 1";
  34.    SetBG(t2,o2);
  35.    cout << "\n\n*Opcion 2";
  36.    SetBG(t3,o3);
  37.    cout << "\n\n*Opcion 3";
  38.    SetBG(15,0);
  39.  }while (tec(&o1,&o2,&o3,&y,&t1,&t2,&t3)!=13);
  40.  
  41.  switch (y)
  42.  {
  43.    case 1: system("cls");cout << "Ejecutando 1";
  44.            break;
  45.    case 2: system("cls");cout << "Ejecutando 2";
  46.            break;
  47.    case 3: system("cls");cout << "Ejecutando 3";
  48.            break;
  49.    default: break;
  50.  
  51.  }
  52.  getch();
  53. }
  54. //Define la función que lee las teclas usadas por el usuario.
  55. int tec(int *o1,int *o2,int *o3,int *y,int *t1,int *t2,int *t3)
  56. {
  57.    int s;
  58.    s=getch();
  59.    switch (s)
  60.    {
  61.      case char(72):  *y-=1;
  62.                      break;
  63.      case char(80):  *y+=1;
  64.                      break;
  65.      case char(13):  return 13;
  66.                      break;
  67.      default:  break;
  68.    }
  69.    switch (*y)
  70.    {
  71.      case 1: *o1=14;*o2=0;*o3=0;
  72.              *t1=0;*t2=15;*t3=15;
  73.              break;
  74.      case 2: *o1=0;*o2=14;*o3=0;
  75.              *t1=15;*t2=0;*t3=15;
  76.              break;
  77.      case 3: *o1=0;*o2=0;*o3=14;
  78.              *t1=15;*t2=15;*t3=0;
  79.              break;
  80.      default:  break;
  81.    }
  82.  
  83.    if (*y==0)
  84.      *y+=1;
  85.    if (*y>opmax)
  86.      *y=*y-1;
  87. }
  88.  
  89. void SetBG(int ForgC, int BackC)
  90. {
  91.  WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
  92.  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
  93. }
  94.  
  95.  


« Última modificación: 5 Abril 2015, 20:58 pm por Gunhack » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Menú ¿Dinámico? en C
« Respuesta #1 en: 5 Abril 2015, 21:55 pm »

A lo mejor te interesa que menu() retorne la opción elegida, para que no haya sido en vano xD

También puedes pasarle a meno un arreglo de opciones, para no tener que andar tocando la función en sí.

https://github.com/ivancea/Varios/blob/master/C%2B%2B/selector.h
Ahí un ejemplo de una clase en C++, sin usar windows.h.


En línea

Gunhack

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Re: Menú ¿Dinámico? en C
« Respuesta #2 en: 6 Abril 2015, 04:34 am »

A lo mejor te interesa que menu() retorne la opción elegida, para que no haya sido en vano xD

También puedes pasarle a meno un arreglo de opciones, para no tener que andar tocando la función en sí.

https://github.com/ivancea/Varios/blob/master/C%2B%2B/selector.h
Ahí un ejemplo de una clase en C++, sin usar windows.h.

No se si te entendí bien con lo de la función menu(), pero si retoma la opción o bueno al regresar si se queda seleccionada, solo quería saber si el código que hice se puede simplificar x).
Veré si puedo hacer lo de los arreglos y gracias aunque aún no se programar en C++  :xD
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Menú ¿Dinámico? en C
« Respuesta #3 en: 6 Abril 2015, 12:17 pm »

¿Qué tal algo así?

Código
  1. #include <iostream>
  2. #include <set>
  3. #include <vector>
  4. #include <conio.h>
  5. #include <windows.h>
  6.  
  7. class MenuItem
  8. {
  9.  public:
  10.  
  11.    MenuItem( char tecla,
  12.              const std::string& texto,
  13.              unsigned char backColor,
  14.              unsigned char foreColor )
  15.      : _tecla( tecla ),
  16.        _texto( texto ),
  17.        _backColor( backColor ),
  18.        _foreColor( foreColor )
  19.    { }
  20.  
  21.    ~MenuItem( )
  22.    { }
  23.  
  24.    char Tecla( ) const
  25.    { return _tecla; }
  26.  
  27.    std::string Texto( ) const
  28.    { return _texto; }
  29.  
  30.    unsigned char BackColor( ) const
  31.    { return _backColor; }
  32.  
  33.    unsigned char ForeColor( ) const
  34.    { return _foreColor; }
  35.  
  36.  private:
  37.  
  38.    char _tecla;
  39.    std::string _texto;
  40.    unsigned char _backColor;
  41.    unsigned char _foreColor;
  42. };
  43.  
  44. void SetBG(unsigned char ForgC, unsigned char BackC);
  45. void menu();
  46. char mostrarMenu( const std::vector< MenuItem >& items );
  47.  
  48. main ()
  49. {
  50. while (1)
  51. {
  52.   menu();
  53. }
  54. }
  55.  
  56. //Define la función de menú
  57. void menu()
  58. {
  59.  std::vector< MenuItem > items;
  60.  items.push_back( MenuItem( '1', "Opción 1", 14, 0 ) );
  61.  items.push_back( MenuItem( '2', "Opción 2", 0, 5 ) );
  62.  items.push_back( MenuItem( 'a', "Opción 3", 4, 7 ) );
  63.  
  64.  char opcion = mostrarMenu( items );
  65.  
  66.  switch( opcion )
  67.  {
  68.    case '1':
  69.      system( "cls" );
  70.      std::cout << "Ejecutando 1" << std::endl;
  71.      break;
  72.    case '2':
  73.      system( "cls" );
  74.      std::cout << "Ejecutando 2" << std::endl;
  75.      break;
  76.    case 'a':
  77.      system( "cls" );
  78.      std::cout << "Ejecutando 'a'" << std::endl;
  79.      break;
  80.  
  81.    default:
  82.      break;
  83.  }
  84.  
  85.  getch( );
  86. }
  87.  
  88. char mostrarMenu( const std::vector< MenuItem >& items )
  89. {
  90.  char to_return;
  91.  std::set< char > validAnswer;
  92.  
  93.  do
  94.  {
  95.    system( "cls" );
  96.    std::cout << "   MENU" << std::endl
  97.              << "===================" << std::endl;
  98.    for( auto& item : items )
  99.    {
  100.      SetBG( item.ForeColor( ), item.BackColor( ) );
  101.      std::cout << "  " << item.Tecla( ) << ". " << item.Texto( ) << std::endl;
  102.      validAnswer.insert( item.Tecla( ) );
  103.    }
  104.    SetBG(15,0);
  105.    std::cin >> to_return;
  106.  
  107.  } while( validAnswer.count( to_return ) == 0 );
  108.  
  109.  return to_return;
  110. }
  111.  
  112. void SetBG(unsigned char ForgC, unsigned char BackC)
  113. {
  114.  WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
  115.  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
  116. }

Se podría conseguir un código más claro si se "mapeasen" los colores:

Código
  1. enum Color : unsigned char
  2. {
  3.  Black,
  4.  DarkBlue,
  5.  DrakGreen,
  6.  DarkAqua,
  7.  DarkRed,
  8.  DarkPurple,
  9.  DarkYellow,
  10.  Silver,
  11.  Gray,
  12.  Blue,
  13.  Green,
  14.  Aqua,
  15.  Red,
  16.  Purple,
  17.  Yellow,
  18.  White
  19. };
  20.  
  21. // ...
  22.  
  23. class MenuItem
  24. {
  25.  public:
  26.  
  27.    MenuItem( char tecla,
  28.              const std::string& texto,
  29.              Color backColor,
  30.              Color foreColor );
  31.  
  32.    Color BackColor( ) const;
  33.  
  34.    Color ForeColor( ) const;
  35.  
  36.  private:
  37.  
  38.    Color _backColor;
  39.    Color _foreColor;
  40. };
  41.  
  42. // ...
  43.  
  44.  items.push_back( MenuItem( '1', "Opción 1", Black, Red ) );
  45.  items.push_back( MenuItem( '2', "Opción 2", Black, Blue ) );
  46.  items.push_back( MenuItem( 'a', "Opción 3", Silver, Purple ) );
« Última modificación: 6 Abril 2015, 12:27 pm por eferion » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda menu en flash mx dinamico
Diseño Gráfico
juanfatchivo 2 1,962 Último mensaje 24 Enero 2006, 11:23 am
por juanfatchivo
como lleno los datos que tiene un menu a otro menu vacio, en asp.net c#
.NET (C#, VB.NET, ASP)
ivan05f 2 3,574 Último mensaje 8 Noviembre 2007, 18:58 pm
por ivan05f
Menu dinámico PHP
PHP
Gogeto 2 4,140 Último mensaje 23 Julio 2011, 07:00 am
por Gogeto
[Batch] Menu batch dinamico
Scripting
shadowhunter 9 7,751 Último mensaje 3 Noviembre 2013, 09:13 am
por Almapa
CVV DINAMICO $$$$$
Hacking
hisoka20 1 1,348 Último mensaje 14 Marzo 2023, 19:26 pm
por MCKSys Argentina
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines