c# – 我如何写快速彩色输出到控制台?

我想学习是否有另一种(更快)的方式使用C#.net比使用简单的Write,BackgroundColor和ForegroundColor方法和属性输出文本到控制台应用程序窗口?我知道每个单元格都有一个背景颜色和前景色,我想缓存/缓冲区/写入比使用上述方法更快。

也许有一些帮助使用Out缓冲区,但我不知道如何编码的颜色到流,如果这是颜色数据的位置。

这是一个retrostyle基于文本的游戏,我想实现,我使用标准的颜色和ascii字符的布局游戏。

请帮忙 :)

更新:

Out和缓冲区可能不是我需要混乱。似乎有一个由控制台拥有的屏幕缓冲区。我不知道如何访问它,也许我只是运气,除非我导入一些dll。

更新:添加样本
如果你准备做一些P / Invoke的东西,这可能有帮助。

基本上如果你得到一个控制台缓冲区的句柄,那么你可以使用标准的Win32 API来操纵缓冲区,甚至构建整个缓冲区屏幕和blit它到控制台。

唯一棘手的部分是获取控制台缓冲区的句柄。我没有尝试过在.NET,但在几年过去,你可以通过使用CreateFile(你将需要P /调用这个),打开“CONOUT $”,然后你可以使用句柄的当前控制台的句柄是返回传递给其他API。

P / Invoke用于CreateFile
http://www.pinvoke.net/default.aspx/kernel32/CreateFile.html

您可以使用WriteConsoleOutput将所有字符及其属性从内存缓冲区移动到控制台缓冲区。
http://msdn.microsoft.com/en-us/library/ms687404(VS.85).aspx

你可能放在一个好的库来提供对控制台缓冲区的低级访问。

因为我试图让我的.NET再次划伤,我想我会试试我的手,看看我是否可以让它工作。下面是一个示例,它将使用所有字母A-Z填充屏幕,并运行所有的forground属性0-15。我想你会对表演印象深刻。我会老实说,我没有花太多时间审查这个代码,所以错误检查是零,可能有一个小错误在这里或那里,但它应该让你去与其余的API。

using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

namespace ConsoleApplication1
{
  class Program
  {

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern SafeFileHandle CreateFile(
        string fileName,
        [MarshalAs(UnmanagedType.U4)] uint fileAccess,
        [MarshalAs(UnmanagedType.U4)] uint fileShare,
        IntPtr securityAttributes,
        [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
        [MarshalAs(UnmanagedType.U4)] int flags,
        IntPtr template);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteConsoleOutput(
      SafeFileHandle hConsoleOutput, 
      CharInfo[] lpBuffer, 
      Coord dwBufferSize, 
      Coord dwBufferCoord, 
      ref SmallRect lpWriteRegion);

    [StructLayout(LayoutKind.Sequential)]
    public struct Coord
    {
      public short X;
      public short Y;

      public Coord(short X, short Y)
      {
        this.X = X;
        this.Y = Y;
      }
    };

    [StructLayout(LayoutKind.Explicit)]
    public struct CharUnion
    {
      [FieldOffset(0)] public char UnicodeChar;
      [FieldOffset(0)] public byte AsciiChar;
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct CharInfo
    {
      [FieldOffset(0)] public CharUnion Char;
      [FieldOffset(2)] public short Attributes;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SmallRect
    {
      public short Left;
      public short Top;
      public short Right;
      public short Bottom;
    }


    [STAThread]
    static void Main(string[] args)
    {
      SafeFileHandle h = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);

      if (!h.IsInvalid)
      {
        CharInfo[] buf = new CharInfo[80 * 25];
        SmallRect rect = new SmallRect() { Left = 0, Top = 0, Right = 80, Bottom = 25 };

        for (byte character = 65; character < 65 + 26; ++character)
        {
          for (short attribute = 0; attribute < 15; ++attribute)
          {
            for (int i = 0; i < buf.Length; ++i)
            {
              buf[i].Attributes = attribute;
              buf[i].Char.AsciiChar = character;
            }

            bool b = WriteConsoleOutput(h, buf,
              new Coord() { X = 80, Y = 25 },
              new Coord() { X = 0, Y = 0 },
              ref rect);
          }
        }
      }
      Console.ReadKey();
    }
  }
}  
http://stackoverflow.com/questions/2754518/how-can-i-write-fast-colored-output-to-console

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 我如何写快速彩色输出到控制台?