Many years ago I published on my blog a helper class for working with the Windows console that was wrapping the Windows console API. Looking back at it I realized it was a pretty naive implementation. So I decided to start a new and make something more flexible and easier to use. Hopefully, I was more successful. The result is a small C++ template library called cppconlib, available on codeplex.
cppconlib is built with C++11 features and requires Visual Studio 2012 or newer. The library is available in a single header called conmanip.h and provides a set of helper classes, functions and constants for manipulating a Windows console (using the Windows console functions). The library features the following components:
- console_context<T>: represents a context object for console operations; its main purpose is restoring console settings; typedefs for the three consoles are available (console_in_context, console_out_context and console_err_context)
- console<T>: represents a console objects providing operations such as changing the foreground and background colors, the input mode, screen buffer size, title, and others; typedefs for the three consoles are available (console_in, console_out and console_err)
- manipulating functions that can be used with cout/wcout and cin/wcin: settextcolor()/restoretextcolor(), setbgcolor()/restorebgcolor(), setcolors(), setmode()/clearmode(), setposx()/setposy()/setpos().
The library can be downloaded from here. Detailed documentation is available here.
Examples
The following example prints some text in custom colors and then reads text in a different set of colors.
#include "conmanip.h" using namespace conmanip; #include <iostream> int main() { // create a console context object, used for restoring console settings console_out_context ctxout; // create a console object console_out conout(ctxout); // change the title of the console conout.settitle("cppconlib"); // output text with colors std::cout << settextcolor(console_text_colors::light_yellow) << setbgcolor(console_bg_colors::cyan) << "This text is colored: "; // read text with colors std::string text; std::cin >> settextcolor(console_text_colors::cyan) >> setbgcolor(console_bg_colors::light_yellow) >> text; std::cout << std::endl; // restore console attributes (text and background colors) ctxout.restore(console_cleanup_options::restore_attibutes); return 0; } // -> console settings are restored here when the context object goes out of scope
The following code prints a rhomb to the console:
int main() { console_out_context ctxout; console_out conout(ctxout); conout.settitle("cppconlib"); int depth; std::cout << "Depth (1-9)? "; std::cin >> depth; int middle = conout.getsize().X/2; for(int i = 1; i <= depth; ++i) { std::cout << setposx(middle-i+1); for(int j = 1; j<=i; ++j) { std::cout << i << " "; } std::cout << "\n"; } for(int i = depth-1; i >=1; --i) { std::cout << setposx(middle-i+1); for(int j = 1; j<=i; ++j) { std::cout << i << " "; } std::cout << "\n"; } return 0; }
For more details and updates check the project at codeplex: https://cppconlib.codeplex.com.
UPDATE: A NuGet package for cppconlib is available.
Hi Marius, I use your library and had to make this one addition to hide the cursor while running. Might I suggest including it in a future release.
Another static global function:
static void _setcursorvis(HANDLE const console, bool visible)
{
CONSOLE_CURSOR_INFO cur;
::GetConsoleCursorInfo(console, &cur);
cur.bVisible = false;
SetConsoleCursorInfo(console, &cur);
}
Then in the console class:
void setcursorvis(bool visible)
{
_details::_setcursorvis(context.handle, visible);
}
Usage:
console_out_context ctxout;
console_out conout(ctxout);
conout.setcursorvis(false);
Thanks for the great library.