public Size GetConsoleWindowSize() { Debug.Assert(Win32Console.GetConsoleScreenBufferInfo(_screenBuffer, out Win32Console.CONSOLE_SCREEN_BUFFER_INFO csbi)); return(new Size( csbi.srWindow.Right - csbi.srWindow.Left, csbi.srWindow.Bottom - csbi.srWindow.Top)); }
public void Resize(int width, int height) { _display = new ScreenBuffer(this, width, height); Backbuffer = new ScreenBuffer(this, width, height); var newBuffer = Win32Console.CreateConsoleScreenBuffer( Win32Console.GENERIC_READ | Win32Console.GENERIC_WRITE, Win32Console.FILE_SHARE_READ, IntPtr.Zero, Win32Console.CONSOLE_TEXTMODE_BUFFER, IntPtr.Zero); Win32Console.SetConsoleScreenBufferSize(newBuffer, new Win32Console.COORD((short)width, (short)height)); var cci = new Win32Console.CONSOLE_CURSOR_INFO(); cci.dwSize = 100; cci.bVisible = false; Win32Console.SetConsoleCursorInfo(newBuffer, ref cci); var cfi = new Win32Console.CONSOLE_FONT_INFOEX(); cfi.cbSize = Marshal.SizeOf(cfi); cfi.nFont = 0; cfi.dwFontSize = new Win32Console.COORD(8, 14); cfi.FaceName = "Lucida Console"; cfi.FontFamily = 0; cfi.FontWeight = 0; Debug.Assert(Win32Console.SetCurrentConsoleFontEx(newBuffer, false, ref cfi)); Debug.Assert(Win32Console.SetConsoleActiveScreenBuffer(newBuffer)); if (_screenBuffer != IntPtr.Zero) { Debug.Assert(Win32Console.CloseHandle(_screenBuffer)); } _screenBuffer = newBuffer; }
public void Commit() { for (int y = 0; y < _display.Height; y++) { for (int x = 0; x < _display.Width; x++) { var i = y * _display.Width + x; ref ScreenBufferCharacter displayChar = ref _display.Buffer[i]; ref ScreenBufferCharacter backbufferChar = ref Backbuffer.Buffer[i]; if (displayChar != backbufferChar) { displayChar = backbufferChar; var ci = new Win32Console.CHAR_INFO(); ci.Character = (byte)displayChar.Character; ci.Attributes = GetAttributesFromColors(displayChar.Foreground, displayChar.Background); if (displayChar.Underline) { ci.Attributes |= Win32Console.COMMON_LVB_UNDERSCORE; } var ci_array = new Win32Console.CHAR_INFO[1] { ci }; var rc = new Win32Console.SMALL_RECT((short)x, (short)y, (short)(x + 1), (short)(y + 1)); Debug.Assert(Win32Console.WriteConsoleOutput( _screenBuffer, ci_array, new Win32Console.COORD(1, 1), // dwBufferSize - width/height of the 2d ci_array new Win32Console.COORD(), // dwBufferCoord ref rc)); // lpWriteRegion - where to write to } }
public void Dispose() { Debug.Assert(Win32Console.SetConsoleActiveScreenBuffer(_defaultBuffer)); Debug.Assert(Win32Console.CloseHandle(_screenBuffer)); }
public ScreenBufferManager(int width, int height) { _defaultBuffer = Win32Console.GetStdHandle(Win32Console.STD_OUTPUT_HANDLE); Resize(width, height); }