Typedef struct CONSOLE_SCREEN_BUFFER_INFO
{COORD dwSize;
COORD dwCursorPosition;
WORD wAttributes;
SMALL_RECT srWindow;
COORD dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
Нас в этой структуре интересует поле dwCursorPosition , которое и предоставляет данные о положении курсора. Функция GetConsoleScreenBufferInfo имеет прототип
BOOL GetConsoleScreenBufferInfo(HANDLE hConsOut, CONSOLE_SCREEN_BUFFER_INFO* lpConsoleScreenBufferInfo);
Следующий пример демонстрирует управление курсором экрана консоли
#include <windows.h>
#include <wincon.h>
#include <stdio.h>
void main()
{char text1[]="Text for example\t";
DWORD actlen;
HANDLE hstdout;
CONSOLE_SCREEN_BUFFER_INFO consinfo;
COORD coorpos;
hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
if(hstdout==INVALID_HANDLE_VALUE)ExitProcess(0);
GetConsoleScreenBufferInfo(hstdout,&consinfo);
coorpos.Y=(short)(consinfo.dwCursorPosition.Y+5);
coorpos.X=(short)(consinfo.dwCursorPosition.X+25);
SetConsoleCursorPosition(hstdout,coorpos);
WriteConsole(hstdout,text1,sizeof(text1),&actlen,NULL);
getchar();
CloseHandle(hstdout);
ExitProcess(0);
}
Для многократного вывода одного символа предназначена функция FillConsoleOutputCharacterA, а для многократного вывода одного и того же атрибута – функция FillConsoleOutputAttribute. Эти функции имеют следующие прототипы
BOOL FillConsoleOutputCharacterA(HANDLE hConsOut, CHAR character, WORD len, COORD pos, DWORD* actlen);
BOOL FillConsoleOutputAttribute(HANDLE hConsOut, WORD attr, WORD len,
COORD pos, DWORD* actlen);
Первые аргументы этих функций задают хэндл экрана консоли, вторые, соответственно, выводимый символ или выводимый атрибут, параметр len задает число повторений вывода этого символа или атрибута, а параметр actlen задает адрес для возврата числа действительно выполненных повторений. Это число может отличаться от заказанного в вызове системной функции, если в процессе вывода достигнут конец экрана. Параметр pos задает позицию экрана, начиная с которой эти функции выполняют свой вывод.
Для задания атрибутов можно использовать символические константы, заданные в заголовочном файле wincon.h.
Ниже приведен пример использования рассмотренных функций
#include <windows.h>
//#include <wincon.h>
#include <stdio.h>
void main()
{HANDLE hstdout;
char ch='@';
char ch2='$';
COORD pos;
DWORD actlen;
WORD attri=0x3e;
hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
if(hstdout==INVALID_HANDLE_VALUE)
{printf("Error GetStdHandle\n");exit(-1);}
pos.X=0;pos.Y=9;
FillConsoleOutputCharacterA(hstdout,ch,400,pos,&actlen);
pos.X=2;pos.Y=14;
FillConsoleOutputAttribute(hstdout,attri,200,pos,&actlen);
pos.X=0;pos.Y=14;
FillConsoleOutputCharacterA(hstdout,ch2,300,pos,&actlen);
getchar();
CloseHandle(hstdout);
ExitProcess(0);
}
Для вывода строки текста в произвольную позицию экрана служит функция
BOOL WriteConsoleOutputCharacterA(HANDLE hConsOut, CSTR* text, DWORD len, COORD pos, DWORD* actlen);
Параметры, используемые в этой функции имеют те же назначения, что и одноименные – описанные ранее. Следующий пример иллюстрирует применения функции
#include <windows.h>
//#include <wincon.h>
#include <stdio.h>
void main()
{char text1[]="Color text for example";
COORD pos;
DWORD actlen;
HANDLE hstdout;
short attri=0x2e;
int len=sizeof(text1);
hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
if(hstdout==INVALID_HANDLE_VALUE)
{printf("Error GetStdHandle\n");exit(-1);}
pos.X=20;pos.Y=9;
FillConsoleOutputAttribute(hstdout,attri,len,pos,&actlen);
WriteConsoleOutputCharacterA(hstdout,text1,len,pos,&actlen);
getchar();
CloseHandle(hstdout);
ExitProcess(0);
}
Вывод символов вместе с атрибутами осуществляет функция
BOOL WriteConsoleOutputA(HANDLE hConsOut, CHAR_INFO* cells, COORD dwBufferSize, COORD dwBufferCoord, SMALL_RECT* rect);
По существу возможности этой функции значительно шире. Они позволяют вернуть на экран, не обязательно в то же место, запомненный ранее в памяти фрагмент текcтового изображения экрана с полным учетом цветовых атрибутов. Функция эта в качестве исходной отображаемой информации использует двумерный массив (а не одномерный, как в OS/2) ячеек, хранящих всю отображаемую информацию о символах на экране. Этот массив задается для функции адресом в параметре cells. Его элементы должны быть описаны как имеющие тип CHAR_INFO, который в заголовочном файле дается описанием
Typedef struct CHAR_INFO
Union
{WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;
Параметр dwBufferSize задает измерения этого массива: сколько в нем строк и сколько столбцов, а параметр dwBufferCoord определяет позицию в этом массиве, начиная от которой его элементы выводятся на экран как символы с их атрибутами. Последний параметр rect задает прямоугольную область экрана, в которую предназначен вывод текста с его атрибутами. Тип этого параметра описан в заголовочном файле как