находятся в исходном файле thelp.c, представленном ниже в
листинге 7.2.
void load_help(char *filename)
Вызовите эту функцию для загрузки файла подсказки или
перехода к другому файлу подсказки. Функция открывает файл
подсказки и анализирует в нем сообщения подсказки, строя таблицу
идентификаторов окон подсказки, их размеров и расположений в
файле подсказки.
void set_help(char *helpname, int x, int y)
Эта функция задает текущее окно подсказки с восьмисимвольным
массивом, соответствующим наименованию окна в файле подсказки.
Наименование окружается в файле подсказки угловыми скобками,
причем не включает в себя эти скобки. Целые числа х и y задают
координаты верхнего левого угла (в символьных позициях) окна
подсказки, что позволяет пользователям использовать одно и то же
окно в различных контекстах, но в различных листах экрана.
Изменение функциональной клавиши подсказки
-----------------------------------------------------------------
Если вам нужно задать значение функциональной клавиши,
отличной от (по умолчанию), вы должны изменить значение
глобальной целочисленной переменной helpkey. Эта переменная
объявлена в ibmpc.c в Главе 4. Вы можете включить исходный файл
keys.h (см. Главу 4) в вашу программу и использовать одно из
определенных в этом файле значений клавиш. Следующий фрагмент
изменяет функциональную клавишу подсказки на .
#include "keys.h"
extern int helpkey;
helpkey = F2;
Изменение функции подсказки
-----------------------------------------------------------------
Файл с именем ibmpc.c в Главе 4 включает указатель на
функцию с именем helpfunc. Обычно этот указатель содержит
значение NULL. Когда используются функции подсказки, указатель
инициализируется адресом функции с именем help. Если вам нужно
использовать другую функцию, скажем, вместо стандартной функции
help, вы можете изменить значение указателя helpfunc. Для
применения функциональной клавиши подсказки для вызова вашей
функции используйте следующие операторы:
extern void (*helpfunc)();
void yourfunc();
helpfunc = yourfunc;
Вы можете вернуться к указанию helpfunc на стандартную
функцию подсказки с помощью следующих операторов:
extern void (*helpfunc)();
extern void help();
helpfunc = help;
Выключение подсказки
-----------------------------------------------------------------
Имеются три пути для выключения подсказки: вы можете
установить значение функциональной клавиши подсказки равным 0;
можно установить указатель функции подсказки равным NULL; можно
вызвать set_help, передавая указатель на строку нулевой длины.
Для включения подсказки необходимо отменить выбранное действие.
Исходный листинг: thelp.c
-----------------------------------------------------------------
Теперь перейдем к листингу 7.2 thelp.c. Этот файл является
исходным текстом функций, поддерживающих контекстно-управляемые
окна подсказки.
Листинг 7.2: thelp.c
/*---------------------thelp.c------------------*/
#include
#include
#include
#include "twindow.h"
#include "keys.h"
#define MAXHELPS 25
#define HBG WHITE
#define HFG BLACK
#define HINT DIM
#define TRUE 1
#define FALSE 0
static struct helps {
char hname [9];
int h, w;
long hptr;
} hps [MAXHELPS+1];
static int hp = 0;
static int ch = 0;
static int hx, hy;
FILE *helpfp = NULL;
long ftell();
char *fgets();
void help();
char helpname[64];
void getline(char *lineh);
/*--------------загружает файл определения HELP!-------------*/
void load_help(char *hn)
{
extern void (*helpfunc)();
extern int helpkey;
char lineh [80];
if (strcmp(helpname, hn) == 0)
return;
helpfunc = help;
helpkey = F1;
hp = 0;
strcpy(helpname, hn);
if ((helpfp = fopen(helpname, "r")) == NULL)
return;
getline(lineh);
while (1) {
if (hp == MAXHELPS)
break;
if (strncmp(lineh, "", 5) == 0)
break;
if (*lineh != '<')
continue;
hps[hp].h = 3;
hps[hp].w =18;
strncpy(hps[hp].hname, lineh+1, 8);
hps[hp].hptr = ftell(helpfp);
getline(lineh);
while (*lineh != '<') {
hps[hp].h++;
hps[hp].w = max(hps[hp].w, strlen(lineh)+2);
getline(lineh);
}
hp++;
}
}
/*--------получает строку текста из файла подсказки---------*/
static void getline(char *lineh)
{
if (fgets(lineh, 80, helpfp) == NULL)
strcpy(lineh, "");
}
/*-----устанавливает текущий активный экран подсказки--------*/
void set_help(char *s, int x, int y)
{
for (ch = 0; ch < hp; ch++)
if (strncmp(s, hps[ch].hname, 8) == 0)
break;
hx = x;
hy = y;
}
/*-------------выдает текущее окно подсказки-----------------*/
void help()
{
char ln [80];
int i, xx, yy;
WINDOW *wnd;
extern int helpkey;
if (hp && ch != hp) {
curr_cursor(&xx, &yy);
cursor(0, 25);
wnd = establish_window(hx, hy, hps[ch].h, hps[ch].w);
set_colors(wnd, ALL, HBG, HFG, HINT);
display_window(wnd);
fseek(helpfp, hps[ch].hptr, 0);
for (i = 0; i < hps[ch].h-3; i++) {
getline(ln);
wprintf(wnd, ln);
}
wprintf(wnd, "[Help] to return");
while (get_char() != helpkey)
putchar(BELL);
delete_window(wnd);
cursor(xx, yy);
}
}
Описание программы: thelp.c
-----------------------------------------------------------------
Программа thelp.c содержит четыре имени #define,
устанавливающих глобальные параметры системы подсказки. MAXHELPS
получает значение максимального количества окон подсказки,
которое программа может поддерживать одновременно. HBG, HFG и
HINT являются цветами фона, переднего плана и яркостью окон
подсказки.
Структура helps описывает окно подсказки. Она содержит
мнемоническое имя окна, его высоту и ширину, а также символьное
смещение описания окна в текстовом файле, включающем окна
подсказки. Массив hps структур helps содержит один элемент для
каждого окна в текстовом файле и строится функцией load_help.
Функция load_help читает текстовый файл подсказки, заданный при
вызове, и строит массив hps. Она распознает угловую скобку,
идентифицирующую каждое имя окна, копируя имя и символьное
смещение в файле в структуру. Затем она читает текст окна для
определения длины и ширины окна. Длина яляется функцией
количества строк текста, а ширина является функцией размера самой
длинной строки текста окна.
Функция set_help просматривает массив для поиска окна с
именем, заданным при вызове. Целочисленная переменная ch, которая
используется для индексации в массиве при поиске, будет содержать
индекс текущего окна при нажатии функциональной клавиши
подсказки. Переменные hx и hy получают значения при вызове. Эта
процедура устанавливает позицию окна.
Функция help вызывается функцией get_char из ibmpc.c при
нажатии заданной функциональной клавиши подсказки. Функция help
сохраняет текущую позицию курсора и убирает курсор с экрана.
Создается окно подсказки с координатами и размерами, записанными
в элементе массива с индексом ch. Текущая символьная позиция в
текстовом файле перемещается к месту, указанному в элементе
массива. Каждая строка текста читается из файла и записывается в
окно. Дописывается последняя строка, сообщающая пользователю о
необходимости повторного нажатия клавиши подсказки для очистки
окна подсказки и возврата. Программа ожидает нажатия клавиши
подсказки, уничтожает окно и восстанавливает курсор на экране в
прежнем положении.
Пример контекстно-управляемой подсказки
-----------------------------------------------------------------
Программы на листингах 7.3, 7.4 и 7.5 представляют пример
использования программного обеспечения подсказки. Листинг 7.3,
sayings.c, содержит главную функцию, вызывающую функцию примера,
maxims.c, показанную в листинге 7.4. Листинг 7.5 является
проектным make-файлом, используемым Турбо Си для построения этого
примера.
Для запуска программы вводите следующую команду:
c>sayings
Программа sayings.c загружает файл teprogs.hlp с помощью
вызова load_help и вызывает функцию с именем maxims. Такая
последовательность была выбрана для того, чтобы maxims.c могла
быть встроена в последующие программы, предусматривающие примеры
обработки меню и резидентных в памяти утилит. Maxims.c
показывает, как использовать set_help и get_char в ваших
программах. Используется только одно окно подсказки. Maxims.c
открывает окно и ожидает нажатия клавиши. Если вы нажимаете 1, 2
или 3, в окне показывается одна из трех старых пословиц. На
рисунке 7.3 изображено окно с одной из таких выданных пословиц.
Если вы нажмете <Ключ>, программа завершится. Если будет нажата
, выдается окно подсказки, как показано на рисунке 7.4.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ¦
¦ C> ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ЪДДДДДДДДДДДДДДДДPress F1 for helpДДДДДДДДДДДДДДДД¬ ¦
¦ ¦ A rolling stone gathers no moss ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 7.3. Выданная пословица
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ C> ¦
¦ ¦
¦ ЪДДДДДДДДДДДДДДДДPress F1 for helpДДДДДДДДВДДДДДДДДДДДДДДДДДД¬¦
¦ ¦ A rolling stone gathers no moss ¦Press 1, 2 or 3 ¦¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґfor a pithy maxim.¦¦
¦ ¦[Help] to return ¦¦
¦ АДДДДДДДДДДДДДДДДДДЩ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 7.4. Подсказка для пословиц
Листинг 7.3: sayings.c
/*--------------sayings.c--------------*/
#include "twindow.h"
void maxims(void);
main()
{
load_help("tcprogs.hlp");
maxims();
}
Листинг 7.4: maxims.c
/*--------------------maxims.c-----------------*/
#include "twindow.h"
#include "keys.h"
void maxims()
{
int c;
WINDOW *wnd;
set_help("maxims ", 50, 10);