Работа 13. Работа с экраном в текстовом режиме

Цель работы: изучение функций библиотеки консольного ввода и вывода данных, выработка умений алгоритмизации и программирования задач организации оконного интерфейса средствами MS DOS, отладки и тестирования программ с функциями.

/* Программа 13.1 выводит окно меню для изображения трех окон с различным цветом фона. Функциональные клавиши, клавиши управления курсором и некоторые другие клавиши и комбинации клавиш посылают в буфер клавитуры расширенные коды, которые состоят из двух символов: первый - символ с кодом 0 ('\0') и второй – байт-код расширенного кода. */

#include <stdio.h>

#include <conio.h> // библиотека функций для работы

// с экраном в текстовом режиме

void main()

{ char ch;

textbackground(BLACK); // демонстрация окон на черном фоне

gotoxy(20, 24); // курсор в позицию экрана х=20, y=24

cprintf("В окна можно вводить символы с клавиатуры.");

gotoxy(20, 25); // следующая строка:

cprintf("Выход из программы: кл _F4 или кл_Esc");

clrscr();

window(1, 1, 15, 11); // окно меню в верхнем левом углу экрана

textbackground(LIGHTGRAY); // цвет фона окна меню

textcolor(YELLOW); // установка цвета символов для всех окон

clrscr(); // установка заданных выше атрибутов окна меню

// Вывод надписей пунктов меню в окне меню:

gotoxy(2, 3); сprintf(" F1 - окно_1");

gotoxy(2, 5); сprintf(" F2 - окно_2");

gotoxy(2, 7); сprintf(" F3 - окно_3");

gotoxy(2, 9); сprintf(" F4 - выход");

_setcursortype(_NOCURSOR); // убрать курсор из окна меню

do

{ ch = getch();

if (ch == '\0') // ..., то код расширенный

{ ch = getch(); // и считывается второй символ расширенного кода

switch (int(ch)) // В этот блок попадаем при нажатии

// одной из четырёх клавиш: F1,F2,F3 или F4 !

{

case 59: // F1 – изображение окна_1:

{ window(22, 1, 32, 10); textbackground(BLUE);

_setcursortype(_NORMALCURSOR); // Установить курсор

clrscr(); break; }

case 60: // F2 - изображение окна _2:

{ window(34, 1, 44, 15); textbackground(RED);

clrscr(); break; }

case 61: // F3 - изображение окна _3:

{ window(46, 1, 56, 20); textbackground(GREEN);

clrscr(); break; }

case 62: exit(0); // Выход из программы

}// конец switch

} // конец if в части < then >

else putch(ch); // вывод символов в выбранное окно

}

while ( int(ch) != 27 ); // код клавиши Esc

}

/* Программа 13.2 демонстрирует функции библиотеки conio:

clrscr() gotoxy() textcolor()

cputs() insline() textmode()

delline() kbhit() wherex()

getch() putch() wherey()

gettextinfo() textbackground() window()

Функции программы:

1. initialize():

· устанавливается видеорежим С4350: фонт 8х8 ( 43/50 строк для EGA/VGA );

· устанавливаются размеры экрана (last_col и last_row) для вывода окон, последняя строка на экране сохраняется для сообщения;

· инициализируется генератор случайного числа ( randomize() ).

2. makewindow() - создание окна со случайными размерами.

3. randomtext() - генерирование случайной последовательности символов, кроме управляющих символов, и вывод в активное окно.

 

3. main():

· вызов функции initialize( );

· цикл обработки нажатия клавиш до нажатия кл_Esc:

· символы выводятся в текущем окне, окна автоматически переносят текст на другую строку и прокручивают строки.

Использование специальных клавиш:

кл_Ins - вставка строки,

кл_Del - удаление строки,

кл_Enter - переход на другую строку,

<клавиши-стрелки> - позиционирование курсора в окне,

кл_Alt-R - генерация случайного текста до нажатия клавиши,

кл_Alt-W - другое окно,

кл_Esc - выход из программы.

#include <stdio.h>

#include <conio.h> // функции текстового видеорежима

#include <stdlib.h> // функция random(int num) -

// генератор случайных чисел в интервале (0, num-1)

#include <dos.h> // Включает функцию delay(ms) - задержка

// исполнения программы в миллисекундах (ms)

#include <time.h> // Для работы функций randomize() и random()

int last_col, last_row; // Глобальные

struct text_info ti; // переменные

void randomtext();

void initialize();

void makewindow();

 

 

main()

{ char ch;

int done, wx, wy;

initialize();

done = 1; // условие продолжения цикла: (done = = 1)

do

{ ch = getch();

if ( ch == '\0') // ..., то код расширенный

{ ch = getch();

switch (int(ch))

{ case 17: { makewindow(); break; } // Alt-W

case 19: { randomtext(); break; } // Alt-R

case 45: { done = 1; break; } // Alt-X

case 72: { wx=wherex(); wy=wherey()-1;

gotoxy(wx, wy); break; } // Up - вверх

case 75: { wx=wherex()-1; wy=wherey();

gotoxy(wx, wy); break; } // Left - влево

case 77: { wx=wherex()+1; wy=wherey();

gotoxy(wx, wy); break; } // Right - вправо

case 80: { wx=wherex(); wy=wherey()+1;

gotoxy(wx, wy); break; } // Down - вниз

case 82: { insline(); break; } // Ins - вставить строку

case 83: { delline(); break; } // Del - удалить строку

}

}

else // обычный код клавиши

switch (int(ch))

{ case 13: { putch('\n'); putch('\r'); break; } // Enter – переход

// на другую строку

case 27: { done = 0; break; } // Esc - выход из программы

default: { putch(ch); break; } // ввод символа в окно

}

} while ( done == 1 );

textmode(LASTMODE); // установить предыдущий режим

} // конец main()

void initialize()

{ char ch;

clrscr(); // очистка и заполнение окна установленным цветом фона

textmode(C4350); // установить видеорежим 43/50 строк для EGA/VGA

gettextinfo( &ti ); // информация о текущем окне, атрибутах текста,

// экране, видеорежиме и позиции курсора

last_col = ti.winright; // ширина окна (число столбцов символов)

last_row = ti.winbottom; // высота окна (число строк символов)

gotoxy(1,last_row); // переход на первую позицию строки сообщения

textbackground(BLACK); // цвет фона строки сообщения - черный,

textcolor(WHITE); // цвет текста - белый

// вывод строки сообщения:

cputs(" Ins-InsLine Del-DelLine "); // вывод строки "..."

ch = char(27); putch(ch); // стрелка влево

ch = char(24); putch(ch); // стрелка вверх

ch = char(25); putch(ch); // стрелка вниз

ch = char(26); putch(ch); // стрелка вправо

cputs(" - cursor ");

cputs("Alt-W-Window Alt-R-Random Esc-Exit");

last_row--; // уменьшаем размер экрана до строки сообщения

randomize(); // инициализация генератора случайного числа

} // конец initialize()

void makewindow()

{ int x, y, width, height, xw, yh, col;

width = random(last_col-2)+2; // ширина окна,

height = random(last_row-2)+2; // высота окна - случайные

x = random(last_col-width)+1; // x, y - координаты верхней

y = random(last_row-height)+1; // левой точки окна

xw = x+width; yh = y+height;

window(x, y, xw, yh); // создание окна

col = random(8);

textbackground(col); // случайный фон окна

col= random(7)+9;

textcolor(col); // случайный цвет символов

clrscr();

} // конец makewindow()

void randomtext()

{ char ch;

do

{ ch = char(random(224)+32);

// случайный символ, кроме управляющих ( код < 32 )

putch(ch); delay(20); // вывод символов с паузой 20 ms

} while ( !kbhit() ); // ..., пока не нажата клавиша

}

/* Программа 13.3. Демонстрирует использование меню «курсорная планка».

Пункты меню:

"Ввод ch" – построение окна и ввод символов только до первой цифры, функция win1();

"Справка" – сообщение о работе программы по пункту меню "Ввод ch", функция win2();

"ВЫХОД" – команда выхода из программы, функция win3(). */

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

void win1(); // Построение окна и ввод символов только до первой цифры

void win2(); // Сообщение о работе программы по пункту меню "Ввод ch"

void win3(); // Восстановление атрибутов экрана и выход из программы

void win_menu(COLORS Col, int k); // Построение окна k -го пункта

// меню, Col – цвет фона окна

void main()

{ int k=1,f=0; char ch;

clrscr(); // Построение меню с курсорной планкой:

_setcursortype(_NOCURSOR);

textcolor(YELLOW);

win_menu(LIGHTGRAY, 1);

win_menu(BLUE, 2);

win_menu(BLUE, 3);

do { // Работа с меню и окнами

ch=getch();

if(ch=='\0') // Перемещение по меню

{ win_menu(BLUE,k);

ch=getch();

switch(ch)

{ case 77: { k++; if(k>3) k=1; break; }

case 75: { k--; if(k<1) k=3; break; }

}

win_menu(LIGHTGRAY, k);

}

if(ch==13) // Выбор пункта меню по нажатию кл_Enter

switch(k)

{ case 1: { win1(); break; }

case 2: { win2(); break; }

case 3: win3(); // Команда меню ВЫХОД

ch = 27;

}

} while( ch != 27 ); // выход из программы – кл_Esc

// Восстановление атрибутов экрана, если выход из программы по кл_Esc
// из меню, но не по команде ВЫХОД:

_setcursortype(_NORMALCURSOR);

textattr(0x7);

window(1, 1, 80, 25);

clrscr();

} // конец main()

void win_menu(COLORS Col, int k)

{ textbackground(Col);

window((k-1)*10+1, 1, k*10, 1); clrscr();

if(k==1) cprintf(" Ввод ch");

if(k==2) cprintf(" Справка");

if(k==3) cprintf(" ВЫХОД");

} конец win_menu()

void win1()

{ int f=1; char ch;

textbackground(3);

window(10,3,50,12);

clrscr();

cprintf("\n Введите текст: \n\r");

while(ch!=27)

{ ch=getch();

if(f)

cprintf("%c", ch);

if(ch>='0' && ch<='9') f=0;

}

} // конец win1()

void win2()

{ char ch;

textbackground(2);

window(10,14,70,25);

clrscr();

cprintf(" О к н о с п р а в к и");

cprintf("\n\r Введите текст в окно 1");

cprintf("\n\r Текст будет вводиться только до первой цифры");

cprintf("\n\r Ввод текста возможен при повторных входах в окно 1");

cprintf("\n\r Спасибо за тестирование программы!");

cprintf("\n\r Нажмите кл_Esc для возврата в меню");

ch=getch();

while(ch!=27)

} // конец win2()

void win3()

{ char ch;

_setcursortype(_NORMALCURSOR);

textattr(0x7);

window(1, 1, 80, 25); clrscr();

}

Вопросы и упражнения

1. На какие группы делятся клавиши и комбинации клавиш по коду, посылаемому в буфер клавиатуры?

2. Поясните расширенный код, поступающий в буфер клавиатуры. Примеры использования таких кодов.

3. Составьте функцию, которая заполняет строку на экране заданным цветом фона в течение 5 секунд.