初始化
This commit is contained in:
327
Z_3/FastPrinter.h
Normal file
327
Z_3/FastPrinter.h
Normal file
@@ -0,0 +1,327 @@
|
||||
/******************************************************************
|
||||
* <20><>ע<EFBFBD>⣡ *
|
||||
* <20><>ͷ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>WinAPI<50><49><EFBFBD>й<EFBFBD>Console<6C><65><EFBFBD>Ƶĵײ㺯<D7B2><E3BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
|
||||
* <20>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ʱ<EFBFBD>printf+cls<6C>߳<EFBFBD><DFB3>ܶࡣ *
|
||||
* <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>demo.cpp<70>еļ<D0B5><C4BC><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> *
|
||||
******************************************************************/
|
||||
#ifndef FAST_PRINTER_H
|
||||
#define FAST_PRINTER_H
|
||||
#include <windows.h>
|
||||
|
||||
/******************************************************************
|
||||
* TO-DO: *
|
||||
* *
|
||||
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD>ģ<DEB8><C4A3>罫<EFBFBD><E7BDAB><EFBFBD>е<EFBFBD>һЩ<D2BB><D0A9><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʵ<EFBFBD>ֵ<EFBFBD>Array *
|
||||
* <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>һЩ<D2BB><D0A9>Я<EFBFBD><D0AF><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>д<EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5> *
|
||||
* һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ġ<EFBFBD> *
|
||||
* *
|
||||
******************************************************************/
|
||||
|
||||
namespace fp_color {
|
||||
// f is the foreground color b is the background color
|
||||
// console color format: (f | b)
|
||||
const SHORT f_black = 0;
|
||||
const SHORT f_blue = 0x0001;
|
||||
const SHORT f_green = 0x0002;
|
||||
const SHORT f_aqua = 0x0003;
|
||||
const SHORT f_red = 0x0004;
|
||||
const SHORT f_purple = 0x0005;
|
||||
const SHORT f_yellow = 0x0006;
|
||||
const SHORT f_white = 0x0007;
|
||||
const SHORT f_gray = 0x0008;
|
||||
const SHORT f_l_blue = 0x0009;
|
||||
const SHORT f_l_green = 0x000A;
|
||||
const SHORT f_l_aqua = 0x000B;
|
||||
const SHORT f_l_red = 0x000C;
|
||||
const SHORT f_l_purple = 0x000D;
|
||||
const SHORT f_l_yellow = 0x000E;
|
||||
const SHORT f_l_white = 0x000F;
|
||||
|
||||
const SHORT b_black = 0;
|
||||
const SHORT b_blue = 0x0010;
|
||||
const SHORT b_green = 0x0020;
|
||||
const SHORT b_aqua = 0x0030;
|
||||
const SHORT b_red = 0x0040;
|
||||
const SHORT b_purple = 0x0050;
|
||||
const SHORT b_yellow = 0x0060;
|
||||
const SHORT b_white = 0x0070;
|
||||
const SHORT b_gray = 0x0080;
|
||||
const SHORT b_l_blue = 0x0090;
|
||||
const SHORT b_l_green = 0x00A0;
|
||||
const SHORT b_l_aqua = 0x00B0;
|
||||
const SHORT b_l_red = 0x00C0;
|
||||
const SHORT b_l_purple = 0x00D0;
|
||||
const SHORT b_l_yellow = 0x00E0;
|
||||
const SHORT b_l_white = 0x00F0;
|
||||
}
|
||||
|
||||
class FastPrinter {
|
||||
public:
|
||||
FastPrinter(DWORD, DWORD);
|
||||
FastPrinter(DWORD, DWORD, WORD);
|
||||
~FastPrinter();
|
||||
|
||||
void setData(const char*, const WORD*);
|
||||
void setData(const char*, const WORD*, SMALL_RECT);
|
||||
void setRect(SMALL_RECT, const char, const WORD);
|
||||
void fillRect(SMALL_RECT, const char, const WORD);
|
||||
void setText(COORD, const char*, const WORD, const WORD);
|
||||
void setText(COORD, const char*, const WORD);
|
||||
void setText(COORD, const char*);
|
||||
|
||||
void cleanSrceen();
|
||||
void draw(bool);
|
||||
private:
|
||||
HANDLE hOutput, hOutBuf, hTmpBuf;
|
||||
COORD coordBufSize;
|
||||
COORD coordBufCoord;
|
||||
DWORD bytes = 0;
|
||||
DWORD sizeX, sizeY;
|
||||
|
||||
char* dataGrid;
|
||||
WORD* colorGrid;
|
||||
CHAR_INFO* outputGrid;
|
||||
SMALL_RECT srctWriteRect;
|
||||
|
||||
void initDrawer();
|
||||
void _setFontSize(const WORD);
|
||||
void _destroy();
|
||||
|
||||
void _swapBuf();
|
||||
void _draw();
|
||||
void _drawC();
|
||||
};
|
||||
|
||||
FastPrinter::FastPrinter(DWORD x, DWORD y) :sizeX(x), sizeY(y) {
|
||||
initDrawer();
|
||||
}
|
||||
|
||||
FastPrinter::FastPrinter(DWORD x, DWORD y, WORD fontSize) : sizeX(x), sizeY(y) {
|
||||
// init with font size
|
||||
_setFontSize(fontSize);
|
||||
initDrawer();
|
||||
}
|
||||
|
||||
FastPrinter::~FastPrinter() {
|
||||
_destroy();
|
||||
}
|
||||
|
||||
void FastPrinter::setData(const char* _in_data, const WORD* _in_color) {
|
||||
// copy the data to inner buffer
|
||||
memcpy(dataGrid, _in_data, sizeX * sizeY);
|
||||
memcpy(colorGrid, _in_color, sizeX * sizeY * sizeof(WORD));
|
||||
}
|
||||
|
||||
void FastPrinter::setData(const char* _in_data, const WORD* _in_color, SMALL_RECT _area) {
|
||||
// copy the data to the specified area
|
||||
SHORT row = (_area.Right - _area.Left);
|
||||
for (WORD _i = _area.Top, i = 0; _i < _area.Bottom; _i++, i++) {
|
||||
memcpy(dataGrid + (_i * sizeX + _area.Left), _in_data + (i * row), row);
|
||||
memcpy(colorGrid + (_i * sizeX + _area.Left), _in_color + (i * row), row * sizeof(WORD));
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::setRect(SMALL_RECT _area, const char _val, const WORD _color) {
|
||||
// draw a hollow rectangle
|
||||
for (WORD i = _area.Left; i < _area.Right; i++) {
|
||||
dataGrid[_area.Top * sizeX + i] = _val;
|
||||
dataGrid[(_area.Bottom - 1) * sizeX + i] = _val;
|
||||
|
||||
colorGrid[_area.Top * sizeX + i] = _color;
|
||||
colorGrid[(_area.Bottom - 1) * sizeX + i] = _color;
|
||||
}
|
||||
|
||||
for (WORD i = _area.Top; i < _area.Bottom; i++) {
|
||||
dataGrid[i * sizeX + _area.Left] = _val;
|
||||
dataGrid[i * sizeX + _area.Right - 1] = _val;
|
||||
|
||||
colorGrid[i * sizeX + _area.Left] = _color;
|
||||
colorGrid[i * sizeX + _area.Right - 1] = _color;
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::fillRect(SMALL_RECT _area, const char _val, const WORD _color) {
|
||||
// draw a solid rectangle
|
||||
SHORT row = (_area.Right - _area.Left);
|
||||
for (WORD _i = _area.Top, i = 0; _i < _area.Bottom; _i++, i++) {
|
||||
memset(dataGrid + (_i * sizeX + _area.Left), _val, row);
|
||||
for (WORD _j = _area.Left; _j < _area.Right; _j++) {
|
||||
colorGrid[_i * sizeX + _j] = _color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::setText(COORD _pos, const char* _val, const WORD _color, const WORD len) {
|
||||
// print text with position and color
|
||||
// Note: try not to set text with '\n'
|
||||
memcpy(dataGrid + (_pos.Y * sizeX + _pos.X), _val, len);
|
||||
for (WORD i = _pos.X; i < _pos.X + len; i++) {
|
||||
colorGrid[_pos.Y * sizeX + i] = _color;
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::setText(COORD _pos, const char* _val, const WORD _color) {
|
||||
// print text with position and color but no len
|
||||
WORD len = (WORD)strlen(_val);
|
||||
memcpy(dataGrid + (_pos.Y * sizeX + _pos.X), _val, len);
|
||||
for (WORD i = _pos.X; i < _pos.X + len; i++) {
|
||||
colorGrid[_pos.Y * sizeX + i] = _color;
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::setText(COORD _pos, const char* _val) {
|
||||
// print text with position but no len
|
||||
WORD len = (WORD)strlen(_val);
|
||||
memcpy(dataGrid + (_pos.Y * sizeX + _pos.X), _val, len);
|
||||
for (WORD i = _pos.X; i < _pos.X + len; i++) {
|
||||
colorGrid[_pos.Y * sizeX + i] = fp_color::f_l_white;
|
||||
}
|
||||
}
|
||||
|
||||
void FastPrinter::_setFontSize(const WORD x) {
|
||||
CONSOLE_FONT_INFOEX cfi;
|
||||
cfi.cbSize = sizeof(cfi);
|
||||
GetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
|
||||
cfi.dwFontSize.X = 0;
|
||||
cfi.dwFontSize.Y = x;
|
||||
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
|
||||
}
|
||||
|
||||
|
||||
void FastPrinter::cleanSrceen() {
|
||||
memset(dataGrid, 0, sizeX * sizeY);
|
||||
memset(colorGrid, 0, sizeX * sizeY * sizeof(WORD));
|
||||
memset(outputGrid, 0, sizeX * sizeY * sizeof(CHAR_INFO));
|
||||
}
|
||||
|
||||
void FastPrinter::draw(bool withColor) {
|
||||
// flush the whole screen
|
||||
if (withColor)_drawC();
|
||||
else _draw();
|
||||
_swapBuf();
|
||||
}
|
||||
|
||||
void FastPrinter::initDrawer() {
|
||||
// init the data buffer
|
||||
dataGrid = new char[sizeX * sizeY];
|
||||
memset(dataGrid, 0, sizeX * sizeY);
|
||||
|
||||
colorGrid = new WORD[sizeX * sizeY];
|
||||
memset(colorGrid, 0, sizeX * sizeY * sizeof(WORD));
|
||||
|
||||
outputGrid = new CHAR_INFO[sizeX * sizeY];
|
||||
memset(outputGrid, 0, sizeX * sizeY * sizeof(CHAR_INFO));
|
||||
|
||||
// set the draw area
|
||||
srctWriteRect.Top = 0;
|
||||
srctWriteRect.Left = 0;
|
||||
srctWriteRect.Bottom = (SHORT)(sizeY - 1);
|
||||
srctWriteRect.Right = (SHORT)(sizeX - 1);
|
||||
|
||||
// get font size
|
||||
CONSOLE_FONT_INFOEX cfi;
|
||||
cfi.cbSize = sizeof(cfi);
|
||||
GetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
|
||||
|
||||
// load the external WinAPI Module
|
||||
typedef HWND(WINAPI *PROCGETCONSOLEWINDOW)();
|
||||
PROCGETCONSOLEWINDOW GetConsoleWindow;
|
||||
HMODULE hKernel32 = GetModuleHandleA("kernel32");
|
||||
GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32, "GetConsoleWindow");
|
||||
|
||||
// get console window handle and move the window to the upper left
|
||||
HWND hwnd = GetConsoleWindow();
|
||||
SetWindowPos(hwnd, HWND_TOP, 0, 0, cfi.dwFontSize.X * sizeX, cfi.dwFontSize.Y * sizeY, 0);
|
||||
|
||||
// resize the window
|
||||
char cmd_buffer[32] = "mode con: cols=0000 lines=0000";
|
||||
cmd_buffer[15] = '0' + (sizeX / 1000 % 10);
|
||||
cmd_buffer[16] = '0' + (sizeX / 100 % 10);
|
||||
cmd_buffer[17] = '0' + (sizeX / 10 % 10);
|
||||
cmd_buffer[18] = '0' + sizeX % 10;
|
||||
|
||||
cmd_buffer[26] = '0' + (sizeY / 1000 % 10);
|
||||
cmd_buffer[27] = '0' + (sizeY / 100 % 10);
|
||||
cmd_buffer[28] = '0' + (sizeY / 10 % 10);
|
||||
cmd_buffer[29] = '0' + sizeY % 10;
|
||||
|
||||
system(cmd_buffer);
|
||||
|
||||
// create output buffer
|
||||
hOutBuf = CreateConsoleScreenBuffer(
|
||||
GENERIC_WRITE | GENERIC_READ,
|
||||
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||||
NULL,
|
||||
CONSOLE_TEXTMODE_BUFFER,
|
||||
NULL
|
||||
);
|
||||
|
||||
hOutput = CreateConsoleScreenBuffer(
|
||||
GENERIC_WRITE | GENERIC_READ,
|
||||
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||||
NULL,
|
||||
CONSOLE_TEXTMODE_BUFFER,
|
||||
NULL
|
||||
);
|
||||
|
||||
// invisible the cursor
|
||||
CONSOLE_CURSOR_INFO cci;
|
||||
cci.bVisible = 0;
|
||||
cci.dwSize = 1;
|
||||
SetConsoleCursorInfo(hOutput, &cci);
|
||||
SetConsoleCursorInfo(hOutBuf, &cci);
|
||||
}
|
||||
|
||||
void FastPrinter::_destroy() {
|
||||
// clean up memory
|
||||
delete[] dataGrid;
|
||||
delete[] colorGrid;
|
||||
delete[] outputGrid;
|
||||
|
||||
CloseHandle(hOutBuf);
|
||||
CloseHandle(hOutput);
|
||||
}
|
||||
|
||||
void FastPrinter::_swapBuf() {
|
||||
// core function: display after the data has been set
|
||||
hTmpBuf = hOutBuf;
|
||||
hOutBuf = hOutput;
|
||||
hOutput = hTmpBuf;
|
||||
}
|
||||
|
||||
void FastPrinter::_draw() {
|
||||
for (DWORD i = 0; i < sizeY; i++) {
|
||||
// draw every line
|
||||
coordBufCoord.Y = (SHORT)i;
|
||||
WriteConsoleOutputCharacterA(hOutput, dataGrid + (i * sizeX), sizeX, coordBufCoord, &bytes);
|
||||
}
|
||||
SetConsoleActiveScreenBuffer(hOutput);
|
||||
}
|
||||
|
||||
void FastPrinter::_drawC() {
|
||||
for (DWORD i = 0; i < sizeY; i++) {
|
||||
for (DWORD j = 0; j < sizeX; j++) {
|
||||
// copy info to CHAR_INFO struct
|
||||
// this will draw with color
|
||||
outputGrid[i * sizeX + j].Attributes = colorGrid[i * sizeX + j];
|
||||
outputGrid[i * sizeX + j].Char.AsciiChar = dataGrid[i * sizeX + j];
|
||||
}
|
||||
}
|
||||
|
||||
coordBufCoord.X = 0;
|
||||
coordBufCoord.Y = 0;
|
||||
coordBufSize.X = (SHORT)(sizeX);
|
||||
coordBufSize.Y = (SHORT)(sizeY);
|
||||
|
||||
WriteConsoleOutputA(
|
||||
hOutput, // screen buffer to write to
|
||||
outputGrid, // buffer to copy from
|
||||
coordBufSize, // col-row size of chiBuffer
|
||||
coordBufCoord, // top left src cell in chiBuffer
|
||||
&srctWriteRect); // dest. screen buffer rectangle
|
||||
SetConsoleActiveScreenBuffer(hOutput);
|
||||
}
|
||||
/******************************************************************
|
||||
* TO-DO END *
|
||||
******************************************************************/
|
||||
#endif
|
||||
Reference in New Issue
Block a user