Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Стивенс Ал. Весь текст 495.21 Kb

Техника программирования на турбо-С

Предыдущая страница Следующая страница
1 ... 12 13 14 15 16 17 18  19 20 21 22 23 24 25 ... 43
находятся  в  исходном  файле  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);
Предыдущая страница Следующая страница
1 ... 12 13 14 15 16 17 18  19 20 21 22 23 24 25 ... 43
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама