Работа 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 секунд.