Руководство программиста в Photon (953920), страница 31
Текст из файла (страница 31)
Значения ресурса устанавливаются и извлекаются путём использования списка аргументов. Вот два шага, приводящие к установке или извлечению более чем одного значения ресурса:
|
|
|
Если Вы извлекаете или устанавливаете один ресурс, проще использовать функции PtGetResource() или PtSetResource() – в этом случае Вам нет необходимости устанавливать список аргументов.
Список аргументов
Список аргументов – это массив структур PtArg_t (см. "Справочник библиотечных функций Photon"). Каждый из этих элементов определяет ресурс виджета и новое значение для ресурса (или адрес значения, которое будет устанавливать текущее значение ресурса).
Чтобы инициализировать каждый элемент списка аргументов, можно использовать макрос PtSetArg():
PtSetArg( PtArg_t *arg, long type, long value, long len);
Если значение не требуется вычислять во время исполнения, Вы можете для инициализации списка аргументов использовать вместо этого функцию Pt_ARG(). Для получения более полной информации см. "Справочник библиотечных функций Photon".
Первые два аргумента в PtSetArg() являются адресом элемента списка аргументов и именем ресурса. Третий и четвёртый аргументы варьируются в зависимости от типа ресурса и используются либо для установки, либо для получения значения ресурса. Когда ресурс устанавливается, третий аргумент всегда используется для хранения значения ресурса или адреса на значение ресурса. Четвёртый аргумент используется либо как указатель размера, либо как маска, в зависимости от типа определяемого значения. Ниже в таблице приведены возможные типы ресурсов:
тип | описание |
Alloc | Объект памяти произвольного размера |
Array | Массив |
Boolean | Бит, который может быть либо выставлен, либо сброшен |
Color | Цвет |
Complex | Ресурс, который обрабатывается особым образом; см. ниже |
Flag | Значение, в котором каждый бит имеет свой смысл |
Function | Указатель на функцию |
Image | Указатель на структуру PhImage_t |
Link | Связанный список |
Pointer | Указатель на адрес, который Вы определяете |
Scalar | Значение, которое может быть представлено в одном long |
String | Завершающаяся NULL-ом строка |
Struct | Тип данных фиксированного размера, обычно структура, float или double |
Для получения информации по ресурсам, оговоренным для каждого виджета, см. "Справочник виджетов Photon'a".
Ресурсы compex являются особыми; для получения инструкций по их установке и получению значения см. их описание в "Справочнике виджетов Photon'a". Виджеты, имеющие комплексные ресурсы, обычно имеют функции, облегчающие работу с ними.
Установка ресурсов
Помните, что есть два шага, связанные с установкой значений более чем одного ресурса:
-
Установка списка аргументов с использованием макроса PtSetArg()
-
Установка значения с использованием функции PtSetResources().
Если Вы устанавливаете один ресурс, проще использовать PtSetResource() – Вам нет нужды устанавливать список аргументов. См. раздел "Установка одного ресурса" ниже.
Списки аргументов для установки ресурсов
Многие нижеследующие разделы демонстрируют установку неких ресурсов для виджета PtComboBox. Заметьте, что Вы можете установить одновременно более одного ресурса. Чтобы сделать это, определите список аргументов соответствующей длины:
PtArg_t args[5];
После инициализации списка аргументов, Вы фактически установили ресурсы.
Ресурсы scalar и color
При установке скалярного ресурса Вы задаёте значение как третий аргумент в PtSetArg(). Четвёртый аргумент не используется и должен быть установлен в 0. Например, чтобы установить ширину фаски в виджете типа "combo box", передайте новое значение как третий аргумент:
PtSetArg(&args[0], Pt_ARG_BEVEL_WIDTH, 5, 0);
Когда Вы вызываете PtSetResources(), виджет копирует скалярное значение в свою собственную внутреннююю структуру данных.
Ресурсы string
Установка строкового значения схожа с установкой скалярного; Вы задаёте строку как третий аргумент макроса PtSetArg(). Четвёртый аргумент – это число копируемых байт; если он равен 0, для определения длины строки используется strlen().
Например, чтобы установить текст по умолчанию для виджета типа "combo box", Вы должны задать значение ресурса Pt_ARG_TEXT_STRING в элементе под номером один списка аргументов:
PtSetArg(&args[1], Pt_ARG_TEXT_STRING, "Rectangle", 0);
Когда Вы вызываете PtSetResources(), виджет копирует строку в свою собственную внутреннюю структуру данных. Если Вам необходимо использовать международные (не-ASCII) символы в строке [читай – русский текст. Прим. пер.], следуйте одним из этих решений:
-
Определите строку в базе данных виджетов и используйте редактор языка для перевода строки. См. главу "Поддержка международных языков".
-
Используйте ped или иной UTF-совместимый текстовый редактор, чтобы отредактировать код С приложения. Вы можете затем использовать формирующие последовательности, описанные в разделе "Формирующие последовательности Photon'a" приложения "Поддержка многоязычности Unicode".
Большинство консольных редакторов, таких как elvis и vedit, не являются UTF-совместимыми. Для получения более подробной информации по редактору ped см. книгу "Справочник утилит QNX6".
-
Разыщите требуемый символ в <photon/PkKeyDef.h>, используйте wctomb(), чтобы конвертировать символ из Unicode в UTF-8, и затем впишите шестнадцатиричный код в Вашу строку. Например, французское слово "rèsumè" будет закодировано как "r\xC3\xA9sum\xC3\xA9" – тяжело для чтения, но зато работает со всеми редакторами. Для получения более полной информации по Unicode и UTF-8 см. приложение "Поддержка многоязычности Unicode".
Ресурсы alloc
Некоторые ресурсы спроектированы для хранения выделенного блока памяти. Например, каждый виджет включает ресурс Pt_ARG_USER_DATA, который Вы можете использовать для хранения каких-то данных, которые Вы хотите иметь во внутренней памяти виджета. Для установки этого ресурса передайте указатель на данные как третий аргумент в PtSetArg(). Четвёртым аргументом является размер блока памяти в байтах:
my_struct user_data;
/* Инициализация данных */
PtSetArg(&args[2], Pt_ARG_USER_DATA, &user_data, sizeof(user_data));
Когда Вы вызовете PtSetResources(), виджет скопирует данное количество байт в свою внутреннюю память.
Ресурсы image
Ресурсы образов спроектированы для хранения структуры PhImage_t. Например, виджет PtLabel имеет ресурс Pt_ARG_LABEL_IMAGE, который Вы можете использовать для хранения образа. Чтобы установить этот ресурс, создайте и инициализируйте структуру PhImage_t, затем передайте указатель на неё как третий аргумент в PtSetArg(). Четвёртый аргумент должен быть 0:
PhImage_t *my_image;
/* Создание и инициализация образа */
PtSetArg(&args[2], Pt_ARG_LABEL_IMAGE, my_image, 0);
Когда Вы вызовете PtSetResources(), виджет скопирует структуру образа (но не какую-либо память, на которую указывают члены структуры PtImage_t) в свою внутренюю память.
Ресурсы array
При установке значения массива третьим аргументом в PtSetArg() является адрес массива. Четвёртым аргументом является число элементов массива. Например, для установки Pt_ARG_ITEMS списка выборов для виджета типа "combo box", может использоваться следующий вход в список аргументов:
char* cbox_items[3] = {"Circle", "Rectangle", "Polygon"};
PtSetArg(&args[3], Pt_ARG_ITEMS, cbox_items, 3);
Когда Вы вызовете PtSetResources(), виджет скопирует содержание массива в свою собственную структуру данных.
Ресурсы flag
При установке флага третьим аргументом в PtSetArg() является битовая область, задающая значение устанавливаемых битов. Четвёртым аргументом является битовая маска, указывающая, какие элементы битовой области должны использоваться.
В качестве значения используйте Pt_TRUE, Pt_FALSE или комбинацию определёных битов и их дополнений. Не используйте значения 1, поскольку это содержит просто один бит как таковой; этот бит может не соответствовать биту, который Вы пытаетесь установить.
Например, следующий список аргументов задаёт выставление флага Pt_COMBOBOX_STATIC в виджете типа combo box (так что combo box всегда отображает список пунктов):
PtSetArg(&args[4], Pt_ARG_CBOX_FLAGS, Pt_TRUE, Pt_COMBO BOX_STATIC);
Когда Вы вызовете PtSetResources(), виджет использует битовую маску для определения, какие биты в его внутреннем ресурсе флагов представлены для изменений. Он берёт значения битов из заданного значения.
Ресурсы function
При установке ресурса функции третьим аргументом для функции PtSetArg() передаётся указатель функции. Четвёртый аргумент игнорируется; установите его в 0. Например, чтобы задать функцию прорисовки виджета PtRaw, установите ресурс Pt_ARG_RAW_DRAW_F следующим образом:
PtSetArg(&args[0], Pt_ARG_RAW_DRAW_F, &my_raw_draw_fn, 0);
Когда Вы вызовете PtSetResources(), виджет скопирует указатель на ресурс.
Ресурсы pointer
При установке ресурса указатель должен задаваться третьим аргументом функции PtSetArg(). Четвёртый аргумент игнорируется и должен быть установлен в 0.
При вызове PtSetResources() виджет просто тупо делает копию указателя в ресурсе.
Виджет не делает копию памяти, на которую ссылается указатель; не освобождайте память, пока виджет ещё ссылается на неё.
Например, каждый виджет включает ресурс Pt_ARG_POINTER, который Вы можете использовать для хранения во внутренней памяти виджета указателя на какие-либо произвольные данные. Виджет никогда не обращается к этим данным; это просто для использования им. Чтобы установить этот ресурс, выделите требуемую память и передайте указатель на неё как третий аргумент в PtSetArg(). Четвёртый аргумент установите в 0:
my_struct *user_data;
/* Выделение памяти и инициализация данных */
PtSetArg(&args[0], Pt_ARG_POINTER, user_data, 0);
Когда Вы вызываете PtSetResources(), виджет копирует значение указателя в свою внутреннюю память.
Ресурсы Link
При установке связного списка передайте адрес массива данных как третий аргумент в функцию PtSetArg(). Четвёртый аргумент имеет определённый специфический смысл:
num добавляет num пунктов (если num равен 0, добавляется один пункт)
Pt_LINK_INSERT
вставляет первый элемент массива в начало связного списка
Pt_LINK_DELETE
удаляет первый элемент списка, который совпадает с первым элементом массива
Когда Вы вызываете PtSetResources(), виджет копирует данные в свою внутреннюю память.
Ресурсы struct
При установке ресурса структуры передайте функции PtSetArg() в качестве третьего аргумента адрес данных. Четвёртый аргумент не используется и должен быть установлен в 0. Когда Вы вызываете PtSetResources(), виджет скопирует данные в свою внутреннюю память.
Ресурсы boolean
При установке булевского ресурса Вы должны задать значение как третий аргумент функции PtSetArg(), используя 0 как "ложь" и ненулевое значение в качестве "истина". Четвёртый аргумент не используется и должен быть установлен в 0. Например, чтобы задать для PtTerminal протокол ANSI, передайте в качестве третьего аргумента ненулевое значение:
PtSetArg(&args[1], Pt_ARG_TERM_ANSI_PROTOСOL, 1, 0);
При вызове PtSetResourses() виджет сбрасывает или устанавливает один бит в своей собственной структуре данных в зависимости от того, нулевое или ненулевое значение.
Вызов PtSetResources()
Как только Вы установили список аргументов, всё готово к тому, чтобы устанавливать ресурсы. Помните, что PtSetArg() не устанавливает ресурсы; эта функция только устанавливает список аргументов.
Вы можете использовать PtSetResources(), чтобы устанавливать новые значения ресурсов:
int PtSetResources(PtWidget_t *widget, int n_args, PtArg_t *args);
Аргументами этой функции являются указатель на виджет, число входов в список аргументов и сам список аргументов.
Вы можете также установить ресурсы передачей списка аргументов в функцию PtCreateWidget(). Правила задания значений в элементах списка аргументов те же самые. Для получения более полной информации см. раздел "Создание виджетов" в главе "Управление виджетами в коде приложения".
Например, Вы можете установить ресурсы виджета типа "combo box", используя список аргументов, созданный выше. Вызовите функцию PtSetResources() следующим образом:
PtSetResources(ABW_shapes_cbox, 5, args);
В ответ на изменение своего ресурса виджет может перерисовать себя. Вызов PtSetResources() послужит толчком к этому изменению. Любые изменения, появившиеся в виджете, не будут, однако, иметь эффекта до тех пор, пока не произойдёт восстановление управления в петлю обработки событий. Таким образом, если функция PtSetResources() была вызвана из функции ответной реакции или из функции обработки события, изменения в виджете не будут видны до тех пор, пока не будут выполнены все ответные реакции из списка ответных реакций и все обработчики событий.
Установка одного ресурса
Если Вы устанавливаете один ресурс, проще использовать вместо PtSetResources() функцию PtSetResource(). Для функции PtSetResource() Вам нет нужды устанавливать список аргументов.
Аргументы функции PtSetResource() являются комбинацией аргументов PtSetArg() и PtSetResources():
int PtSetResource(PtWidget_t *widget, long type, long value, long len);
widget – это указатель на виджет, ресурс которого мы устанавливаем. Другие аргументы устанавливаются просто так же, как для функции PtSetArg(), когда устанавливается более чем один ресурс. См. раздел "Списки аргументов для установки ресурсов" выше.
Например, установка одного ресурса через функцию PtSetResources() требует примерно такого кода:
PtArg_t args[1];
PtsetArg(&args[0], Pt_ARG_BEVEL_WIDTH, 5, 0);