For pure nostalgic reasons I was looking into some old code. It is a console application, to tweak the UI (or lack of same) I wanted to provide a progress bar in the console window.
Client code for the screenshot above
using System; using TMData.Console; using System.Threading; namespace ConsoleApplication { /// <summary> /// Summary description for Class1. /// </summary> class Class1 { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { // Where in the console should the progress bar be located ConsoleCoordinate consoleCoordinate = new ConsoleCoordinate(10,2); // Instantiate the progress bar ConsoleProgressBar consoleProgressBar = new ConsoleProgressBar(StandardHandle.Output, 0, 120, 50, consoleCoordinate); int x = 0; while (x < 120) { consoleProgressBar.ShowProgressInPercent(x); x++; Thread.Sleep(100); } } } }
Helper classes and structs
using System; using System.Runtime.InteropServices; namespace TMData.Console { /// <summary> /// Summary description for ConsoleCoordinate. /// </summary> [StructLayout(LayoutKind.Sequential)] public struct ConsoleCoordinate { private short _x; private short _y; public ConsoleCoordinate(short x, short y) { _x = x; _y = y; } } }
using System; namespace TMData.Console { public enum StandardHandle { Input = -10, Output = -11, Error = -12 } }
And finally the main console progress class
using System; using System.Runtime.InteropServices; namespace TMData.Console { /// <summary> /// Summary description for ConsoleProgressBar. /// </summary> public class ConsoleProgressBar { private float minimumValue = 0; private float maximumValue = 0; private IntPtr handle; private ConsoleCoordinate consoleCoordinate; private int progressBarSize = 50; public ConsoleProgressBar(StandardHandle handle, int minimumValue, int maximumValue, int progressBarSize, ConsoleCoordinate consoleCoordinate) { this.handle = GetStdHandle((int)handle);; this.minimumValue = (float)minimumValue; this.maximumValue = (float)maximumValue; this.consoleCoordinate = consoleCoordinate; } public void ShowProgressInPercent (int currentValue) { int percentComplete = Convert.ToInt32((currentValue / maximumValue) * 100); ShowProgress(percentComplete, percentComplete, "%", "100"); } private void ShowProgress(int currentValue, int percentComplete, string unitIndicator, string maxDisplayValue) { // Calculations int incrementPercent = (int)100.0 / progressBarSize; int completeLength = Convert.ToInt32(percentComplete / incrementPercent); // Constructing the full string making up the progressbar string statusText = currentValue.ToString().PadLeft(maxDisplayValue.Length, ' ') + unitIndicator + " / " + maxDisplayValue + unitIndicator; int startPosOfStatusTextInProgressBar = (int)((float)progressBarSize / 2.0 - (int)(statusText.Length / 2.0 )); statusText = statusText.PadLeft(startPosOfStatusTextInProgressBar + statusText.Length, ' '); statusText = statusText.PadRight(progressBarSize,' '); // Preparing the completed/incomplete progressbar text string string completeText = statusText.Substring(0, completeLength); string incompleteText = statusText.Substring(completeText.Length, statusText.Length - completeText.Length); bool bResult = SetConsoleCursorPosition(handle, consoleCoordinate); // Printing to console and coloring SetConsoleTextAttribute(handle, 31); System.Console.Write(completeText); SetConsoleTextAttribute(handle, 127); System.Console.Write(incompleteText); } #region DllImports [DllImport("kernel32.dll")] public static extern IntPtr GetStdHandle(int intHandleType); [DllImport("kernel32.dll")] public static extern bool SetConsoleTextAttribute(IntPtr handle, int wAttributes); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool SetConsoleCursorPosition(IntPtr handle, ConsoleCoordinate inCoordCharacterAttributes); #endregion } }
No comments:
Post a Comment