Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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





Поделиться с друзьями:


Дата добавления: 2015-10-01; Мы поможем в написании ваших работ!; просмотров: 529 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Вы никогда не пересечете океан, если не наберетесь мужества потерять берег из виду. © Христофор Колумб
==> читать все изречения...

2358 - | 2156 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.008 с.