| |
Значения параметров в файлах ресурсов представляются в виде строк. Перед использованием в программе, их надо преобразовать к требуемому типу. Так, например, значение атрибута XtNwidth задается строкой "100", но должно быть превращено в целое число. Для этого Xt и программы регистрируют специальные процедуры, преобразующие значения из одной формы представления в другую (т.е. из одного типа в другой). Их называют "конвертеры" (converter) (также мы будем употреблять термины "процедура-конвертор" и "преобразователь").
Механизм использования "конвертеров"
следующий. Когда программа получает ресурс с помощью
XtGetApplicationResources( ) или создает widget, обращаясь к
XtCreateWidget( ) или аналогичной процедуре, Xt
достает значение ресурса из базы данных. Это значение представлено в
виде строки. Xt знает тип атрибута (обозначим его
T) и ищет зарегистрированный "конвертер" "строка
T". Если таковой есть, то он
вызывается и значение ресурса переводится в требуемую форму. Если же
"конвертера" нет, параметр получает значение по умолчанию.
Мы описали работу "преобразователя" "строка
произвольный тип". Однако можно создать
и зарегистрировать "конвертер" "произвольный тип
произвольный тип" и использовать его
для своих нужд.
Ниже, в таблице, приведены преобразования типов данных, поддерживаемые самой Xt.
| Откуда | Куда | Описание |
| XtRString | XtRAcceleratorTable | преобразует строку, задающую "таблицу" акселераторов во внутреннюю форму Xt |
| XtRString | XtRAtom | преобразует строку, содержащую имя "свойства", в соответствующий атом |
| XtRString | XtRBoolean | конвертирует строки "True", "False", "yes", "no", "on", "off" в соответствующее логическое значение |
| XtRString | XtRBool | аналогично предыдущему |
| XtRString | XtRCursor | преобразует стандартное название курсора для X WINDOW в соответствующий идентификатор |
| XtRString | XtRDimension | конвертирует ширину и высоту к типу Dimension |
| XtRString | XtRDisplay | преобразует имя дисплея и возвращает указатель на структуру типа Display |
| XtRString | XtRFile | преобразует имя файла и возвращает его дескриптор |
| XtRString | XtRFloat | конвертирует строку, задающую число, в формат float |
| XtRString | XtRFont | преобразует имя шрифта и возвращает его идентификатор |
| XtRString | XtRFontStruct | преобразует имя шрифта и возвращает указатель на структуру типа XFontStruct |
| XtRString | XtRInitialState | конвертирует строки "Normal" или "Iconic" в символы NormalState или IconicState соответственно |
| XtRString | XtRInt | конвертирует строку, содержащую число, в формат int |
| XtRString | XtRPixel | преобразует строку содержащую имя цвета (например, black или #FF0000), в значение пиксела |
| XtRString | XtRPosition | преобразует значения x и y координат к типу Position |
| XtRString | XtRShort | конвертирует строку, содержащую число, в форму short |
| XtRString | XtRTranslationTable | преобразует строку, задающую "таблицу трансляции", во внутреннюю форму Xt |
| XtRString | XtRUnsignedChar | конвертирует строку, содержащую число, в форму unsigned char |
| XtRString | XtRVisual | преобразует строку, задающую тип палитры, и возвращает указатель на структуру типа Visual |
| XtRPixel | XtRColor | конвертирует значение пиксела в указатель на структуру типа XColor |
| XtRInt | XtRBool | конвертирует целое в логическое |
| XtRInt | XtRColor | конвертирует целое в XColor |
| XtRInt | XtRDimension | конвертирует целое в Dimension |
| XtRInt | XtRFloat | конвертирует целое в плавающее |
| XtRInt | XtRFont | конвертирует целое в Font |
| XtRInt | XtRPixel | конвертирует целое в значение пиксела |
| XtRInt | XtRPixmap | конвертирует целое в Pixmap |
| XtRInt | XtRPosition | конвертирует целое в Position |
| XtRInt | XtRShort | конвертирует целое в short |
| XtRInt | XtRUnsignedChar | конвертирует целое в беззнаковое целое |
Процедура-конвертор должна иметь следующий прототип:
void ConverterProc (XrmValue *prArgs, Cardinal *nArgs,
XrmValue *prFromVal, XrmValue *prToVal);
|
Здесь аргументы prArgs, prFromVal, prToVal - это указатели на структуры типа XrmValue (см. приложение 1) .
Процедура-конвертор должна преобразовывать данные из структуры prFromVal и результат помещать в структуру prToVal. Любые дополнительные данные, требующиеся при конвертации, передаются через аргументы prArgs и nArgs.
До того, как менеджер ресурсов сможет использовать указанную процедуру-конвертор, последняя должна быть зарегистрирована. Для этого можно использовать одну из функций XtAddConverter( ), XtAppAddConverter( ) или XtSetTypeConverter( ). В коде программы "конвертор" должен быть зарегистрирован после инициализации Xt, но до обращения к XtGetApplicationResources( ).
Процедура XtAddConverter( ) имеет следующий прототип:
void XtAddConverter (String prFromType, String psToType,
XtConverter pConverter, XtConvertArgList prConvArgs,
Cardinal nNumArgs);
|
Первый и второй аргументы процедуры - это строки, задающие соответственно типы, из которого и в который надо преобразовывать. Это должны быть стандартные имена типов данных, определенные в файле "StringDefs.h", или имена, определенные в файле-заголовке программы. Третий аргумент задает непосредственно саму процедуру-конвертор. Четвертый и пятый аргументы задают дополнительные данные, которые передаются "конвертору" и используются им. При этом prConvArgs - указатель на массив структур типа XtConvertArgRec, определяемых следующим образом:
typedef struct {
XtAdddressMode address_mode;
XtPointer address_id;
} XtConvertArgRec, *XtConvertArgList;
|
Здесь address_mode определяет, как следует интерпретировать поле address_id. Возможные значения для поля address_mode даются перечисляемым типом XtAdddressMode:
typedef enum {
XtAddress, /*адрес */
XtBaseOffset, /* смещение */
XtImmediate, /* константа */
XtResourceString, /* строчное имя ресурса */
XtResourceQuark, /* внутренняя форма задания ресурса */
XtWidgetBaseOffset, /* смещение от "родителя" */
XtProcedureArg, /* вызов процедуры */
} XtAddressMode;
|
Здесь
| XtAddress | указывает, что параметр address_id интерпретируется как адрес данных; |
| XtBaseOffset | address_id интерпретируется как смещение относительно базового адреса widget; |
| XtImmediate | address_id - константа; |
| XtResourceString | address_id интерпретируется как имя ресурса, которое будет преобразовано в смещение относительно базового адреса widget; |
| XtResourceQuark | address_id интерпретируется как имя ресурса, которое будет преобразовано во внутреннюю форму XtResourceString; |
| XtWidgetBaseOffset | аналогично XtBaseOffset, за исключением того, что смещение рассматривается относительно "родителя", если последний не принадлежит подклассу класса Core; |
| XtProcedureArg | address_id интерпретируется как указатель на процедуру типа XtConvertArgProc, которая будет вызываться при завершении конвертации (см. определение данного типа в приложении 2 данного издания). |
Процедура XtAppAddConverter( ) аналогична описанной выше процедуре, за исключением того, что добавлен еще один аргумент - контекст приложения. Процедура XtSetTypeConverter( ) также аналогична описанной процедуре, давая при этом дополнительные возможности по более эффективному конвертированию значений ресурсов (более детальную информацию по указанным процедурам можно найти в [9]).
Ниже приведен пример процедуры-конвертора, позволяющий преобразовывать строку в длинное целое.
Void CnvStringToLong (XrmValue *prArgs, Cardinal *pnNrgs,
XrmValue *prFromVal, XrmValue *prToVal)
{
static long nResult; /* result variable */
if (*pnArgs! = 0)
XtWarning ("String to Long conversion needs no extra arguments!");
if (sscanf ( (char *) prFromVal->addr, "%ld", &nResult) = = 1)
{
prToVal->size = sizeof (long);
prToVal->addr = (XtPointer) &nResult;
}
else
XtStringConversionWarning ( (char *) prFromVal->addr,
XtRLong);
}
|
Данная процедура-конвертор использует функцию XtWarning( ) для печати предупреждающего сообщения, если число аргументов args больше нуля, для конвертирования строковой переменной в переменную типа long используется процедура sscanf( ). Результат работы данной процедуры сохраняется в структуре prToVal. Процедура XtStringConversionWarning( ) предназначена для выдачи предупреждающего сообщения при неуспешном завершении sscanf( ). Процедура имеет два аргумента типа String; первый - строка, задающая данные конвертируемого типа, второй - название типа данных, к которому не смогли быть преобразованы данные, определенные первым аргументом.
В заключении отметим следующее: в данном издании
не освещаются некоторые аспекты работы с ресурсами, в частности,
установка значений по умолчанию, описание подресурсов и методов работы
с ними, и некоторые другие. Информацию по указанным вопросам можно
найти, например, в [9,10] или в аналогичных изданиях.
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |