【问题标题】:split a console in two parts for two outputs将控制台分成两部分以获得两个输出
【发布时间】:2011-03-26 22:46:12
【问题描述】:

我正在创建一个控制台应用程序,我希望有两个输出和一个输入。原因是一个输出总是可见的。

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");

但是我将如何将控制台分成两部分?有可能吗?

【问题讨论】:

    标签: c# redirect console io


    【解决方案1】:

    标准 Windows 控制台不提供任何此类功能。您必须编写自己的窗口来执行此操作。

    【讨论】:

      【解决方案2】:

      如果我的理解正确,这可能会有所帮助:

      Console.WriteLine("Head");
      Console.WriteLine("Message");
      Console.ReadKey();
      Console.SetCursorPosition(0, 1);
      Console.WriteLine("Message2");
      

      【讨论】:

        【解决方案3】:

        独特的想法,但到目前为止我还没有注意到使用普通控制台应用程序有类似的东西。

        那么是什么阻止您使用表单应用程序并将程序分成两个不同的部分?

        您可能想尝试的另一种方法是输出到 2 个不同的控制台,这很可能是您不想要的。

        【讨论】:

        • 表单应用程序并不总是可行的,例如,如果您考虑 ssh/putty。 (好吧,您可以 X11 转发和填充,但有时在服务器上只提供一个提示,没有别的)
        【解决方案4】:

        如果我理解正确,您可以使用 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("> ");
        
                }
        
            }
        }
        

        我假设您不仅要使用用户输入来填充每个区域吗?如果是这样,您需要在单独的线程中设置控制台的绘图,并让该线程在需要时更新屏幕。

        【讨论】:

        • 这真是太棒了!这确实是我正在寻找的格式:) 虽然,问题是,我已经有很多使用 Console.Out 编写的代码,所以我需要以某种方式重定向输出并像这样手动输出它。需要一些修修补补:) +1 虽然
        • 效果很好!不过需要注意的一点 - 如果您正在对控制台进行大量写入,则 Console.Clear() 会导致闪烁。
        猜你喜欢
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多