![]() |
![]() |
![]() |
![]() |
Эта глава обсуждает добавление заказных виджетов к PhAB, включая соображения по дизайну виджетов, а также следующие шаги:
![]() |
Убедитесь, что изменили Makefile вашего приложения так, чтобы он был связан с вашим новым виджетом. Включите заголовок виджета в глобальный заголовок приложения, определенный в диалоге Информация Запуска Приложения - Application Start-up Info. |
Этот раздел описывает проблемы, которые Вы должны рассмотреть, когда добавляете заказные виджеты к палитре виджетов PhAB:
PhAB имеет встроенные редакторы для обработки некоторых типов ресурсов с одиночным значением. Он также обеспечивает редакторы с несколькими значением для некоторых типов ресурса. Если Вы разрабатываете ваши ресурсы с использованием типов, поддерживаемых PhAB, разработчики будут способны использовать виджет в PhAB легко. Если Вы определите ресурсы, которые не имеют связанного редактора в PhAB, разработчики будут способны устанавливать и использовать эти ресурсы только через код приложения. Список в настоящее время поддерживаемых типов может быть найден в разделе "Создание таблицы описания виджета".
Когда Вы определяете класс виджета, то присваиваете ему номер виджета. Этот номер комбинируется с номером ресурса, чтобы создать ряд уникальных номеров ресурсов для виджета. Когда Вы добавляете виджет к палитре виджетов PhAB, то определяете эти значения ресурсов в файле палитры виджетов.
PhAB использует эти числа, когда сохраняет виджет в файлах модулей. Если Вы измените номер ресурса или номер виджета после того, как они использовались в приложении PhAB, то не сможете продолжить использовать старый виджет (определенный в модуле PhAB), потому что номера ресурсов больше не будут соответствовать. По этой причине, Вы должны добавлять виджеты к файлу палитры PhAB только, когда почти все функциональные возможности виджета были закончены, и номера ресурсов больше не будут изменяться.
Как описано в "Editing palette.def", позже в этой главе, Вы можете сообщить PhAB имя общедоступной библиотеки вашего виджета. Если PhAB сможет открыть эту библиотеку, он сможет отображать ваш заказной виджет, и Вы будете видеть результаты редактирования ресурсов виджета.
Если PhAB не сможет открыть вашу библиотеку виджета, Вы не сможете видеть изменение виджета визуально, когда делаете изменения в ресурсах. Виджет отобразится должным образом, когда Вы фактически скомпилируете, свяжите и проверите приложение.
Не забудьте включать файл заголовка виджета в заголовок приложения так, чтобы сгенерированный файл abmain.c знал о вашем виджете. Также, добавьте ваш виджет к списку объектов MYOBJ, определенный в файле indOfiles.
После того, как Вы создали ваш виджет, необходимо встроить его в общедоступный объект. Чтобы сделать это, скомпилируйте ваш исходный код подобно этому:
cc -shared -o libmy_wgt.so my_wgt.c -v -Wl,-hlibmy_wgt.so
Если Вы хотите сделать отладочную версию вашей библиотеки виджетов, добавьте к командной строке опцию компилятора -gdwarf-2 перед опцией -shared. Для получения дополнительной информации об параметрах компиляции смотрите qcc в QNX Справочнике по Утилитам - Utilities Reference.
Вы должны разместить эту библиотеку в каталоге, который находится в пути LD_LIBRARY_PATH. Вы также должны поместить файл заголовка вашего заказного виджета в место, где сможете найти его позже.
Используйте PhAB для создания шаблонов вашего виджета. Для получения дополнительной информации, смотрите "Шаблоны - Templates" в главе Создание Виджетов в PhAB Руководства Программиста - Programmer's Guide Фотона.
Затем, отредактируйте файл /usr/photon/appbuilder/palette.def. Вы должны добавить некоторые строки, которые выглядят следующим образом:
l=PtWeb,<photon/PtWebClient.h>:ph p=xpalette,Web Widgets
Первая строка это библиотечная строка, которая начинается с l=: Она состоит из:
Вторая строка идентифицирует файл палитры для этого виджета, и начинается с p=. Она состоит из:
Таблица описания для одного виджета сохраняется в файле палитры виджетов. Таблица описания виджета должна описать все ресурсы и обратные вызовы, которые понимает ваш заказной виджет.
Файл палитры может содержать любое число таблиц описания виджетов, но должен содержать по крайней мере одну. Имя вашего файла палитры должно оканчиваться расширением .pal (например mywidget.pal). Чтобы получить хорошая идею того, что должен содержать файл палитры, посмотрите /use/photon/appbuilder/ptpalette.pal file.
Вот пример таблицы описания виджета:
w=PwMenuWidget h=4 PtWidget PtBasic PtContainer PwMenuWidget r=PW_LIST_DOWN,List Down Image,5001003,0,0,pixmap,NULL r=PW_LIST_UP,List Up Image,5001004,0,0,pixmap,NULL r=PW_SCROLL_DOWN,Scroll Down Image,5001005,0,0,pixmap,NULL r=PW_SCROLL_UP,Scroll Up Image,5001006,0,0,pixmap,NULL r=PW_SCROLL_LEFT,Scroll Left,5001007,0,0,pixmap,NULL r=PW_SCROLL_RIGHT,Scroll Right, 5001008,0,0,pixmap,NULL t=2 s=0xe906
Начало нового виджета в файле определено определением имени класса виджета. Оно сопровождается иерархией виджетов, ресурсами, обратными вызовами, определением типов и наконец некоторыми начальными значениями по умолчанию, которые используются при создании виджета.
Таблица описания виджета определяет следующие установки:
Эта установка начинается с определения нового виджета:
w=имя_класса
Пример:
w=ShadowedBox
![]() |
Не включайте пробелы перед или после знаков равно (=). |
Когда PhAB сталкивается с установкой имени класса, он распределяет место в его внутреннем списке для виджета. Любые установки, найденные впоследствии, применяются к этому виджету, пока он не сталкиваются с новой установкой имени класса виджета.
Эта установка определяет иерархию виджетов:
h=число_уровней наибольшее_имя_класса [следующее_наибольшее_имя_класса] ... имя_заказного_класса_виджета
Пример:
h=3 PtWidget PtBasic ShadowedBox
Установка h= указывает число уровней в иерархии. Она сопровождается именами иерархии класса виджета в порядке по убыванию наследования.
Установка иерархии виджета сообщает PhAB, который класс в иерархии виджета использовать, когда различные классы виджетов выбраны. Например, если Вы выбирете виджеты PtLabel и PtButton в одно и тоже время, Панель Управления PhAB должна показать вам ресурсы, которые относятся к обоим виджетам. PhAB делает это, идя по списку иерархии, пока не находит идентичное имя класса для обоих виджетов.
Если Вы хотите редактировать ресурсы в PhAB, то нуждаетесь или в записи r= (для новых ресурсов или наследуемых ресурсов с другим значением по умолчанию) или в записи i= (для наследуемых ресурсов) -- смотрите "Наследуемые ресурсы и обратные вызовы (i=, n=)" ниже.
Установка r= определения ресурс виджета:
r=явное_имя,описательное_имя,номер_ресурса,зарезервировано,указатель_выбора,тип,значение_по_умолчанию[,дополнительная_информация] [дополнительная_информация_1 дополнительная_информация_2 ... дополнительная_информация_n]
Пример:
r=SBW_SHADOW_COLOR,Shadow Color,5000000,0,1,crgb,0x0 r=Pt_ARG_HORIZONTAL_ALIGNMENT,Horizontal Alignment,3000,0,1,short,2,3 Pt_LEFT,0 Pt_RIGHT,1 Pt_CENTER,2
![]() |
Не создавайте записи для ресурсов Pt_ARG_POS и Pt_ARG_DIM. Все виджеты должны поддерживать их, так что PhAB обрабатывает их внутренне. |
Параметры записи ресурса имеют следующие значения:
Значение может быть определено как:
Если нет ниодной строки дополнительной информации, опустите дополнительная_информация. Не определяйте значение 0.
Для ресурсов short и flag, дополнительная_информация определяет возможные значения. Каждая строка имеет форму:
описание,значение
где описание это текст, который PhAB отображает в редакторе, а значение соответствующее значение.
Для ресурса, который является указателем на функцию (например тип code), дополнительная_информация определяет число последующих строк, которые определяют прототип функции. Прототип должен содержать @ вместо имени функции, но без завершающей точки с запятой.
значение_по_умолчанию определяет код, который будет использоваться для тела функции всякий раз, когда PhAB генерирует функцию для ресурса. Если код вмещается в строку и не содержит запятых, Вы можете определить его непосредственно как значение_по_умолчанию. Иначе, поместите код в строки, которые следуют за прототипом функции, и установите значение_по_умолчанию в число строк кода.
Вот некоторые примеры:
r=ARG_SIMPLEFUNCTION,A function,5000001,5000001,1,return 0;,1 int @( void ) r=Pt_ARG_RAW_DRAW_F,Draw Function,24000,24000,1,code,1,1 void @( PtWidget_t *widget, PhTile_t *damage ) PtSuperClassDraw( PtBasic, widget, damage ); r=Pt_ARG_LIST_BALLOON,Inflate Function,23031,23031,1,code,6,5 PtWidget_t *@( PtWidget_t *widget, PtWidget_t *parent, PhArea_t *area, PtListColumn_t const *column, int coln, const char *item, unsigned index, const char *font ) return PtGenListCreateTextBalloon( widget, parent, PtGenListSetColumnBalloon( area, column ), item, coln, font );
Эти установки определяют обратные вызовы:
c|k|e=явное_имя,описательное_имя,номер_ресурса,зарезервировано
Пример:
c=Pt_CB_ACTIVATE,Activate,2009,0 k=Pt_CB_HOTKEY,Hotkey,1010,0 e=Pt_CB_RAW,Raw Event,1011,0
Фотон поддерживает три различных типа обратных вызовов. Это стандартные обратные вызовы виджета (c=), обратные вызовы горячей клавиши (k=) и необработанные обратные вызовы (e=). Удостоверитесь, что используете тип, который соответствует определению обратного вызова в виджете.
Параметры записей обратных вызовов идентичны и имеют следующие значения:
Обратные вызовы могут также быть унаследованы от других виджетов. Смотрите "Наследуемые ресурсы и обратные вызовы (i=, n=)" ниже.
Описания ресурсов могут быть разделены несколькими классами виджетов. Это сохраняет память во время выполнения, и помогает сохранить файлы палитры совместимыми (например, если новый флаг добавлен к ресурсу родительского класса, Вы не должны добавлять его к описанию каждого дочернего класса вручную).
Эти установки могут использоваться, чтобы наследовать определения ресурсов или обратных вызовов от виджета, определенного ранее:
i=виджет[,от[,к]] n=виджет[,от[,к]]
i= строка копий ресурсов (определенных строкой r= или i=). n= строка копий обратных вызовов (определенных строками c=, k=, e= или i=).
Значения от и к это числа, которые определяют номера ресурсов, которые будут скопированы. Если даны оба, то они определяют диапазон. Если дано только значение от, оно определяет один ресурс. Если ни от ни к не даны, все ресурсы/обратные вызовы будут скопированы.
Запись i= может использоваться только, если определения ресурсов для дочерних и родительских классов идентичны. Если имеются любые различия (например, дочерний класс переназначает значение по умолчанию), Вы будете должны использовать определение ресурса r= -- но дочерний класс может все еще наследовать любую дополнительную_информацию, которую родительский класс определил или унаследовал. Для получения дополнительной информации, смотрите "Список ресурсов (r=)".
Эта установка говорит PhAB использовать эмуляцию контейнера:
b=Container
Так как PhAB не может отображать ваш виджет непосредственно, он должен использовать заменяющий виджет вместо него. Если виджет не контейнер, и Вы не установили это значение, PhAB будет использовать виджет PtBasic, чтобы эмулировать ваш виджет. Если виджет контейнер, установите значение как показано выше и PhAB будет использовать PtContainer, чтобы эмулировать ваш виджет.
Эта установка определяет тип используемого режима создания:
t=число
Пример:
t=2
Определение типов сообщает PhAB, как этот виджет должен быть создан. Например, если t=1, PhAB автоматически создает виджет, как только пользователь щелкает в модуле. Это так, потому что тип 1 указывает виджет, который имеет предварительно установленный размер. Значение t=2 означает, что пользователь может изменять размеры при создании виджета.
Допустимые значения для число располагаются в диапазоне от 1 до 6 и имеют следующие значения:
Когда число равно: | Тип создания: |
---|---|
1 | Предварительно установленный, изменяемый размер |
2 | Изменяемый размер при создании |
3 | Строка (2 точки) |
4 | Предварительно установленный, неизменяемый размер |
5 | Многоугольник (многоточечный) |
6 | Bezier (многоточечный с обработкой) |
Для получения дополнительной информации, смотрите "Создание виджета - Creating a widget" в главе Создание Виджетов в PhAB Руководства Программиста - Programmer's Guide Фотона.
Эта установка определяет стиль курсора при создании виджета:
s=стартовый_стиль_курсора[,стиль_курсора_перетаскивания]
Пример:
s=0xe914,0xe914
Эта установка определяет вид курсора, когда виджет создается в PhAB. Значение, которое Вы выбираете для установки стиля курсора (s=), будет зависеть от значения, которое Вы определите для установки типа создания (t=). Для согласованности с другими виджетами в PhAB, мы рекомендуем, чтобы Вы назначали значения стиля курсора согласно таблице ниже:
Если тип создания: | Стиль курсора должен быть: |
---|---|
t=1 | s=0xe906 |
t=2 | s=0xe914,0xe914 |
t=3 | s=0xe906 |
t=4 | s=0xe906 |
t=5 | s=0xe906 |
t=6 | s=0xe906 |
Эта установка позволяет Вам давать виджету некоторые значения по умолчанию, чтобы переназначить значения по умолчанию, встроенные в виджет:
d=имя_класса,нет_определений_ресурсов определение_1 определение_2 ... определение_n
Каждое определение состоит из трех значений:
Например:
// Пример изменяемого размера. d=ShadowedBox,1 1005 dim 1,1 // Пример предварительной установки. d=PtPrintSel,1 1005 dim 418,285
Каждое определение ресурса составлено из трех строк, и только простые типы ресурсов могут использоваться. В примере выше ресурс Pt_ARG_DIM (1005) установлен в 1 пиксел в высоту и в 1 пиксел в ширину. Это хорошая начальная точка для виджета с типом создания 2.
![]() |
Вы должны всегда давать виджету значение по умолчанию и стартовые размеры. Если Вы не сделаете этого, то получите неожиданные результаты.
Если t=1 или t=4, установите ресурс dim в предварительно установленный размер. Если другое значение, установите dim в 1,1. Ресурс dim определен как "width,height" в пикселах. |
![]() |
![]() |
![]() |
![]() |
Все мессаги сюда:yanich@inbox.ru |