Главная » Просмотр файлов » Руководство программиста в Photon

Руководство программиста в Photon (953920), страница 53

Файл №953920 Руководство программиста в Photon (Руководство программиста в Photon) 53 страницаРуководство программиста в Photon (953920) страница 532013-09-22СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 53)

Чтобы обойти эту проблему, Вы можете использовать функцию PfQueryFonts(), чтобы определить, какие шрифты доступны, и обеспечить информацию, требующуюся для построения имени основы. Эта функция запрашивает сервер шрифтов Photon'а и защищает Вас от будущих изменений. Давайте начнём с параметров функции PfQueryFonts() – а затем рассмотрим образец программного кода, в котором из данных, возвращаемых функцией, извлекается имя основы. Сама функция выглядит подобным образом:

PfQueryFonts (long symbol,

unsigned flags,

FontDetails list[],

int n );

Её аргументами являются:

symbol

Ключ поиска для Photon'овского меенджера шрифтов. Функция ищет шрифты, которые включают этот символ, и отбрасывает те, которые его не имеют. Например, символ пробела в Unicode (0x0020) доступен почти во всех шрифтах. С другой стороны, задание символа "é" (в Unicode код символа 0х00С9) существенно сужает выбор шрифтов. И конечно, задание японского символа приведёт к отбору только японских шрифтов. Список символов см. в PkKeyDef.h или в ISO/EIC 10646-1. Чтобы включить все доступные шрифты, используйте константу PHFONT_ALL_SYMBOLS.

flags

Предлагает другой способ сужения круга поиска. Возможными значениями этого параметра являются:

  • PHFONT_SCALABLE – эти шрифты используют наборы векторов для описания каждого символа, делая возможным отображение шрифта различного размера.

  • PHFONT_BITMAP – эти шрифты хранят в качестве своих символов настоящие картинки.

  • PHFONT_PROP – эти шрифты являются пропорциональными. В пропорциональных шрифтах символ, например, "w" шире, чем символ "i".

  • PHFONT_FIXED – эти шрифты делают все символы одной ширины.

  • PHFONT_ALL_FONTS [Почему-то ничего не написано, но полагаю, означает включение всех доступных шрифтов – Прим. пер.]

  • PHFONT_DONT_SHOW_LEGACY – исключаются унаследованные шрифты из более ранних версий микроGUI Photon'а. Этот флаг перекрывает флаг PHFONT_ALL_FONTS.

list[]

Массив, который Photon'овский менеджер шрифтов заполняет для Вас. Вы должны объявить структуру FontDetails, описанную ниже.

n

Число элементов, доступных в списочном массиве.

Если функция PfQueryFonts() завершилась успешно, она возвращает число доступных шрифтов, совпавших с заданным критерием отбора. В противном случае она возвращает -1.

 Если n равно 0 и list равен NULL, функция PfQueryFonts() возвращает число совпавших шрифтов, но не пытается заполнять список. Вы можете использовать эту возможность для определения количества элементов при выделении памяти под список.

Структура FontDetails

После получения списка шрифтов Вы должны проверить в нём структуру FontDetails, чтобы найти нужный Вам шрифт и определить строку для использования её в качестве имени основы. Структура FontDetails определена в <photon/Pf.h> следующим образом:

typedef struct {

FontDescription desc;

FontName stem;

short losize;

short hisize;

unsigned short flags;

} FontDetails;

Для наших целей наиболее интересны элементы desc и stem, но давайте рассмотрим их все:

desc

Имя лигатуры или полное описательное имя шрифта, такое как "Helvetica" или "Charter".

stem

Краткая форма. Она предоставляет часть имени основы, используемую вызовами API Photon'а. Например, "helv" и "char" соответствуют "Helvetica" и "Charter".

losize

Минимальный возможный размер шрифта в пунктах, скажем 4.

hisize

Наибольший возможный размер шрифта. Если и losize и hisize равны 0, то шрифт масштабируемый.

flags

Возможные значения:

  • PHFONT_INFO_FIXED – шрифт постоянной ширины

  • PHFONT_INFO_PROP – пропорциональный шрифт

  • PHFONT_INFO_PLAIN – шрифт не является ни жирным, ни курсивным

  • PHFONT_INFO_BOLD – жирный шрифт

  • PHFONT_INFO_ITALIC – курсивный шрифт

Генерирование имён шрифтов

Как описано выше, Photon'овский API требует для идентификации шрифта имя основы, но если Вы хотите быть гибким, можете использовать лигатурное имя шрифта.

Простейшим способом получения имени основы, задав лигатурное имя шрифта, желаемый размер в пунктах и стиль, является вызовом функции PfGenerateFontName(). Она создаёт в предоставляемом Вами буфере уникальное имя основы для шрифта. (Вы можете использовать этот подход, даже если Вы не используете функцию PfQueryFonts() для отыскания всех доступных шрифтов). Прототип этой функции следующий:

char * PfGenerateFontName(

char const * pkcDescription,

uint32_t kuiFlags,

uint32_t kuiSize,

char * pcBuff );

Если функция PfGenerateFontName() завершилась успешно, она возвращает указатель на буфер; в случае неудачи возвращается NULL.

Мы определили для Вас тип данных FontName для использования в буфере, переданном функции PfGenerateFontName(). Это массив размером MAX_FONT_TAG. Для успешного программирования шрифта не используйте буфер хранения идентификатора шрифта размером меньшим, чем FontName. Вот вызов функции PtAlert() – такой же, как показан выше, но на этот раз используется вызов PfGenerateFontName():

char Helvetica14[MAX_FONT_TAG];

if ( PfGenerateFontName("Helvetica", 0, 14, Helvetica14) = = NULL ) {

/* Не удалось найти шрифт! */

...

}

answer = PtAlert( base_wgt, NULL, "File Not Saved", NULL, "File has not been saved.\nSave it?",

Helvetica14, 3, btns, NULL, 1, 3, Pt_MODAL );

Теперь то, что мы рассматривали по кусочкам, просто чётко следует по пунктам, необходимым для сборки корректного имени основы для данного шрифта.

Имейте в виду следующие соображения:

  • Используйте буфер FontName для размещения в нём имени основы.

  • Поиск шрифта основан на имени лигатуры (т.е. члена desc его входа FontDetails), а не на имени основы stem.

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

Вот простая функция инициализации приложения:

/*****************************

*** Глобальные переменные ***

*****************************/

FontName GcaCharter14Bold;

int fcnAppInit( int argc, char *argv[] ) {

/* Локальные переменные */

FontDetails tsFontList [nFONTLIST_SIZE];

short sCurrFont = 0;

char caBuff[20];

/* Получение описания доступных шрифтов */

if (PfQueryFonts (PHFONT_ALL_SYMBOLS, PHFONT_ALL_FONTS,

tsFontList, nFONTLIST_SIZE) = = -1) {

perror ("PfQueryFonts() неудача: ");

return (Pt_CONTINUE);

}

/* Поиск среди них шрифта, совпадающего с нашими спецификациями */

for (sCurrFont = 0; sCurrFont < nFONTLIST_SIZE; sCurrFont++) {

if ( !strcmp (tsFontList[sCurrFont].desc, "Charter")) break; /* мы нашли его */

}

/* Переполнение проверки */

if (sCurrFont == nFONTLIST_SIZE) {

/* проверка на частичное совпадение */

for (sCurrFont = 0; sCurrFont < nFONTLIST_SIZE; sCurrFont++) {

if ( !strncmp (tsFontList[sCurrFont].desc, "Charter", strlen ("Charter")))

break; /* найдено частичное совпадение */

}

if (sCurrFont == nFONTLIST_SIZE) {

printf ("шрифта Charter нет в %d проверенных шрифтах.\n", sCurrFont);

return (Pt_CONTINUE);

}

else printf ("Используется частичное совпадение -- 'Charter'.\n");

}

/* Имеет ли он жирный вариант? */

if (!(tsFontList[sCurrFont].flags & PHFONT_INFO_BOLD)) {

printf ("Charter не доступен как жирный.\n");

return (Pt_CONTINUE);

}

/* Доступен ли 14-пунктый? */

if ( !( (tsFontList[sCurrFont].losize = = tsFontList[sCurrFont].hisize = = 0)

/* пропорциональный шрифт ­– а он может быть изображён в 14 пунктов */

||

( (tsFontList[sCurrFont].losize <= 14 )

&&

(tsFontList[sCurrFont].hisize >= 14 ) ) ) )

/* 14-пунктный умещается между наименьшим и наибольшим доступными размерами */

{

printf ("шрифт Charter не доступен как 14-пунктый.\n");

return (Pt_CONTINUE);

}

/* Генерирование имени основы */

if (PfGenerateFontName( tsFontList[sCurrFont].desc,

PF_STYLE_BOLD, 14, GcaCharter14Bol) = = NULL) {

perror ("PfGenerateFontName() неудача: ");

return (Pt_CONTINUE);

}

/* Теперь Вы можете использовать GcaCharter14Bold как аргумент в PtAlert(), etc. */

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

argc = argc, argv = argv;

return( Pt_CONTINUE );

} // Функции fcnAppInit()

Чтобы вышеприведенный код работал, Вы должны объявить в глобальном хеадер-файле приложения нижеследующую информацию. Чтобы это сделать, используйте диалог PhAB'а "Startup Info/Modules" (доступный из меню "Application").

/*******************************************

*** определённые пользователем константы ***

*******************************************/

#define nFONTLIST_SIZE 100 /* просто случайно выбранный размер */

/*****************************

*** глобальные переменные ***

******************************/

extern FontName GcaCharter14Bold;

Вы можете избежать использования заданного размера списка, вызвав функцию PfQueryFonts() с параметром n, установленным в 0, и параметром list – в NULL. Если Вы так сделаете, функция PfQueryFonts() вернёт количество совпавших шрифтов, но не будет пытаться заполнить список. Вы можете использовать эту возможность для определения числа записей при выделении памяти.

Помните о том, что определить этот хеадер-файл надо перед тем, как Вы начнёте добавлять ответные реакции и установочные функции – в этом случае это будет автоматически включено как #define. Если Вы забудете сделать это, Вам придётся вернуться назад и добавить оператор ручками. Более полно см. раздел "Задание глобального хеадер-файла" в главе "Работа с приложениями".

И, наконец, вот пример ответной реакции, которая использует нашу строку с именем основы:

int fcnbase_btn_showdlg_ActivateCB( PtWidget_t *widget,

ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

/* Эта ответная реакция используется для запуска диалогового окна

с целью поупражняться с глобальной переменной GcaCharter14Bold */

PtNotice (ABW_base, NULL, "Демонстрация шрифта ", NULL,

"Это написано 14-пунктовым жирным шрифтом Charter",

GcaCharter14Bold, "OK", NULL, 0);

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

return( Pt_CONTINUE );

}

Написание текста в прямоугольной области

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

Вот пример:

/* PfExtentTextToRect */

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <Ap.h>

#include <Ph.h>

#include <Pt.h>

#include <errno.h>

PtWidget_t * pwndMain = NULL, * pbtn = NULL, * pobjRaw = NULL;

Характеристики

Тип файла
Документ
Размер
7,62 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6417
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее