Меню современных программ, как правило, представляет собой набор строк по которому перемещается светлый прямоугольник - световое окно. Для написания программ с подобным меню необходимо уметь выводить в нужное место экрана информацию разными цветами.
Экран 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 /* светло-серый */,
Приведенная ниже программа вычисляет функции 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++; }
На аналогичных принципах могут быть построены более сложные диалоговые программы, имеющие разнообразные вертикальные, горизонтальные, вложенные и выпадающие меню, управляемые световым окном.