Manejo de cursores en modo consola C#

  • Autor Autor Meta
  • Fecha de inicio Fecha de inicio
M

Meta

Alfa
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Teniendo este ejemplo que se muestra abajo, me funciona una parte del programa, pero no todo.



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.
 
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.