Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Техника программирования на Turbo C
Глава 6


Автор: Ал. Стивенс

Функция display_window оперирует по-разному для стековых и слоеных окон. В любом случае она ничего не делает, если окно является видимым для пользователя. Если окно невидимо, то путем вызова функции vswap display_window замещает видеопамять буфером сохранения, если действуют слоеные окна. Для стековых окон делается проверка, не скрыто ли окно. Если окно скрыто, то оконный буфер сохранения записывается в видеопамять вызовом vrstr. Если окно не скрыто, то оно никогда не выдается, поэтому вызывается vsave для сохранения текущего содержимого видеопамяти, a clear_window и wframe вызываются для выдачи пустого окна.

Функция close_all уничтожает все окна путем прохода по списку структур WINDOW и вызова delete_window.

Функция delete_window удаляет окно из системы путем его скрытия, освобождения памяти, занятой буфером сохранения, удаления структуры WINDOW из списка и освобождения памяти, содержащей структуру WINDOW.

Функция hide_window вызывает vswap для замены буфера сохранения видеопамятью для слоеного окна и вызова vrstr для восстановления видеопамяти для стекового окна.

Функция repos_window имеется только для слоеных окон. Она вызывается одним из макросов move_window, rmove_window, rear_window и forefront. Она изменяет положение окна путем создания временного окна, помещая временное окно в список в соответствии с информацией, полученной из макроса, записывая оригинальное содержимое окна в буфер сохранения временного окна, выдавая временное окно и скрывая оригинал.

Crear_window записывает пробелы в область данных окна, а wframe и dtitle изображают окно с заголовком наверху. Эти функции используют функцию displ для записи значений в окно.

Функция wprintf является примером нового предполагаемого стандарта ANSI для функций с переменным числом параметров. В прошлом большинство компиляторов обрабатывали printf на ассемблере для просмотра переменного числа параметров из стека. Предполагаемый стандарт использует многоточие (...) в списке параметров функции для указания присутствия переменного числа параметров с различными типами данных. Специальный тип массива va_list используется для объявления списка, а va_start устанавливает начало и конец списка. Функция vsprintf является версией sprintf, которая допускает параметр va_list. В данном случае параметры, передаваемые в wprintf, перерабатываются vsprintf в строку с именем dlin. Затем строка выдается в окно по одному символу за раз путем вызова wputchar. Если у вас получится вызов wprintf, который образует строку более 100 символов, придется увеличить длину массива dlin.

Функция wputchar выдает символ в окно в текущей позиции курсора. Расположение оконного курсора является функцией двух элементов структуры WINDOW, которые указываются макросами WCURS (столбец) и SCROLL (строка). Функция реагирует на символы новой строки (\n) и табуляции (\t) следующим образом. Для новой строки, если переменная SCROLL соответствует низу окна, содержимое окна проворачивается вверх на одну строку; иначе значение переменной SCROLL увеличивается. В любом случае переменная WCURS устанавливается на столбец 0. Если в wputchar послан символ табуляции, переменная WCURS продвигается к следующей позиции табуляции в окне. Остальные символы отображаются в окне, а переменная WCURS возрастает. Строки, длина которых превышает ширину окна, не переносятся; они обрезаются.

Функция wcursor устанавливает переменные WCURS и SCROLL на координаты, заданные при вызове. Она также устанавливает видеокурсор на экранную позицию, соответствующую оконному курсору.

Функция get_selection создает блок курсора в окне и позволяет пользователю перемещать блок вверх и вниз, а также производить выбор нажатием клавиши <Ввод>. Макроопределение SELECT ссылается на переменную в структуре WINDOW и используется для перемещения блока курсора в окне. Функции accent и deaccent используются для включения и выключения блока курсора путем изменения видеоатрибута строки на ACCENT и NORMAL. При нажатии верхней и нижней клавиш со стрелками функция изменяет значение переменной SELECT. При вызове можно также передать адрес массива символов, содержащего список клавиш, используемых для выбора из окна. Если пользователь нажимает одну из этих клавиш, производится соответствующий выбор так же, как если бы блок курсора находился в соответствующей строке и была нажата клавиша <Ввод>.

Функция scroll проворачивает порцию текста в окне вверх или вниз на одну строку. Если окно является последним и видимым, функция прокрутки ROM-BIOS применяется для ускорения по сравнению с программной прокруткой. Функция ROM-BIOS не применяется, если окно имеет только одну строку текста из-за ошибки в IBM PC и некоторых моделях АТ. Эта ошибка вызывает появление неверных видеорезультатов при попытке провернуть единственную строку. Ошибка была устранена IBM в АТ BIOS, но в некоторых моделях она осталась. Если окно не является последним или если оно имеет одну строку текста, текстовая область проворачивается программно с помощью функций dget и displ для чтения и записи символов текста из окна и в окно.

Функция waddr оперирует только со слоеными окнами. Она возвращает целочисленный адрес позиции в окне, где расположены символ и атрибут. Если окно не видимо, функция возвращает адрес в буфере сохранения, вычисленный по координатам x и y. Если окно видимо, сканируется список для поиска окон, более поздних, чем адресуемое окно. Если более позднее окно закрывает позицию адресуемого символа, возвращается адрес, соответствующий сохраненному адресу этого окна. Если ни одно более позднее окно не закрывает позицию символа, возвращается указатель NULL для сообщения в точку вызова об использовании видеопамяти.

Функция displ и функция dget вызываются для выдачи и приема видеосимвола и атрибута в и из слоеного окна. Эти функции вызывают waddr для проверки необходимости чтения или записи в область сохранения. Если нет, адресуется видеопамять.

Функция wsvap меняет местами содержимое буфера сохранения слоеного окна и видеопамяти или, возможно, буферов сохранения более поздних окон, которые закрывают адресуемое окно. Эта функция использует displ и dget для выполнения изменения.

Функции vsave и vrstr работают со стековыми окнами. Vsave копирует содержимое видеопамяти в буфер сохранения, а vrstr копирует буфер сохранения в видеопамять.

Функция acline вызывается макросами accent и deaccent для изменения выбранной строки окна на цветовую конфигурацию ACCENT или NORMAL.

Функция add_list добавляет структуру WINDOW в конец списка.

Функция beg_list добавляет структуру WINDOW в начало списка.

Функция remove_list удаляет структуру WINDOW из списка.

Функция iusert_list вставляет структуру WINDOW в список после другой заданной структуры WINDOW.

Функция verify_wnd ищет в списке заданный адрес структуры WINDOW. Она возвращает истину или ложь в зависимости от наличия или отсутствия структуры WINDOW в списке. Если заданный указатель WINDOW равен NULL, функция возвращает адрес последней структуры WINDOW в списке.

Функция error_message создает окно для выдачи специального сообщения об ошибке. Сообщение записывается в окно вызовом wprintf, и включается звуковой сигнал.

Функция clear_message очищает последнее сообщение об ошибке.

Примеры окон

Далее рассматриваются возможности оконной библиотеки. Приводятся примеры программ, каждая из которых иллюстрирует рассматриваемые возможности. Примеры состоят из небольшой управляющей программы с главной функцией, которая вызывает функцию примера для демонстрируемой возможности. Функция примера содержит вызовы ранее рассмотренных библиотечных функций и служит иллюстрацией их использования. Каждый пример программы включает проектный (.prj) файл, используемый Турбо Си для построения выполняемой программы.

Затем эти же самые примеры функций будут объединены в один выполняемый модуль, который демонстрирует оконные меню. Поэтому они написаны без собственных main-функций.

Перемещение окна

При использовании слоеных окон вам доступны функции, позволяющие перемещать окно в абсолютную или относительную позицию на экране. Заметим, что эти функции - move_window и rmove _window - недоступны для стековых окон.

Программа, иллюстрирующая перемещение окна, приведена на листингах 6.3, 6.4 и 6.5. Листинг 6.3 является маленькой управляющей программой, а листинг 6.5 представляет проектный make -файл. Обращайтесь к листингу 6.4, testmove.c, при чтении данного описания.

Для запуска примера введите следующую команду:
c>move

(В этом и последующих примерах предполагается, что С является вашим системным дисководом. Не вводите подсказку с>.).

Помимо иллюстрации движения окна, testmove.c показывает также процесс создания окон, установку их цветов, выдачу на экран и запись текста в них. Программа создает три окна, присваивает каждому из них собственные цвета, выдает их и записывает цитату во второе из трех окон. Этот пример иллюстрирует возможность записи текста в окно, которое частично закрыто другим окном.

Теперь программа ожидает нажатия клавиши. Программа специально ждет нажатия одной из клавиш управления курсором или

клавиши <Ключ>. Каждое нажатие клавиши со стрелкой вызывает перемещение окна на одну символьную позицию в направлении стрелки. Функция rmove_window используется для перемещения окна. Обратите внимание на то, как центральное окно перемещается между двумя остальными.

Когда вы нажимаете клавишу <Ключ>, открытое первым окно уничтожается. Еще одно нажатие вызывает уничтожение верхнего окна. Заключительное нажатие уничтожает среднее окно с цитатой и завершает программу.

Перемещение окна иллюстрирует использование оконных буферов сохранения, запрограммированное в библиотеке. Поскольку требуется определенная обработка для анализа каждого буфера при записи символа в окно, работа функций усложняется по мере увеличения размера окон и их количества. При перемещении большого слоеного окна на старых медленных моделях ПЭВМ это можно наблюдать визуально.

Листинг 6.3: move.c

/* move.c */

void testmove(void);

main()
{
testmove();
}

Листинг 6.4: testmove.c

/* testmove.c */

#include "twindow.h "
#include "keys.h"

void testmove()
{
WINDOW *wndA, *wndB, *wndC;
int c;

wndA = establish_window(5, 5, 9, 19);
wndB = establish_window(10, 3, 9, 23);
wndC = establish_window(13, 8, 9, 12);
set_colors(wndA, ALL, RED, YELLOW, BRIGHT);
set_colors(wndB, ALL, AQUA, YELLOW, BRIGHT);
set_colors(wndC, ALL, WHITE, YELLOW, BRIGHT);
display_window(wndA);
displey_window(wndB);
display_window(wndC);
wprintf(wndB, "\n I wouldn't care who");
wprintf(wndB, "\n wrote the laws if I");
wprintf(wndB, "\n could write the");
wprintf(wndB, "\n ballads.");
wprintf(wndB, "\n\n Thomas Jefferson");
do {
int x = 0, y = 0;
c = get_char();
switch (c) {
case FWD: x++;
break;
case BS: --x;
break;
case UP: --y;
break;
case DN: y++;
default: break;
}
if (x || y)
rmove_window(wndB, x, y);
} while (c != ESC);

- 9 -
delete_window(wndA);
get_char();
delete_window(wndC);
get_char();
delete_window(wndB);
}

Листинг 6.5: move.prj

move
testmove (twindow.h, keys.h)
twindow (twindow.h, keys.h)
ibmpc.obj

Подъем и опускание окон

С помощью функций forefront и rear_window вы можете поднять окно в последнюю позицию, помещая его поверх всех остальных, а также опустить окно в первую позицию, помещая его под всеми остальными. Эта возможность применима в программах с несколькими окнами, где пользователь выбирает одно из них для некоторой цели путем временного перевода остальных на фон. Эта возможность полезна в любых приложениях, в которых пользователь часто переходит от окна к окну.

Программа, иллюстрирующая подъемы и опускания окон, приведена в листингах 6.6, 6.7 и 6.8. Листинг 6.6 является маленькой управляющей программой, а листинг 6.8 - проектным make- файлом. Обращайтесь к листингу 6.7, promote.c, при чтении данных разъяснений.

Для запуска примера введите следующую команду:

c>prom

Программа promote.c использует те же образцы трех окон, что и программа testmove.c. Теперь все три окна включают записанный в них текст, каждый из которых содержит имя окна: window A, window B и window C.

Для подъема и опускания окон используется клавиатура. Используйте нажатия клавиш с маленькими буквами а, b и с для подъема окон, названных этими буквами. Используйте клавиши с большими буквами для их опускания. Этот процесс продолжается до тех пор, пока вы не нажмете клавишу <Ключ> для уничтожения одного из окон. Еще два нажатия вызовут уничтожение остальных двух окон, и программа завершится.

Листинг 6.6: prom.c

/* prom.c */

void promote(void);

main()
{
promote();
}

Листинг 6.7: promote.c

/* promote.c */

#include "twindow.h"
#include "keys.h"

void promote()
{
WINDOW *wndA, *wndB, *wndC;
int c;
wndA = establish_window(5, 5, 9, 19);
wndB = establish_window(10, 3, 9, 20);
wndC = establish_window(13, 8, 9, 12);
set_colors(wndA, ALL, RED, YELLOW, BRIGHT);
set_colors(wndB, ALL, AQUA, YELLOW, BRIGHT);
set_colors(wndC, ALL, WHITE, YELLOW, BRIGHT);
display_window(wndA);
display_window(wndB);
display_window(wndC);
wprintf(wndA, "\n\n Window A");
wprintf(wndB, "\n\n Window B");
wprintf(wndC, "\n\n Window C");
do {
c = get_char();
switch (c) {
case 'a': forefront(wndA);
break;
case 'b': forefront(wndB);
break;
case 'c': forefront(wndC);
break;
case 'A': rear_window(wndA);
break;
case 'B': rear_window(wndB);
break;
case 'C': rear_window(wndC);
break;
default: break;
}
} while (c != ESC);
delete_window(wndA);
get_char();
delete_window(wndC);
get_char();
delete_window(wndB);
}

Листинг 6.8: prom.prj

prom
promote (twindow.h, keys.h)
twindow (twindow.h, keys.h)
ibmpc.obj

Назначение заголовков и изменение цветов окна

Когда окно создано, вы можете назначить ему заголовок, а также установить цвета переднего плана и фона.

Программа, иллюстрирующая заголовки и цвета окон, приведена в листингах 6.9, 6.10 и 6.11. Листинг 6.9 является маленькой управляющей программой, а листинг 6.11 - проектным make-файлом. Обращайтесь к листингу 6.10, ccolor.c, при чтении данных разъяснений.

Для запуска примера вводите следующую команду

c>color

Снова выдается три окна. Каждое из них имеет свой цвет (если у вас цветной монитор), но ни у одного из них нет заголовка. Окна расположены в тех же местах и имеют те же размеры, что и в предыдущих примерах. Программа ожидает нажатия клавиши с одной из букв: r, g или b. Она будет использовать эти буквы для изменения заголовка среднего окна на "RED", "GREEN" или "BLUE", а также изменит цвет среднего окна на соответствующий новому заголовку.

Нажмите клавишу <Ключ> для выхода и уничтожения окна, а также любые две другие клавиши для уничтожения двух остальных окон и завершения программы.

Листинг 6.9: color.c

/* color.c */

void ccolor(void);

main()
{
ccolor();
}

Листинг 6.10: сcolor.c

/* ccolor.c */

#include "twindow.h"
#include "keys.h"

void ccolor()
{
WINDOW *wndA, *wndB, *wndC;
int c;

wndA = establish_window(8, 8, 9, 19);
wndB = establish_window(13, 6, 9, 20);
wndC = establish_window(16, 11, 9, 12);
set_colors(wndA, ALL, RED, YELLOW, BRIGHT);
set_colors(wndB, ALL, AQUA, YELLOW, BRIGHT);
set_colors(wndC, ALL, WHITE, YELLOW, BRIGHT);
display_window(wndA);
display_window(wndB);
display_window(wndC);
do {
c = get_char();
switch (c) {
case 'r':
set_title(wndB, " RED ");
set_colors(wndB, ALL, RED, WHITE, BRIGHT);
break;
case 'b':
set_title(wndB, " BLUE ");
set_colors(wndB, ALL, BLUE, WHITE, BRIGHT);
break;
case 'g':
set_title(wndB, " GREEN ");
set_colors(wndB, ALL, GREEN, WHITE, BRIGHT);
break;
default:
break;
}
} while (c != ESC);
delete_window(wndA);
get_char();
delete_window(wndC);
get_char();
delete_window(wndB);
}

Листинг 6.11: color.prj

color
ccolor (twindow.h, keys.h)
twindow (twindow.h, keys.h)
ibmpc.obj

Сравнение стековых и слоеных окон

Рассматриваемая здесь программа дает возможность сравнить представления стековых и слоеных окон. Вы можете откомпилировать ее с оконной библиотекой, которая была компилирована для обоих типов окон.

Программа, иллюстрирующая различия между стековыми и слоеными окнами, показана на листингах 6.12, 6.13 и 6.14. Листинг 6.12 является маленькой управляющей программой, а листинг 6.14 - проектным make-файлом. Обращайтесь к листингу 6.13, fast.c, при чтении данных разъяснений.

Для запуска примера введите следующую команду:

c>fast

Помните, что программа сама по себе не показывает сравнение. Вам необходимо построить две версии ее, одну - со стековой оконной библиотекой, а вторую - со слоеной оконной библиотекой, и сравнить представления обеих программ.

После запуска программы она создаст и выдаст пятнадцать окон. Когда вы нажимаете любую клавишу, программа уничтожает каждое окно в обратном порядке. Вы можете сравнить соответствующие скорости работы программ, компилированных в двух средах.

Листинг 6.12: fast.c

/* fast.c */

void fasttest(void);

main()
{
fasttest();
}

Листинг 6.13: fasttest.c

/* fasttest.c */

#include <stdio.h>
#include "twindow.h"

void fasttest()
{
int row, col;

for (row = 0, col = 0; col < 15; row += 3, col++) {
establish_window(row, col, 10, 30);
set_colors(NULL, ALL, RED, YELLOW, BRIGHT);
display_window(NULL);
wprintf(NULL, "\n\n\n Hello, Dolly # %d", col);
}
get_char();
while (col--)
delete_window(NULL);
}

Листинг 6.14: fast.prj

fast
fasttest (twindow.h)
twindow (twindow.h, keys.h)
ibm.obj

Перемещение, подъем, скрытие окон, меню, изменение интенсивности

В следующем примере комбинируется несколько уже показанных возможностей и даются примеры еще двух возможностей: использование get_selection для обработки простого меню и использование set_intensity для изменения яркости переднего плана окон.

Программа, иллюстрирующая эти возможности, представлена на листингах 6.15, 6.16 и 6.17. Листинг 6.15 является маленькой управляющей программой, а листинг 6.17 - проектным make-файлом. Обращайтесь к листингу 6.16, poems.c, при чтении данных разъяснений.

Для запуска примера введите следующую команду:

c>poetry

Эта программа выдает пять различных стихотворений на экран и позволяет вам выбрать одно из них, перемещать его, поднять его на передний план, опустить его назад и уничтожить. Программа начинает работу с выдачи оконного меню, которое перечисляет все стихотворения. Вы можете переместить курсор вверх или вниз и выбрать одно стихотворение нажатием клавиши <Ввод>. Вы также можете нажать одну из цифр от 1 до 5, выбирая номер стихотворения. В результате будет показано выбранное стихотворение.

После выбора стихотворения вы можете передвинуть его клавишами со стрелками, возвращаясь к меню нажатием клавиши <Ключ> или выбирая другое стихотворение нажатием соответствующей цифровой клавиши. Выбранное текущее стихотворение выдается с повышенной яркостью, а все остальные - с обычной. Если вы выбираете стихотворение, выданное с обычной яркостью, то оно становится ярким, а остальные - обычными. Для перевода стихотворения на передний план нажмите клавишу <Плюс> (+); для посылки его на фон нажмите клавишу <Минус> (-). Для уничтожения текущего стихотворения нажмите клавишу <Удл>. Вы можете восстановить его нажатием клавиши с номером. После этого нажмите клавишу <Ключ> для возврата к меню, а затем снова клавишу <Ключ> для выхода из программы.

Листинг 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 клавиша <F1> используется в качестве функциональеной клавиши контекстно-управляемой подсказки. Когда вы нажимаете <F1>, появляется окно с подсказывающим сообщением, относящимся к тому, что вы сейчас делаете. В Главе 7 объясняется, как включается эта возможность.

Резюме

Теперь у вас имеется основа для создания оконного программного инструментария. С помощью этих функций вы можете добавить окна к своему программному обеспечению, а также отображать в них текст. Однако приложение окон может быть в дальнейшем развито до возможностей более высокого уровня, которые являются общими во многих прикладных системах. Несколько последующих глав добавляют эти возможности к вашей оконной библиотеке. Глава 7 вводит использование окон для добавления контекстно-управляемой пользовательской подсказки в ваши программы.


Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz