- •XSetNormalHints(dpy,win,&hint)
- •XDrawText() ( xDrawText16( ) ) позволяет рисовать несколько строк сразу, используя при этом разные шрифты. Каждая рисуемая единица задается структурой xTextItem.
- •IncludeInferiors — графика рисуется поверх всех подокон
- •XrmOptionDescRec pOptions [ ], Cardinal nNumOpt,
- •XtMainLoop( ) автоматически завершает программу по требованию менеджера окон.
- •VendorShell. Этот класс предназначен для того, чтобы дать возможность взаимодействия со специальными менеджерами окон.
- •XtArgVal value;
- •XtCreateWidget( ) возвращает идентификатор созданного объекта. В следующем примере создается widget класса Core, имеющий ширину и высоту равные 100 и 150 пикселов соответственно.
- •Void ActionProc (Widget prW, xEvent *prEvent, String *psParams, Cardinal *nNumParams);
- •XtActionProc proc;
- •Xt поддерживает набор специальных символов, употребляемых с модификаторами для расширения возможностей использования последних .
- •3. Обработчики событий.
- •Void HandlerProc (Widget prWidget, XtPointer pUserData, xEvent *prEvent, Boolean *pnContinue);
IncludeInferiors — графика рисуется поверх всех подокон
Генерация запроса на перерисовку при копировании частей окон (поле graphics_exposures ). Когда часть окна копируется куда-либо, то вполне вероятна ситуация, что исходное изображение перекрыто, возможно не полностью, другими окнами или недоступна по другим причинам. В этом случае может быть необходимо сообщить клиенту, в окно которого происходит копирование, что часть нового изображения не может быть получена простым переносом пикселов, а должна быть перерисована. Если поле graphics_exposures равно True, то X посылает при копировании следующее:
- одно или несколько событий GraphicsExpose, если перерисовка необходима;
- событие NoExpose, если исходное окно полностью доступно и дополнительного рисования не требуется.
Если поле равно False, то событие не посылается. Устанавливается параметр процедурой XSetGraphicsExposures( ).
Область отсечения (задается полями clip_mask, clip_x_origin, clip_y_origin). Это битовая карта, "говорящая" о том, какие пикселы выводятся, а какие нет при всех операциях рисования. Если бит карты установлен, то соответствующий пиксел появится в окне, а если бит сброшен, то пиксел будет пропущен. Положение в окне верхнего левого угла области отсечения определяется параметрами clip_x_origin и clip_y_origin
Эти параметры устанавливаются процедурой XSetClipOrigin( ). Сама область отсечения задается с помощью процедур XSetClipMask( ), XSetClipRectangles( ) или XSetClipRegion( ).
Любая клиентская программа, использующая примитивы графического вывода должна специфицировать для своих окон структуру графического контекста GC, которая устанавливает все необходимые характеристики графического вывода. Для каждого окна Х-клиента может быть создано один или несколько самостоятельных графических контекстов, специфицирующих поля структуры GC необходимым образом, с помощью функции XCreateGC .
Структура графического контекста используется всеми примитивами графического вывода, поэтому рекомендуется обеспечить её передачу в соответствующие модули клиентской программы, которые реализуют графический вывод. Для простых случаев, когда к характеристикам графического вывода не предъявляется специальных требований рекомендуется специфицировать в клиентской программе стандартный графический контекст, используя макрос XDefaultGC.
Использование нестандартных графических контекстов характерно для прикладных программ, которые выполняют растровые операции графического вывода, например с целью реализации "резиновых" объектов. При формировании растровых изображений является существенным характер взаимодействия пикселей исходного и реализуемого изображений, который определяется кодом растровой операции, установленной для текущего графического контекста. Для установки кода растровой операции рекомендуется использовать функцию XSetFunction, передавая ей в качестве аргументов графический контекст, для которого задаётся данная растровая операция, и макроопределения кода растровой функции.
При формировании простых резиновых объектов достаточно использовать две растровые операции, которые реализуются макросами GXcopy и GXxor. Что бы обеспечить эффективность дальнейшего использования указанных растровых операций примитивами графического вывода, рекомендуется создать 2 самостоятельных графических контекста с помощью функции XCreateGC и установить для каждого из них соответствующий код растровой операции. В последующих модулях клиентской программы для формирования каждого нового изображения "резинового" рекомендуется использовать графический контекст с растровой функцией GXcopy, а для ликвидации текущего изображения — графический контекст с растровой функцией GXxor.
Следует отметить, что X Windows System поддерживает 16 разновидностей растровых операций, а для стандартного графического контекста по умолчанию устанавливается растровая функция GXcopy.
Следующий пример иллюстрирует создание 2-х графических контекстов для обслуживания "резиновых" приложений:
GC copygc, xorgc;
Display *dpy;
Window win;
XGCValues gcval;
copygc=XCreateGC(dpy,win,0L,&gcval);
xorggc=XCreateGC(dpy,win,0L,&gcval);
XSetFunction(dpy,copygc,GXcopy);
XSetFUNCTION(dpy,xorg,GXxor);
Создание пиксельной карты
Для сохранения растровой копии содержания окна клиентской программы рекомендуется образовать с помощью функции XCreatePixmap() пиксельную карту соответствующих размеров. Указанная функция возвращает идентификатор пиксельной карты типа Pixmap, который функционально аналогичен идентификатору окна. Это позволяет скрытно отображать примитивы в пиксельной карте аналогично их явному визуальному отображению в окне. Рекомендуется отражать сохраняемые примитивы графического вывода в пиксельной карте параллельно их отображению в окне, используя при этом одинаковые функции графического вывода, которые, различаются только типом идентификатора объекта отображения.
Что бы подчеркнуть функциональное сходство объектов типа окна и пиксельной карты и облегчить их совместное использование предусмотрен универсальный тип идентификатора для обращения к указанным объектам — Drawable. Этому идентификатору может быть одинаково просто присвоено значение типа Window и типа Pixmap. Все функции графического вывода имеют аргумент типа Drawable для идентификации объекта отображения.
Аналогично идентификатору окна рекомендуется обеспечить передачу идентификатора пиксельной карты соответствующим модулям клиентской программы. Следующий пример демонстрирует образование пиксельной карты размером wXh.
Display *dpy;
Pixmap pix;
int scr;
pix=XCreatePixmap(dpy,DefaultRootWindow(dpy),w,h,DefaultDepth(dpy,scr));
Следует отметить, макрос DefaultRootWindow передаётся функции XCreatePixmap, что бы идентифицировать экран, которому будет соответствовать пиксельная карта, а не для обозначения её иерархической подчинённости как в случаях создания окна. Отношения иерархической взаимосвязи свойственные окнам не распространяются на пиксельные карты.
Создание и поддержка пиксельной карты требует значительных затрат ресурсов Х-сервера. Поэтому в клиентской программе не рекомендуется создавать пиксельной карты больших размеров или неоправдано увеличивать их количество. Если ресурсов Х-сервера недостаточно для создания очередной пиксельной карты, то функция XCreatePixmap возвращает нулевой аргумент. В прикладной программе рекомендуется контролировать код завершения функции XCreatePixmap.
Примитивы графического вывода
Для формирования простых изображений достаточно использовать базовые примитивы графического вывода: прямая линия, прямоугольник, закрашенный прямоугольник, точка, дуга. Для отображения указанных примитивов рекомендуется использовать функции: XDrawLine, XDrawRectangle, XFillRectangle, XDrawPoint, XDrawArc, XFillArc, которые формируют соответствующие изображения в заданном окне или пиксельной карте, используя указанный графический контекст.
Перед отображением указанных примитивов рекомендуется установить желаемый цвет изображения с помощью функции XSetForeground, используя для идентификации цвета значение соответствующего элемента массива пиксельных кодов цветов, установленных в цветовой карте.
В прикладных программах, которые используют растровые операции, например для обработки "резиновых" объектов, необходимо использовать функцию XSetFunction для установки необходимой растровой функции в структуре текущего графического контекста или применять несколько самостоятельных графических контекстов, каждому из которых поставлена в соответствие определённая растровая функция.
Следующий пример поясняет использование примитивов прямая линия, прямоугольник, закрашенный прямоугольник для формирования соответствующих изображений в окне win и пиксельной карте pix. Для установки цвета изображения используется массив пиксельных кодов цвета colorcode.
Display *dpy;
Drawable win,pix;
int x,y,w,h;
GC gc;
unsigned long colorcode[3];
XsetForeground(dpy,gc,colorcode[0]);
XDrawRectangle(dpy,win,gc,x,y,w,h);
XDrawRectangle(dpy,pix,gc,x,y,w,h);
XSetForeground(dpy,gc,colorcode[1]);
XDrawLine(dpy,win,gc,x,y,x+w,y+h);
XDrawLine(dpy,pix,gc,x,y,x+w,y+h);
XSetForeground(dpy,gc,colorcode[2]);
XFillRectangle(dpy,win,x,y,w/2,h/2);
XFillRectangle(dpy,pix,x,y,w/2,h/2);
Следует отметить, что геометрические параметры примитивов графического вывода являются относительными координатами в окне или пиксельной карте. Для окон и пиксельных карт принята координатная система, симметричная декартовой прямоугольной, относительно горизонтальной оси. Единицей измерения расстояния является 1 пиксель экрана.
Виджеты и встроенные средства Xt
XToolkit можно разделить на два уровня:
- встроенные средства — основа, на которой строятся виджеты и прикладные программы. Они содержат средства для создания, организации и разрушения виджетов. Встроенные средства транслируют последовательности событий от сервера и вызова процедур, которые затем могут интерпретироваться виджетами и прикладными программами. Встроенные средства следят за состоянием конкретного виджета и согласовывают обустройство экрана, когда виджет изменяет размеры или позицию.
- набор виджетов — могут включать в себя содержание интерфейса прикладных программ.
Виджеты — это компоненты пользовательского интерфейса, которые представляют собой комбинацию Х-окна и необходимые семантики для формирования объекта, при этом объект обеспечивает абстракцию пользовательского интерфейса.
Прикладные программы могут быть сконструированы таким образом, что они взаимодействуют с системой XWindow либо через Xt, либо с помощью комбинации Xt и Xlib.
Инициализация программы. Контекст программы
Программы, работающие в X, должны выполнить ряд стандартных действий, а именно: установить связь с сервером, задать необходимые свойства для менеджера окон, и выполнить массу других шагов. Если используется Xt, то все это делается одной процедурой — XtInitializе(). Она инициализирует сам пакет, менеджер ресурсов (resourse manager) X Window, и выполняет другие необходимые операции. Для каждого приложения обращение к XtInitialize() или аналогичной процедуре (см. ниже) должно предшествовать всем другим вызовам процедур Xt. После завершения, XtInitialize( ) возвращает идентификатор sheel-widget, который может использоваться как корень дерева объектов программы. XtInitialize( ) имеет следующий прототип:
Widget XtInitialize ( char *psShellName,
char *psApplicationClass,
