Manuseio de cursores em modo console C#

  • Autor Autor Meta
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
M

Meta

Alfa
Usuário com poucas negociações! Use sempre o saldo do ForoBeta!
Teniendo este ejemplo que se muestra abajo, me funciona una parte del programa, pero no todo.

LCD Volumen 01.jpg


Como puedes ver, el programa se ejecuta y si te fijas bien, hay un > en > Vol: ■■■■■■-- 6.

Si pulsas izquierda o derecha con la flecha del teclado, se mueve la barra y el número del 0 al 8, en este ejemplo se muestra el 6.

Lo que no me funciona es, que debo pulsar la tecla Enter, y el símbolo >, se muestra en > ATRÁS.

Si está el símbolo > en ATRÁS, puedes mover las flechas izquierdas y derecha y el > se muestra en ATRÁS o en INICIO.

Si estás en > ATRÁS, pulsas Enter, muestras un mensaje: ¡Mensaje ATRÁS!, si seleccionas con el > en INICIO y pulsas Enter, muestra el mensaje ¡Mensaje INICIO!, pulsas Enter y vuelves a la pantalla principal.

Estando en > ATRÁS INICIO, pulsas una de las flechas arriba o abajo, vuelve en > Vol: ■■■■■■-- 6 en e cual puedes regular otra vez el volumen.

El código que he hecho hasta el momento es este.
C#:
using System;

namespace LCD_Volumen_Consola_01
{
    internal class Program
    {
        static void Main(string[] args)
        {
           
            Console.CursorVisible = false;
           

            // Variables.
            string[] TEXTO =
            {
                "   ** VOLUMEN **    ", // Posición 0.
                " Vol: ",               // 1
                "■",                    // 2
                "-",                    // 3
                "  ATRÁS",              // 4
                "INICIO",               // 5
                ">",                    // 6
                " "                     // 7
            };

            int volumen = 6;
            const int VOLMEN_MAX = 8;

            #region Volumen.
            void Volumen()
            {
                ConsoleKey teclaVolumen;

                // Limpiar pantalla.
                Console.Clear();

                Console.SetCursorPosition(0, 3);
                Console.Write(TEXTO[4]);           //   ATRÁS

                // Este es temporal solo para ver las coordenadas de posicionar el >.
                //Console.SetCursorPosition(11, 3);
                //Console.Write(TEXTO[6]);           //   >

                Console.SetCursorPosition(13, 3);
                Console.Write(TEXTO[5]);           //   INICIO

                Console.SetCursorPosition(0, 1);
                Console.Write(TEXTO[6]);           //   >

                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.Write(TEXTO[0]);           //    ** VOLUMEN **  

                    Console.SetCursorPosition(1, 1);
                    Console.Write(TEXTO[1]);           //   Vol:


                    for (int i = 0; i < volumen; i++)
                    {
                        Console.Write(TEXTO[2]);       // ■ ASCII 254.
                    }

                    for (int j = 0; j < (VOLMEN_MAX - volumen); j++)
                    {
                        Console.Write(TEXTO[3]);       // -
                    }

                    // Mostrar el volumen en número.
                    Console.SetCursorPosition(16, 1);
                    Console.Write(volumen);

                    // Almacena el teclado pulsado en la variable teclaBrillo.
                    teclaVolumen = Console.ReadKey(true).Key;

                    // ¿Se pulsó el flecha derecha?
                    if (teclaVolumen == ConsoleKey.RightArrow)
                    {
                        // Sí. ¿Volumen es menor que VOLUMEN_MAX?
                        if (volumen < VOLMEN_MAX)
                        {
                            // Sí, incrementa 1.
                            volumen++;
                        }
                    }

                    // ¿Se pulsó flecha izquierda?
                    if (teclaVolumen == ConsoleKey.LeftArrow)
                    {
                        // Sí. ¿Volumen es mayor que cero?
                        if (volumen > 0)
                        {
                            // Sí, decremmenta 1.
                            volumen--;
                        }
                    }

                            //Console.SetCursorPosition(0, 1);
                            //Console.Write(TEXTO[7]);          //
                            //Console.SetCursorPosition(0, 3);
                            //Console.Write(TEXTO[4]);          // ATRÁS
                            //Console.SetCursorPosition(0, 3);
                            //Console.Write(TEXTO[6]);          // >

                            //Console.SetCursorPosition(0, 1);
                            //Console.Write(TEXTO[7]);          //
                            //Console.SetCursorPosition(11, 3);
                            //Console.Write(TEXTO[5]);          // INICIO
                            //Console.SetCursorPosition(11, 3);
                            //Console.Write(TEXTO[6]);          // >


                } while (teclaVolumen != ConsoleKey.Enter);
            }
            #endregion


            // Inicio.
            Volumen();
        }
    }
}

¿Alguna idea?

Se que este programa es lioso.

Gracias.
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
C#:
using System;

namespace LCD_Volumen_Consola_01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.CursorVisible = false;

            // Variables.
            string[] TEXTO =
            {
                "   ** VOLUMEN **    ", // Posición 0.
                " Vol: ",               // 1
                "■",                    // 2
                "-",                    // 3
                "  ATRÁS",              // 4
                "INICIO",               // 5
                ">",                    // 6
                " "                     // 7
            };

            int volumen = 6;
            const int VOLMEN_MAX = 8;
            int opcion = 0; // 0 = Volumen, 1 = ATRÁS, 2 = INICIO

            #region Volumen.
            void MostrarVolumen()
            {
                Console.SetCursorPosition(0, 0);
                Console.Write(TEXTO[0]);           //    ** VOLUMEN ** 

                Console.SetCursorPosition(1, 1);
                Console.Write(TEXTO[1]);           //   Vol:

                for (int i = 0; i < volumen; i++)
                {
                    Console.Write(TEXTO[2]);       // ■
                }

                for (int j = 0; j < (VOLMEN_MAX - volumen); j++)
                {
                    Console.Write(TEXTO[3]);       // -
                }

                // Mostrar el volumen en número.
                Console.SetCursorPosition(16, 1);
                Console.Write(volumen);
            }

            void MostrarMenu()
            {
                Console.SetCursorPosition(0, 3);
                Console.Write(TEXTO[4]);           //   ATRÁS

                Console.SetCursorPosition(13, 3);
                Console.Write(TEXTO[5]);           //   INICIO

                if (opcion == 0)
                {
                    Console.SetCursorPosition(0, 1);
                }
                else if (opcion == 1)
                {
                    Console.SetCursorPosition(0, 3);
                }
                else if (opcion == 2)
                {
                    Console.SetCursorPosition(11, 3);
                }
                Console.Write(TEXTO[6]);           //   >
            }

            void Volumen()
            {
                ConsoleKey teclaVolumen;

                // Limpiar pantalla.
                Console.Clear();
                MostrarMenu();

                do
                {
                    if (opcion == 0)
                    {
                        MostrarVolumen();
                    }

                    teclaVolumen = Console.ReadKey(true).Key;

                    if (opcion == 0)
                    {
                        // Controlar el volumen.
                        if (teclaVolumen == ConsoleKey.RightArrow && volumen < VOLMEN_MAX)
                        {
                            volumen++;
                        }
                        else if (teclaVolumen == ConsoleKey.LeftArrow && volumen > 0)
                        {
                            volumen--;
                        }
                        else if (teclaVolumen == ConsoleKey.UpArrow || teclaVolumen == ConsoleKey.DownArrow)
                        {
                            opcion = 1;
                        }
                    }
                    else
                    {
                        // Navegar entre ATRÁS e INICIO.
                        if (teclaVolumen == ConsoleKey.LeftArrow && opcion == 2)
                        {
                            opcion = 1;
                        }
                        else if (teclaVolumen == ConsoleKey.RightArrow && opcion == 1)
                        {
                            opcion = 2;
                        }
                        else if (teclaVolumen == ConsoleKey.UpArrow || teclaVolumen == ConsoleKey.DownArrow)
                        {
                            opcion = 0;
                        }
                    }

                    MostrarMenu();
                } while (teclaVolumen != ConsoleKey.Enter);

                // Acción al pulsar Enter.
                if (opcion == 1)
                {
                    Console.Clear();
                    Console.WriteLine("¡Mensaje ATRÁS!");
                }
                else if (opcion == 2)
                {
                    Console.Clear();
                    Console.WriteLine("¡Mensaje INICIO!");
                }
                Console.ReadLine();
            }
            #endregion

            // Inicio.
            Volumen();
        }
    }
}

Explicación de los cambios:​

  1. Navegación entre opciones (opcion):
    • Se introdujo la variable opcion para manejar la navegación entre "Volumen", "ATRÁS" e "INICIO".
    • opcion = 0 significa que el usuario está en la barra de volumen.
    • opcion = 1 significa que el usuario está en "ATRÁS".
    • opcion = 2 significa que el usuario está en "INICIO".
  2. Mostrar la selección:
    • La función MostrarMenu coloca el símbolo > según la opción seleccionada.
  3. Interacción con flechas:
    • Cuando se navega con las flechas, el programa actualiza la opción seleccionada y vuelve a mostrar el menú.
  4. Acción al pulsar Enter:
    • Si se selecciona "ATRÁS" o "INICIO" y se pulsa Enter, se muestra un mensaje correspondiente.
Esto permite que el usuario pueda moverse entre las opciones y realizar las acciones correspondientes al pulsar Enter.
 
Muy bueno, funciona.
 
Voltar
Topo