Пример организации светового меню
Меню современных программ, как правило, представляет собой набор строк по которому перемещается светлый прямоугольник - световое окно. Для написания программ с подобным меню необходимо уметь выводить в нужное место экрана информацию разными цветами.
Экран IBM PC имеет 25 строк и 80 позиций. Нумерация строк и позиций начинается с 1. Первая строка находится вверху, первая позиция слева. Все необходимые функции работы с экраном IBM PC имеются в библиотеке компилятора, их прототипы находятся в файле conio.h. Рассмотрим некоторые из этих функций:
void clrscr( void ); - осуществляет стирание экрана;
void gotoxy( int x, int y ); - перемещает курсор в позицию x строки y;
void cprintf( char *format, ... ); - выполняет то же самое, что и printf, но выводит информацию, используя установленный цвет фона и цвет символа;
void textcolor( int color ); - установка цвета символа с кодом color;
void textbackground( int color ); - установка цвета фона с кодом color;
Последние функции не изменяют цвет уже выведенных символов. Их влияние распространяется на все последующие выводы с помощью функции cprintf.
При установке цвета допускается использовать шестнадцать цветов символа с кодами 0...15, и восемь цветов фона с кодами 0...7. Для удобства работы с цветами в conio.h определены мнемонические имена для цветов:
enum COLORS {
/* цвета для символов и фона */
BLACK /* черный */, BLUE /* синий */,
GREEN /* зеленый */, CYAN /* салатовый */,
RED /* красный */, MAGENTA /* малиновый */,
BROWN /* коричневый */, LIGHTGRAY /* светло-серый */,
/* цвета только для символов */
DARKGRAY /*темно-серый */, LIGHTBLUE /* ярко-синий */,
LIGHTGREEN /*ярко-зеленый*/, LIGHTCYAN /*ярко-салатовый*/,
LIGHTRED /*ярко-красный*/, LIGHTMAGENTA /*ярко-малиновый*/,
YELLOW /* желтый */, WHITE /* белый */ };
Приведенная ниже программа вычисляет функции sin(x), cos(x) и tan(x) в зависимости от выбора пользователя. Выбор осуществляется с помощью светового меню. Движение светового окна организуется путем перерисовки пункта меню другим цветом фона. Основной цикл этой программы управляет изменением переменной choice, в которой хранится текущий выбор пользователя.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include "keyboard.h"
#define N 4
#define ROW 10
#define COL 35
#define TEXT_C WHITE
#define TEXT_BG BLACK
#define CHOICE_BG LIGHTGRAY
void out_str( int num, int bg_color );
/* Организация светового меню */
void main ( void )
{
int loop; /* Флаг конца работы */
int choice; /* Текущий выбор пункта меню */
int old_choice; /* Старый выбор пункта меню */
double fun, x; /* Значения функции и аргумента */
int i;
textbackground( TEXT_BG ); textcolor( TEXT_C );
clrscr(); gotoxy( COL, ROW-1 );
cprintf( "Аргумент x=" ); scanf( "%lf", &x );
/* Начальный вывод всех пунктов меню */
i=1; while( i <= N ) { out_str( i, TEXT_BG ); i++; }
loop = 1; choice = 1; old_choice = 2;
while ( loop )
{
out_str( old_choice, TEXT_BG );
out_str( choice, CHOICE_BG );
old_choice = choice;
switch( GetCh() )
{
case kbUp :
if ( choice>1 ) choice--; else choice = N; break;
case kbDown :
if ( choice<N ) choice++; else choice = 1; break;
case kbEnter :
switch ( choice )
{
case 1 : fun=sin(x); break;
case 2 : fun=cos(x); break;
case 3 : fun=tan(x); break;
case 4 : loop=0; continue;
}
textbackground( TEXT_BG ); gotoxy( COL-5, ROW+6 );
cprintf( "Значение функции %lf\n", fun );
}
}
}
/* Функция вывода строки меню с указанным цветом фона */
void out_str( int num, int bg_color )
{
textbackground( bg_color ); gotoxy( COL, ROW+num );
switch( num )
{
case 1: cprintf( "1. sin(x) " ); break;
case 2: cprintf( "2. cos(x) " ); break;
case 3: cprintf( "3. tan(x) " ); break;
case 4: cprintf( "4. Конец работы" ); break;
}
}
На аналогичных принципах могут быть построены более сложные диалоговые программы, имеющие разнообразные вертикальные, горизонтальные, вложенные и выпадающие меню, управляемые световым окном.
Дата добавления: 2014-12-18; просмотров: 689;