¦ ¦That we de¦ ¦Is like a pleas...
¦ ¦Upon the s¦The butterfly, a cabbare-white, ¦Wherein I rest ...
¦ ¦Bodily dec¦(His honest idiocy of flight) ¦The dreams that...
¦ ¦We loved e¦Will never now, it is too late, ¦
¦ ¦ ¦Master the art of flying straigh¦And still of al...
¦ ¦ ¦Yet has - who knows so well as I¦In turt so swif...
¦ АДЪД3: A MAN SAID TO THE UNIVERSEДДД¬ o fly:¦Each in its fan...
¦ ¦ ¦ by gue¦A nobler than t...
¦ ¦A man said to the universe: ¦lessnes¦
¦ ¦"Sur, I exist!" ¦ ¦And every eve I...
¦ ¦"However," replied the uviverse, ¦d gift ¦Noting my step ...
¦ ¦"The fast has not created in me ¦es ¦That I have kvo...
¦ ¦A sense of obligation." ¦ ¦In all my life ...
¦ ¦ Stephen Crane ГДДДДДДДґ Robert...
¦ ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДДД...
¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Рисунок 6.9. Стихотворения.
Листинг 6.15: poetry.c
/* poetry.c */
#include "twindow.h"
void poems(void);
main()
{
load_help("tcprogs.hlp");
poems();
}
Листинг 6.16: poems.c
/* poems.c */
#include
#include
#include
#include "twindow.h"
#include "keys.h"
/* локальные прототипы */
void get_poem(int s);
int ht (char **tb);
int wd (char **tb);
char *titles [] = {
" 1: TELL ALL THE TRUTH BUT TELL IT SLANT ",
" 2: AFTER LONG SILENSE ",
" 3: A MAN SAID TO THE UNIVERSE ",
" 4: FLYING CROOKED ",
" 5: THE IDLE LIFE I LEAD ",0 };
WINDOW *pno [] = {0, 0, 0, 0, 0};
static int x [] = {20, 15, 29, 10, 17};
static int y [] = {5,10, 13, 18, 6};
static int wcl [] [2] = { {BLUE, WHITE},
{MAGENTA, WHITE},
{RED, WHITE},
{GREEN, WHITE},
{AQUA, WHITE} };
char *poem1 [] = {
"Tell all the truth but tell it slant -",
"Success in Circuit lies",
"Too bright for our infirm Delight",
"The Truth's superb surprise",
"",
"As Lightning to the Children eased",
"With explanation kind",
"The Truth must dazzle gradually",
"Or every man be blind -",
" Emily Dickenson",0 };
char *poem2 [] = {
"Speech after long silence; it is right,",
"All other lovers being estranged or dead,",
"Unfriendly lamplight hid under its shade,",
"The curtains drawn upon unfriendly night,",
"That we descant and yet again descant",
"Upon the supreme theme of Art and Song:",
"Bodily decrepitude is wisdom; young",
"We loved each other and were ignorant.",
" William Butler Yeats",0 };
char *poem3 [] = {
"A man said to the universe:",
"\"Sir, I exist!\"",
"\"However,\" replied the universe,",
"\"The fast has not created in me",
"A sense of obligation.\"",
" Stephen Crane",0 };
char *poem4 [] = {
"The butterfly, a cabbage-white,",
"(His honest idiocy of flight)",
"Will never now, it is too late,",
"Master the art of flying straight,",
"Yet has - who knows so well as I? -",
"A just sense of how not to fly:",
"He lurches here and there by guess",
"And God and hope and hopelessness.",
"Even the aerobatic swift",
"Has not his flyihg-crooked gift.",
" Robert Graves",0 };
char *poem5 [] = {
"The idle life I lead",
"Is like a pleasant sleep,",
"Wherein I rest and heed",
"The dreams that by me sweep.",
"",
"And still of all my dreams",
"In turn so swiftly past,",
"Each in its fancy seems,",
"A nobler than the last.",
"",
"And every eve I say,",
"Noting my step in bliss,",
"That I have known no day",
"In all my life like this.",
" Robert Bridges",0 };
char **poem [] = { poem1, poem2, poem3, poem4, poem5, 0 };
void poems()
{
int s = 0, i, c;
WINDOW *mn;
char **cp;
cursor(0, 25);
mn = establish_window(0, 0, 7, 45);
set_title(mn, " Select A Poem ");
set_colors(mn, ALL, BLUE, GREEN, BRIGHT);
set_colors(mn, ACCENT, GREEN, WHITE, BRIGHT);
display_window(mn);
cp = titles;
while (*cp)
wprintf(mn, "\n%s", *cp++);
while (1) {
set_help("poemmenu", 40, 10);
s = get_selection(mn, s+1, "12345");
if (s == 0)
break;
if (s == FWD || s == BS) {
s = 0;
continue;
}
hide_window(mn);
get_poem(--s);
c = 0;
set_help("poems ", 5, 15);
while (c != ESC) {
c = get_char();
switch (c) {
case FWD: rmove_window(pno[s], 1, 0);
break;
case BS: rmove_window(pno[s], -1,0);
break;
case UP: rmove_window(pno[s], 0, -1);
break;
case DN: rmove_window(pno[s], 0, 1);
break;
case DEL: delete_window(pno[s]);
pno[s] = NULL;
break;
case '+': forefront(pno[s]);
break;
case '-': rear_window(pno[s]);
default: break;
}
if (c > '0' && c < '6')
get_poem(s = c - '1');
}
forefront(mn);
display_window(mn);
}
close_all();
for (i = 0; i < 5; i++)
pno[i] = NULL;
}
/* активизирует стихотворение по номеру */
static void get_poem(int s)
{
char **cp;
static int lastp = -1;
if (lastp != -1)
set_intensity(pno[lastp], DIM);
lastp = s;
if (pno [s])
set_intensity(pno[s], BRIGHT);
else {
pno [s] = establish_window
(x[s], y[s], ht(poem[s]), wd(poem[s]));
set_title(pno[s], titles[s]);
set_colors(pno[s],ALL,wcl[s][0],wcl[s][1], BRIGHT);
set_border(pno[s], 1);
display_window(pno[s]);
cp = poem[s];
while (*cp)
wprintf(pno[s], "\n %s", *cp++);
}
}
/* вычисляет высоту показываемой таблицы окна */
static int ht(char **tb)
{
int h = 0;
while (*(tb + h++)) ;
return h + 3;
}
/* вычисляет ширину показываемой таблицы окна */
static int wd(char **tb)
{
int w = 0;
while (*tb) {
w = max(w, strlen(*tb));
tb++;
}
return w + 4;
}
Листинг 6.17: poetry.prj
poetry
poems (twindow.h, keys.h)
thelp (twindow.h, keys.h)
twindow (twindow.h, keys.h)
ibmpc.obj
В программе poetry клавиша используется в качестве
функциональеной клавиши контекстно-управляемой подсказки. Когда
вы нажимаете , появляется окно с подсказывающим сообщением,
относящимся к тому, что вы сейчас делаете. В Главе 7 объясняется,
как включается эта возможность.
Резюме
-----------------------------------------------------------------
Теперь у вас имеется основа для создания оконного
программного инструментария. С помощью этих функций вы можете
добавить окна к своему программному обеспечению, а также
отображать в них текст. Однако приложение окон может быть в
дальнейшем развито до возможностей более высокого уровня, которые
являются общими во многих прикладных системах. Несколько
последующих глав добавляют эти возможности к вашей оконной
библиотеке. Глава 7 вводит использование окон для добавления
контекстно-управляемой пользовательской подсказки в ваши
программы.
ГЛАВА 7
-------
Контекстно-управляемые окна подсказки
-----------------------------------------------------------------
Первой проблемой, обычно возникающей при запуске новой
программы, является незнакомство программы с языком своего
пользователя. Какая клавиша должна быть нажата? Какое действие
будет следующим? Что выполняет данный элемент меню? Независимо от
того, сколько усилий вложено в разработку самообъясняемого
пользовательского языка, у пользователей всегда возникают
вопросы, поскольку язык новой системы для него всегда
иностранный. Дело не только в знакомстве пользователей с языком,
часто они даже не знают, что система может, а чего не может
делать. По традиции эта проблема решается обращением к печатным
руководствам пользователя и, возможно, автоматизированным
справочникам. Недостатком этих решений является необходимость
переключения внимания пользователя от работы с системой к чтению
руководства или запуску справочника.
Если бы экраны были достаточно большими, система могла бы
поддерживать постоянный показ руководства пользователя. Как
только пользователю потребовалась бы информация, руководство было
бы доступно. Это решение не продержалось бы долго; когда
пользователь уже знает систему, информация подсказки не нужна и
нежелательна. Значимая для новичка информация - это мусор для
ветерана.
Большинство интерактивных систем имеют общее свойство: когда
пользователю необходима информация, он смотрит на экран и гадает,
какую клавишу нажать. Представляется вполне естественным, что в
число нажатий клавиш, которые система будет распознавать в любое
время, нужно включить функциональную клавишу (Подсказка).
Нажмите требуемую прикладную клавишу, и программа выполнит ваш
запрос; нажмите функциональную клавишу подсказки, и программа
сообщит вам кое-что о том, какие клавиши она ожидает и что
случится при их нажатии.
Поскольку интерактивные системы используют экран для общения
с пользователем и показа данных, сообщение подсказки - это
материал для выталкиваемого вверх окна. Такое построение окна
позволяет получить подсказку без нарушения прикладного
использования экрана. Такое окно называется контекстно-
управляемым окном подсказки, окном, которое выскакивает для
подсказки пользователю при нажатии назначенной функциональной
клавиши подсказки. (Программная промышленность признала
стандартом для функциональной клавиши подсказки, однако многие
программные пакеты используют другие клавиши). Окно подсказки
содержит текст, который объясняет некоторую часть программы.
Когда пользователи работают с программой и переходят от
возможности к возможности, содержимое и расположение окон
подсказки изменяются для отражения текущего контекста. Эти
изменения не видны, поскольку они происходят внутри программ.
Когда пользователь нажимает функциональную клавишу подсказки,
соответствующее сообщение-подсказка выдается в выскакивающем
окне.
Поскольку сообщение-подсказка зависит от текущего положения
в программе, окно подсказки называется контекстно-управляемым.
Опытные пользователи могут игнорировать возможности подсказки
программы; новички могут нажимать функциональную клавишу
подсказки при каждом изменении состояния программы и получать
советы, напоминания или детальные инструкции.
Разработчик системы решает, как много и какого вида
подсказки система будет предусматривать для пользователя.
Некоторые системы обладают несколькими уровнями подсказки в
зависимости от опыта пользователя. Программа обработки слов Word
Star применяла эту технологию на протяжении многих лет. Уровни
подсказки изменяются от простых сообщений типа "нажмите <Ключ>