reverse_video.
void close_all()
----------------
Эта функция уничтожает все образованные окна.
void move_windom(WINDOW *wnd, int x, int y)
-------------------------------------------
Эта функция перемещает окно таким образом, что его верхний
левый угол устанавливается в символьных координатах, заданных x и
у. Эта функция может быть использована только для слоеных окон.
void rmove_window(WINDOW *wnd, int x, int y)
--------------------------------------------
Эта функция перемещает окно путем добавления к значениям x и
y текущих координат левого верхнего угла окна. Используйте эту
функцию только для слоеных окон.
void forefront(WINDOW *wnd)
---------------------------
Эта функция перемещает окно в самое переднее положение
относительно других окон. Окно, если оно видимо, отображается
поверх остальных. Используйте эту функцию только для слоеных
окон.
void rear_window(WINDOW *wnd)
-----------------------------
Эта функция перемещает окно в самое заднее положение
относительно других окон. Окно, если оно видимо, отображается под
всеми остальными. Используйте эту функцию только для слоеных
окон.
int get_selection(WINDOW *wnd, int sel, char *keys)
---------------------------------------------------
Эта функция позволяет использовать окно в качестве меню. Вы
должны создать окно и записать в него несколько строк текста,
скажем, функцией wprintf. Вы можете использовать set_colors для
установки значений цветов ACCENT в окне (по умолчанию - черные
буквы на белом фоне). Затем вы вызываете get_selection. Функция
использует окно в качестве меню, каждая строка которого
представляет альтернативу выбора. Альтернативы подсвечиваются
цветом ACCENT. Целочисленное значение sel используется для
первоначального размещения яркого блока курсора меню на одной из
альтернатив. Значение 1 соответствует первой альтернативе, 2 -
второй и т.д.
Пользователь может перемещать блок меню вверх и вниз
клавишами управления курсором и производить выбор в меню клавишей
<Ввод>. Клавиша <Ключ> применяется для выхода из этого процесса.
Cсылка keys указывает на строку значений клавиш, которые
могут использоваться для выбора из меню. Некоторые системы меню
разрешают пользователю применять нажатия клавиш наряду с
перемещением блока курсора. Для выключения этой возможности
передайте параметру keys ссылку NULL.
Эта функция возвращает целочисленное значение, равное номеру
выбранной в меню альтернативы. Значение обычно равняется единице
и более, однако, если пользователь нажимает клавишу <Ключ>,
функция возвращает нуль. Функция будет также возвращать значения
FWD или BS, если пользователь нажимает клавиши управления
курсором вправо или влево. Эти значения определены в keys.h.
void error_message(char *s)
---------------------------
Эта функция выдает сообщение об ошибке, указываемое ссылкой
s, и включает звуковой сигнал. Сообщение отображается в
окне в нижнем правом квадранте экрана. Сообщение остается на
экране после завершения функции.
void clear_message()
--------------------
Эта функция удаляет сообщение об ошибке, если оно было
выдано функцией error_message.
Листинги оконных функций
-----------------------------------------------------------------
Данные листинги содержат исходные файлы функций поддержки
окна. Приводятся два листинга: twindow.h и twindow.c. Каждый
листинг сопровождается описанием его содержания.
Исходный листинг: twindow.h
---------------------------
Листинг 6.1, twindow.h, определяет оконные структуры и
содержит прототипы для функций. Вы должны включать их в любую
исходную программу, которая использует оконные функции.
Листинг 6.1: twindow.h
/* twindow.h */
/* Выделите это определение из комментария для стековых окон,
* но не для слоеных окон.
*
* #define FASTWINDOWS
*
*/
/* window colors */
#define RED 4
#define GREEN 2
#define BLUE 1
#define WHITE (RED+GREEN+BLUE)
#define YELLOW (RED+GREEN)
#define AQUA (GREEN+BLUE)
#define MAGENTA (RED+BLUE)
#define BLACK 0
#define BRIGHT 8
#define DIM 0
#define BORDER 0
#define TITLE 1
#define ACCENT 2
#define NORMAL 3
#define ALL 4
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define OK 0
/* оконные управляющие структуры */
typedef struct field { /* описание поля ввода данных */
char *fmask; /* маска поля ввода данных */
int fprot; /* защита поля */
char *fbuff; /* буфер поля */
int ftype; /* тип поля */
int from; /* строка поля */
int fcol; /* столбец поля */
void (*fhelp)(); /* функция подсказки поля */
char *fhwin; /* функция подсказки окна */
int flx, fly; /* расположение подсказки окна */
int (*fvalid)(); /* функция заполнения поля */
struct field *fnxt; /* следующее поле выдачи */
struct field *fprv; /* предыдущее поле выдачи */
} FIELD;
typedef struct _wnd {
int _wv; /* истина, если окно видимо */
int _hd; /* истина, если окно скрыто */
char *_ws; /* указывает на блок сохранения окна */
char *_tl; /* указывает на заголовок окна */
int _wx; /* nv x координата */
int _wy; /* nv y координата */
int _ww; /* ширина окна */
int _wh; /* высота окна */
int _wsp; /* указатель прокрутки */
int _sp; /* указатель выбора */
int _cr; /* позиция х курсора */
int btype; /* тип рамки */
int wcolor[4]; /* цвета окна */
int _pn; /* предыдущий нормальный цвет */
struct _wnd *_nx; /* указывает на следующее окно */
struct _wnd *_pv; /* указывает на предыдущее окно */
FIELD *_fh; /* указывает на 1-е поле ввода данных */
FIELD *_ft; /* указывает на последнее поле ввода данных */
} WINDOW;
typedef struct w_menu {
char *mname;
char **mselcs;
void (**func)();
} MENU;
#define SAV (wnd->_ws)
#define WTITLE (wnd->_tl)
#define COL (wnd->_wx)
#define ROW (wnd->_wy)
#define WIDTH (wnd->_ww)
#define HEIGHT (wnd->_wh)
#define SCROLL (wnd->_wsp)
#define SELECT (wnd->_sp)
#define WCURS (wnd->_cr)
#define WBORDER (wnd->wcolor[BORDER])
#define WTITLEC (wnd->wcolor[TITLE])
#define WACCENT (wnd->wcolor[ACCENT])
#define WNORMAL (wnd->wcolor[NORMAL])
#define PNORMAL (wnd->_pn)
#define BTYPE (wnd->btype)
#define NEXT (wnd->_nx)
#define PREV (wnd->_pv)
#define WCOLOR (wnd->wcolor)
#define VISIBLE (wnd->_wv)
#define HIDDEN (wnd->_hd)
#define FHEAD (wnd->_fh)
#define FTAIL (wnd->_ft)
#define NW (wcs[wnd->btype].nw)
#define NE (wcs[wnd->btype].ne)
#define SE (wcs[wnd->btype].se)
#define SW (wcs[wnd->btype].sw)
#define SIDE (wcs[wnd->btype].side)
#define LINE (wcs[wnd->btype].line)
/* ПРОТОТИПЫ ФУНКЦИЙ И МАКРОСЫ */
/* общецелевые функции и макросы */
void clear_screen(void);
int vmode(void);
void cursor(int, int);
void curr_cursor(int *, int *);
int cursor_type(void);
void set_cursor_type(int);
int get_char(void);
int scroll_lock(void);
void vpoke(unsigned, unsigned, unsigned);
int vpeek(unsigned, unsigned);
/* оконные функции и макросы */
WINDOW *establish_window(int, int, int, int);
void set_border(WINDOW *, int);
void set_colors(WINDOW *, int, int, int, int);
void set_intensity(WINDOW *, int);
void set_title(WINDOW *, char *);
void display_window(WINDOW *);
void delete_window(WINDOW *);
void clear_window(WINDOW *);
void hide_window(WINDOW *);
void wprintf(WINDOW *, char *, ...);
void wputchar(WINDOW *, int);
void close_all(void);
void wcursor(WINDOW *, int x, int y);
void error_message(char *);
void clear_message(void);
int get_selection(WINDOW *, int, char *);
#define reverse_video(wnd) wnd->wcolor[3]=wnd->wcolor[2]
#define normal_video(wnd) wnd->wcolor[3]=wnd->_pn
#define rmove_window(wnd,x,y) repos_wnd(wnd, x, y, 0)
#define move_window(wnd,x,y) repos_wnd(wnd, COL-x, ROW-y, 0)
#define forefront(wnd) repos_wnd(wnd, 0, 0, 1)
#define rear_window(wnd) repos_wnd(wnd, 0, 0, -1)
/* внутренние для оконных процессов */
void accent(WINDOW *);
void deaccent(WINDOW *);
void scroll(WINDOW *, int);
void repos_wnd(WINDOW *, int, int, int);
void acline(WINDOW *, int);
#define accent(wnd) acline(wnd, WACCENT)
#define deaccent(wnd) acline(wnd, WNORMAL)
#define clr(bg,fg,in) ((fg)|(bg<<4)|(in))
#define vad(x,y) ((y)*160+(x)*2)
#ifdef FASTWINDOWS
#define cht(ch,at) (((ch)&255)|((at)<<8))
#define displ(w,x,y,c,a) vpoke(VSG,vad(x+COL,y+ROW),cht(c,a))
#define dget(w,x,y) vpeek(VSG,vad(x+COL,y+ROW))
#define verify_wnd(w) (*(w)=listtail)!=0
#else
void displ(WINDOW *wnd, int x, int y, int ch, int at);
#endif
/* функция редактора */
void text_editor(WINDOW *, char *, unsigned);
/* функция меню */
void menu_select(char *name, MENU *mn);
/* функция подсказки */
void load_help(char *);
void set_help(char *, int, int);
/* функция ввода данных */
void init_template(WINDOW *);
FIELD *establish_field(WINDOW *, int, int, char *, char *, int);
void clear_template(WINDOW *);
void field_tally(WINDOW *);
int data_entry(WINDOW *);
void wprompt(WINDOW *, int, int, char *);
void error_message(char *);
void clear_notice(void);
void field_window(FIELD *, char *, int, int);
#define field_protect(f,s) f->fprot=s
#define field_help(f,h) f->fhelp=h
#define field_validate(f,v) f->fvalid=v
Описание программы: twindow.h
-----------------------------------------------------------------
Глобальная переменная FASTWINDOWS определена внутри
комментария в представленной программе. Включение переменной
рассчитано на применение стековой оконной конфигурации. Без
изменений при компиляции будет принята слоеная оконная
конфигурация. Для компиляции стековой оконной системы необходимо
выделить оператор #define из комментария.
Структура FIELD используется для определения полей ввода
данных внутри области данных в окнах. Этот процесс описан в
Главе 8.
Структура WINDOW описывает окно для системы . Каждому окну
назначается одна структура этого типа.
Структура MENU используется программным обеспечением
оконных меню в Главе 10. Должен быть массив структур MENU с
одним элементом для каждого проталкиваемого вниз меню.
Список операторов #define используется для придания
операторам в twindow.c лучшей читаемости. Мнемонические имена
соответствуют элементам структуры WINDOW, указанной ссылкой
wnd. Все функции в twindow.c используют имя этой ссылки по
соглашению.
twindow.h содержит прототипы для всех оконных функций,
которые будут вызываться прикладными программами.
Исходный листинг: twindow.c.
----------------------------
Листинг 6.2 - это twindow.c. Он содержит все описанные
ранее в этой главе функции. Вы должны откомпилировать его и
связывать его объектный модуль с любой программой, которая
использует окна. Поскольку он вызывает функции из ibmpc.c, его
объектный модуль должен быть также включен в редактирование
связей.
Листинг 6-2: twindow.c
/* twindow.c */
#include
#include
#include