| 
 | |
|  | 
Приведем в качестве примера простейшую программу, открывающую окно и рисующую в нем строку "Hello, world!".
| #include <X11 / Intrinsic.h>
#include <X11 / StringDefs.h>
#include <X11 / Core.h>
void DrawHellowString (Widget prWidget, XtPointer pData,
	XEvent  *prEvent, Boolean  *pbContinue)
{
    Display	*prDisplay = XtDisplay (prWidget);
    Window	nWindow = XtWindow (prWidget);
    GC		prGC;
    if (prEvent->type == Expose)
    {
       prGC = XcreateGC (prDisplay, nWindow, 0, NULL);
       XDrawString (prDisplay, nWindow, prGC, 10, 50,
	"Hello, world!", strlen ("Hello, world!") );
       XFreeGC (prDisplay, prGC);
    }
}
void main (int argc, char  **argv)
{
    Arg		args[2];
    Widget	toplevel, prCoreWidget;
    toplevel	= XtInitialize (argv[0], "Simple", NULL, 0,
			&argc, argv);
    prCoreWidget = XtCreateWidget ("Core", widgetClass,
			toplevel, NULL, 0);
    XtSetArg (args[0], XtNwidth, 100);
    XtSetArg (args[1], XtNheight, 100);
    XtSetValues (prCoreWidget, args, 2);
    XtManageChild (prCoreWidget);
    XtAddEventHandler (prCoreWidget, ExposureMask, False,
		           DrawHelloString, NULL);
    XtRealizeWidget (toplevel);
    XtMainLoop ( );
} | 
Для сборки программы используется команда:
| cc -o hello hello.o -lXt -lX11 | 
Программа использует ряд функций, предоставляемых библиотекой Xt: XtInitialize( ), XtCreateWidget( ) и др. Их прототипы, стандартные структуры данных, макросы и константы описаны в следующем основном файле-заголовке: "Intrinsic.h" В некоторых случаях необходимо также включить файл "StringDefs.h". Если программа создает и использует какой-либо объект (widget), то она должна включить файл <имя класса widget>.h. Например, в приведенной программе есть объект класса Core, поэтому мы используем файл "Core.h" (заметим, что включение указанного файла не обязательно, т.к. файл "Intrinsic.h" его включает).
Работа начинается с инициализации программы процедурой XtInitialize( ). Если она завершается успешно, то приложение возвращается указатель на созданный shell-объект класса ApplicationShell.
На втором шаге создаются управляющие элементы программы. В нашем примере процедура XtCreateWidget( ) создает widget класса Core, который и является единственным "потомком" для shell-widget, созданного процедурой XtInitialize( ). (Существуют и другие способы создания widget, на которых мы остановимся более подробно в 3.2.3.).
Вызов процедуры XtManageChild( ) делает объект prCoreWidget "управляемым" со стороны "родителя".
После этого мы регистрируем для этого widget обработчик события Expose. Это процедура DrawHellString( ). Она рисует в окне строку "Hello, world!". Регистрация осуществляется процедурой XtAddEventHandler( ).
После того, как объекты программы подготовлены к работе, соответствующие им окна показываются на экране:
| XtRealizeWidget (toplevel); | 
Далее начинается цикл получения и отправки событий:
| XtMainLoop( ); | 
Когда программа использует только процедуры библиотеки Xlib, то она должна рассматривать каждое происходящее событие и соответствующий образом реагировать на него. Если окон у задачи несколько, то прежде чем производить какие-то действия, необходимо определить, в каком из них произошло событие. Все это достаточно утомительно. Xt берет работу на себя. XtMainLoop( ) получает очередное событие и определяет окно, для которого оно предназначено. По окну находится соответствующий widget. Для последнего определяются event handler, action-процедура или callback, зарегистрированные, как реакция на произошедшее событие. Если таковые есть, то они вызываются. Указанный выше механизм называется рассылкой событий.
XtMainLoop( ) автоматически завершает программу по требованию менеджера окон.
    Наш пример может работать во всех версиях
Xt. Но начиная с X11R4 вместо XtInitialize(
) и XtMainLoop( ) следует использовать XtAppInitialize( ) и
XtAppMainLoop( ).
| Закладки на сайте Проследить за страницей | Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |