2008-10-13 12 views

Odpowiedz

23

Console.SetCursorPosition, Console.BackgroundColor, Console.ForegroundColor i Console.ResetColor.

Uwaga: zostały one dodane do .NET Framework w wersji 2.0. Wcześniej będziesz potrzebował PInvoke.

6

Według Mono Library List istnieją co najmniej dwie biblioteki, które mogą być przydatne dla Ciebie:

  • Curses# używa PDCurses na Windows i Linux na ncurses. To prawie crossplatform na poziomie binarnym.

  • MonoCurses jest licencjonowanym wiązaniem curses MIT-X11 i zawiera minimalistyczny zestaw narzędzi GUI.cs GUI do tworzenia aplikacji konsolowych.

4

This posting pokazuje, jak użyć metod klasy Console, aby utworzyć pasek postępu na konsoli - może to być dobry przykład odnosi się do ....

2

Najbardziej skuteczna funkcja jest WriteConsoleOutput. Pochodzi Win32 API, ale mogą być używane w aplikacji .NET przy użyciu p/wywołać:

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

Gdzie CHAR_INFO jest strukturą:

/// <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 struktura:

/// <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 i 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; 
    } 
} 
Powiązane problemy