2008-10-13 15 views
16

¿Cuál es la mejor manera de escribir datos en la consola de texto en ubicaciones arbitrarias en la pantalla y con colores de fondo/fondo personalizados?Consola avanzada IO en .NET

Respuesta

23

Console.SetCursorPosition, Console.BackgroundColor, Console.ForegroundColor y Console.ResetColor.

Tenga en cuenta que estos se agregaron a .NET Framework en la versión 2.0. Antes de eso, necesitarías PInvoke.

6

De acuerdo con la Mono Library List hay al menos dos bibliotecas que podrían ser útiles para usted:

  • Curses# utiliza PDCurses en Windows y en Linux ncurses. Es casi una plataforma cruzada en un nivel binario.

  • MonoCurses es un enlace con licencia MIT-X11 de curses, e incluye el kit de herramientas GUI minimalista gui.cs para crear aplicaciones basadas en consola.

4

This posting muestra cómo utilizar los métodos de clase de consola para crear una barra de progreso en la consola - que podría ser un buen ejemplo para referirse a ....

2

función más eficaz es WriteConsoleOutput. Es API Win32 nativa, pero se puede utilizar en aplicación .NET usando p/invocar:

[DllImport("kernel32.dll", SetLastError = true, EntryPoint = "WriteConsoleOutputW")] 
public static extern bool WriteConsoleOutput(IntPtr hConsoleOutput, CHAR_INFO[,] lpBuffer, COORD dwBufferSize, 
               COORD dwBufferCoord, ref SMALL_RECT lpWriteRegion); 

Dónde CHAR_INFO es una estructura:

estructura
/// <summary> 
/// CharSet.Unicode is required for proper marshaling. 
/// </summary> 
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)] 
public struct CHAR_INFO 
{ 
    [FieldOffset(0)] 
    public char UnicodeChar; 
    [FieldOffset(0)] 
    public char AsciiChar; 
    [FieldOffset(2)] //2 bytes seems to work properly 
    public Attr Attributes; 

    public override string ToString() { 
     return string.Format("CHAR_INFO : '{0}' ({1})", AsciiChar, Attributes); 
    } 
} 

Attr:

/// <summary> 
/// CHAR_ATTRIBUTES native structure. 
/// </summary> 
[Flags] 
public enum Attr : ushort { 
    NO_ATTRIBUTES = 0x0000, 
    /// <summary> 
    /// Text color contains blue. 
    /// </summary> 
    FOREGROUND_BLUE = 0x0001, 
    /// <summary> 
    /// Text color contains green. 
    /// </summary> 
    FOREGROUND_GREEN = 0x0002, 
    /// <summary> 
    /// Text color contains red. 
    /// </summary> 
    FOREGROUND_RED = 0x0004, 
    /// <summary> 
    /// Text color is intensified. 
    /// </summary> 
    FOREGROUND_INTENSITY = 0x0008, 
    /// <summary> 
    /// Background color contains blue. 
    /// </summary> 
    BACKGROUND_BLUE = 0x0010, 
    /// <summary> 
    /// Background color contains green. 
    /// </summary> 
    BACKGROUND_GREEN = 0x0020, 
    /// <summary> 
    /// Background color contains red. 
    /// </summary> 
    BACKGROUND_RED = 0x0040, 
    /// <summary> 
    /// Background color is intensified. 
    /// </summary> 
    BACKGROUND_INTENSITY = 0x0080, 
    /// <summary> 
    /// Leading byte. 
    /// </summary> 
    COMMON_LVB_LEADING_BYTE = 0x0100, 
    /// <summary> 
    /// Trailing byte. 
    /// </summary> 
    COMMON_LVB_TRAILING_BYTE = 0x0200, 
    /// <summary> 
    /// Top horizontal 
    /// </summary> 
    COMMON_LVB_GRID_HORIZONTAL = 0x0400, 
    /// <summary> 
    /// Left vertical. 
    /// </summary> 
    COMMON_LVB_GRID_LVERTICAL = 0x0800, 
    /// <summary> 
    /// Right vertical. 
    /// </summary> 
    COMMON_LVB_GRID_RVERTICAL = 0x1000, 
    /// <summary> 
    /// Reverse foreground and background attribute. 
    /// </summary> 
    COMMON_LVB_REVERSE_VIDEO = 0x4000, 
    /// <summary> 
    /// Underscore. 
    /// </summary> 
    COMMON_LVB_UNDERSCORE = 0x8000 
} 

COORD y SMALL_RECT:

[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.Sequential)] 
public struct SMALL_RECT 
{ 
    public short Left; 
    public short Top; 
    public short Right; 
    public short Bottom; 

    public SMALL_RECT(short left, short top, short right, short bottom) { 
     Left = left; 
     Top = top; 
     Right = right; 
     Bottom = bottom; 
    } 
}