разделить консоль на две части для двух выходов - PullRequest
3 голосов
/ 08 августа 2010

Я создаю консольное приложение, в котором я хотел бы иметь два выхода и один вход. Причина в том, что один выход всегда виден.

This is the first output
Text flows upwards just like a regular console application, however...

---------
This is a second output
This is placed at the bottom of the console // also input goes here.

Я думал назвать это как-то так

 Console.Out.Writeline("This is the first output");
 Console.Out.Writeline("Text flows upwards just like a regular console application, however...");
 MyTextWriter.WriteLine("This is a second output");
 MyTextWriter.WriteLine("This is placed at the bottom of the console");

Но как мне разделить консоль на две части? Это вообще возможно?

Ответы [ 4 ]

6 голосов
/ 08 августа 2010

Если я вас правильно понимаю, вы можете использовать Console.SetCursorPosition, чтобы рисовать текст там, где вы хотите.Вот грубый пример, который разделяет консоль на две области, и при добавлении к ним текста течет вверх.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static List<string> area1 = new List<string>();
        static List<string> area2 = new List<string>();
        static int areaHeights = 0;

        static void Main(string[] args)
        {
            // Number of rows for each area
            areaHeights = (Console.WindowHeight - 2) / 2;

            drawScreen();

            int i = 0;
            while (true)
            {
                i++;

                // jumb between areas
                if (i % 2 == 0)
                    AddLineToBuffer(ref area1, Console.ReadLine());
                else
                    AddLineToBuffer(ref area2, Console.ReadLine());

                drawScreen();
            }
        }

        private static void AddLineToBuffer(ref List<string> areaBuffer, string line)
        {
            areaBuffer.Insert(0, line);

            if (areaBuffer.Count == areaHeights)
            {
                areaBuffer.RemoveAt(areaHeights - 1);
            }
        }


        private static void drawScreen()
        {
            Console.Clear();

            // Draw the area divider
            for (int i = 0; i < Console.BufferWidth; i++)
            {
                Console.SetCursorPosition(i, areaHeights);
                Console.Write('=');
            }

            int currentLine = areaHeights - 1;

            for (int i = 0; i < area1.Count; i++)
            {
                Console.SetCursorPosition(0, currentLine - (i + 1));
                Console.WriteLine(area1[i]);

            }

            currentLine = (areaHeights * 2);
            for(int i = 0; i < area2.Count; i++)
            {
                Console.SetCursorPosition(0, currentLine - (i + 1));
                Console.WriteLine(area2[i]);
            }

            Console.SetCursorPosition(0, Console.WindowHeight - 1);
            Console.Write("> ");

        }

    }
}

Я предполагаю, что вы хотите заполнить каждую область не только пользовательским вводом?Если это так, вам нужно настроить чертеж консоли в отдельном потоке и позволить этому потоку обновлять экран при необходимости.

1 голос
/ 08 августа 2010

Если я вас правильно понял, это может помочь:

Console.WriteLine("Head");
Console.WriteLine("Message");
Console.ReadKey();
Console.SetCursorPosition(0, 1);
Console.WriteLine("Message2");
0 голосов
/ 08 августа 2010

Уникальная идея, но до сих пор я не заметил ничего похожего при использовании простого консольного приложения.

Так что же мешает вам использовать приложение формы и разделить программу на 2 части?

Другой способ, который вы можете попробовать, - это вывод на 2 разные консоли, которые скорее всего вам не нужны.

0 голосов
/ 08 августа 2010

Стандартная консоль Windows не предоставляет никаких функциональных возможностей такого рода.Вам придется написать свой собственный вид окна, которое делает это.

...