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 задает прямоугольную область экрана, в которую предназначен вывод текста с его атрибутами. Тип этого параметра описан в заголовочном файле как