Autor
|
Tema: Menú ¿Dinámico? en C (Leído 3,407 veces)
|
Gunhack
Desconectado
Mensajes: 42
|
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í. #include <iostream> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <windows.h> using namespace std; //Define las opciones máximas. #define opmax 3 void SetBG(int ForgC, int BackC); void menu (); int tec(int *o1,int *o2,int *o3,int *y,int *t1,int *t2,int *t3); main () { while (1) { menu(); } } //Define la función de menú void menu () { SetBG(15,0); static int o1=14,o2=0,o3=0,y=0,t1=0,t2=15,t3=15; do{ system("cls"); cout << "\n MENU"; cout << "\n=========="; SetBG(t1,o1); cout << "\n\n*Opcion 1"; SetBG(t2,o2); cout << "\n\n*Opcion 2"; SetBG(t3,o3); cout << "\n\n*Opcion 3"; SetBG(15,0); }while (tec(&o1,&o2,&o3,&y,&t1,&t2,&t3)!=13); switch (y) { case 1: system("cls");cout << "Ejecutando 1"; break; case 2: system("cls");cout << "Ejecutando 2"; break; case 3: system("cls");cout << "Ejecutando 3"; break; default: break; } getch(); } //Define la función que lee las teclas usadas por el usuario. int tec(int *o1,int *o2,int *o3,int *y,int *t1,int *t2,int *t3) { int s; s=getch(); switch (s) { case char(72): *y-=1; break; case char(80): *y+=1; break; case char(13): return 13; break; default: break; } switch (*y) { case 1: *o1=14;*o2=0;*o3=0; *t1=0;*t2=15;*t3=15; break; case 2: *o1=0;*o2=14;*o3=0; *t1=15;*t2=0;*t3=15; break; case 3: *o1=0;*o2=0;*o3=14; *t1=15;*t2=15;*t3=0; break; default: break; } if (*y==0) *y+=1; if (*y>opmax) *y=*y-1; } void SetBG(int ForgC, int BackC) { WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); }
|
|
« Última modificación: 5 Abril 2015, 20:58 pm por Gunhack »
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
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.hAhí un ejemplo de una clase en C++, sin usar windows.h.
|
|
|
En línea
|
|
|
|
Gunhack
Desconectado
Mensajes: 42
|
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++
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
¿Qué tal algo así? #include <iostream> #include <set> #include <vector> #include <conio.h> #include <windows.h> class MenuItem { public: MenuItem( char tecla, const std::string& texto, unsigned char backColor, unsigned char foreColor ) : _tecla( tecla ), _texto( texto ), _backColor( backColor ), _foreColor( foreColor ) { } ~MenuItem( ) { } char Tecla( ) const { return _tecla; } std::string Texto( ) const { return _texto; } unsigned char BackColor( ) const { return _backColor; } unsigned char ForeColor( ) const { return _foreColor; } private: char _tecla; std::string _texto; unsigned char _backColor; unsigned char _foreColor; }; void SetBG(unsigned char ForgC, unsigned char BackC); void menu(); char mostrarMenu( const std::vector< MenuItem >& items ); main () { while (1) { menu(); } } //Define la función de menú void menu() { std::vector< MenuItem > items; items.push_back( MenuItem( '1', "Opción 1", 14, 0 ) ); items.push_back( MenuItem( '2', "Opción 2", 0, 5 ) ); items.push_back( MenuItem( 'a', "Opción 3", 4, 7 ) ); char opcion = mostrarMenu( items ); switch( opcion ) { case '1': system( "cls" ); std::cout << "Ejecutando 1" << std::endl; break; case '2': system( "cls" ); std::cout << "Ejecutando 2" << std::endl; break; case 'a': system( "cls" ); std::cout << "Ejecutando 'a'" << std::endl; break; default: break; } getch( ); } char mostrarMenu( const std::vector< MenuItem >& items ) { char to_return; std::set< char > validAnswer; do { system( "cls" ); std::cout << " MENU" << std::endl << "===================" << std::endl; for( auto& item : items ) { SetBG( item.ForeColor( ), item.BackColor( ) ); std::cout << " " << item.Tecla( ) << ". " << item.Texto( ) << std::endl; validAnswer.insert( item.Tecla( ) ); } SetBG(15,0); std::cin >> to_return; } while( validAnswer.count( to_return ) == 0 ); return to_return; } void SetBG(unsigned char ForgC, unsigned char BackC) { WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); }
Se podría conseguir un código más claro si se "mapeasen" los colores: enum Color : unsigned char { Black, DarkBlue, DrakGreen, DarkAqua, DarkRed, DarkPurple, DarkYellow, Silver, Gray, Blue, Green, Aqua, Red, Purple, Yellow, White }; // ... class MenuItem { public: MenuItem( char tecla, const std::string& texto, Color backColor, Color foreColor ); Color BackColor( ) const; Color ForeColor( ) const; private: Color _backColor; Color _foreColor; }; // ... items.push_back( MenuItem( '1', "Opción 1", Black, Red ) ); items.push_back( MenuItem( '2', "Opción 2", Black, Blue ) ); items.push_back( MenuItem( 'a', "Opción 3", Silver, Purple ) );
|
|
« Última modificación: 6 Abril 2015, 12:27 pm por eferion »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda menu en flash mx dinamico
Diseño Gráfico
|
juanfatchivo
|
2
|
2,150
|
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,791
|
8 Noviembre 2007, 18:58 pm
por ivan05f
|
|
|
Menu dinámico PHP
PHP
|
Gogeto
|
2
|
4,276
|
23 Julio 2011, 07:00 am
por Gogeto
|
|
|
[Batch] Menu batch dinamico
Scripting
|
shadowhunter
|
9
|
8,215
|
3 Noviembre 2013, 09:13 am
por Almapa
|
|
|
CVV DINAMICO $$$$$
Hacking
|
hisoka20
|
1
|
1,694
|
14 Marzo 2023, 19:26 pm
por MCKSys Argentina
|
|