Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Gunhack en 5 Abril 2015, 20:22 pm



Título: Menú ¿Dinámico? en C
Publicado por: Gunhack 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

(http://k33.kn3.net/6/9/0/E/F/3/41C.png)

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.  


Título: Re: Menú ¿Dinámico? en C
Publicado por: ivancea96 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 (https://github.com/ivancea/Varios/blob/master/C%2B%2B/selector.h)
Ahí un ejemplo de una clase en C++, sin usar windows.h.


Título: Re: Menú ¿Dinámico? en C
Publicado por: Gunhack 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 (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


Título: Re: Menú ¿Dinámico? en C
Publicado por: eferion 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 ) );