Программирование в X Window средствами Free Pascal - [3]

Шрифт
Интервал

.

1.1.4 Графические возможности X Window

Система X Window предназначена для работы на растровых дисплеях. В подобного рода устройствах изображение представляется матрицей светящихся точек - пикселей. Каждый пиксель кодируется определенным числом бит (как правило 2, 4, 8, 16 или 24). Число бит-на-пиксель называют "толщиной" или глубиной дисплея. Биты с одинаковыми номерами во всех пикселях образуют как бы плоскость, параллельную экрану. Ее называют цветовой плоскостью. X позволяет рисовать в любой цветовой плоскости (или плоскостях), не затрагивая остальные.

Значение пикселя не задает непосредственно цвет точки на экране. Последний определяется с помощью специального массива данных, называемого палитрой. Цвет есть содержимое ячейки палитры, номер которой равен значению пикселя.

X имеет большой набор процедур, позволяющих рисовать графические примитивы - точки, линии, дуги, выводить текст и работать с областями произвольной формы.

1.1.5 Свойства и атомы

В X Window встроены средства для обеспечения обмена информацией между программами-клиентами. Для этого используется механизм свойств (properties). Свойство - это порция данных, связанная с некоторым объектом (например, окном), и которая доступна всем клиентам X.

Каждое свойство имеет имя и уникальный идентификатор - атом. Обычно имена свойств записываются большими буквами, например: MY_SPECIAL_PROPERTY. Атомы используются для доступа к содержимому свойств с тем, чтобы уменьшить количество информации, пересылаемой по сети между клиентами и X сервером.

В X предусмотрен набор процедур, позволяющих перевести имя свойства в уникальный атом, и, наоборот, по атому получить необходимые данные.

Некоторые свойства и соответствующие им атомы являются предопределенными и создаются в момент инициализации сервера. Этим атомам соответствуют символические константы, определенные в файлах-заголовках библиотеки Xlib. Эти константы начинаются с префикса XA_.

1.1.6 Первый пример

Продолжая традиции многих изданий, посвященных программированию, начнем с программы, рисующей на экране строку "Hello, world!". В этом примере приведены основные шаги, необходимые для работы в X Window.

>uses x,xlib,x11,xutil,strings;


>const

> WND_X=0;

> WND_Y=0;

> WND_WDT=100;

> WND_HGH=100;

> WND_MIN_WDT=50;

> WND_MIN_HGH=50;

> WND_BORDER_WDT=5;

> WND_TITLE='Hello!';

> WND_ICON_TITLE='Hello!';

> PRG_CLASS='Hello!';


>(* SetWindowManagerHints - процедура передает информацию о свойствах программы менеджеру окон. *)

>procedure SetWindowManagerHints(

> prDisplay: PDisplay; (*Указатель на структуру TDisplay *)

> psPrgClass: PChar; (*Класс программы *)

> argv: PPChar; (*Аргументы программы *)

> argc: integer; (*Число аргументов *)

> nWnd: TWindow; (*Идентификатор окна *)

>  x, (*Координаты левого верхнего *)

>  y, (*угла окна *)

>  nWidth,

>  nHeight, (*Ширина и высота окна *)

>  nMinWidth,

>  nMinHeight:integer; (*Минимальные ширина и высота окна *)

> psTitle: PChar; (*Заголовок окна *)

> psIconTitle: PChar; (*Заголовок пиктограммы окна *)

> nIconPixmap: TPixmap (*Рисунок пиктограммы *)

>);


>var

> rSizeHints: TXSizeHints; (*Рекомендации о размерах окна*)

> rWMHints: TXWMHints;

> rClassHint: TXClassHint;

> prWindowName, prIconName: TXTextProperty;

>begin


>if (XStringListToTextProperty(@psTitle, 1, @prWindowName)=0) or

>    (XStringListToTextProperty(@psIconTitle, 1, @prIconName)=0) then

> begin

>  writeln('No memory!');

>  halt(1);

>end;


> rSizeHints.flags:= PPosition OR PSize OR PMinSize;

> rSizeHints.min_width:= nMinWidth;

> rSizeHints.min_height:= nMinHeight;

> rWMHints.flags:= StateHint OR IconPixmapHint OR InputHint;

> rWMHints.initial_state:= NormalState;

> rWMHints.input:= True;

> rWMHints.icon_pixmap:= nIconPixmap;


> rClassHint.res_name:= argv[0];

> rClassHint.res_class:= psPrgClass;


> XSetWMProperties(prDisplay, nWnd, @prWindowName, @prIconName, argv, argc, @rSizeHints, @rWMHints, @rClassHint);

>end;


>(* main - основная процедура программы *)

>//void main(int argc, char *argv[])

>var

> prDisplay: PDisplay; (* Указатель на структуру Display *)

> nScreenNum: integer; (* Номер экрана *)

> prGC: TGC;

> rEvent: TXEvent;

> nWnd: TWindow;

>begin

>(* Устанавливаем связь с сервером *)

> prDisplay:= XOpenDisplay(nil);

>if prDisplay = nil then begin

>  writeln('Can not connect to the X server!');

>  halt (1);

> end;


> (* Получаем номер основного экрана *)

> nScreenNum:= XDefaultScreen(prDisplay);


> (* Создаем окно *)

> nWnd:= XCreateSimpleWindow(prDisplay, XRootWindow (prDisplay, nScreenNum), WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT, XBlackPixel (prDisplay, nScreenNum),

> XWhitePixel (prDisplay, nScreenNum));


> (* Задаем рекомендации для менеджера окон *)

> SetWindowManagerHints(prDisplay, PRG_CLASS, argv, argc, nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT, WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0);


> (* Выбираем события, обрабатываемые программой *)

> XSelectInput(prDisplay, nWnd, ExposureMask OR KeyPressMask);


> (* Показываем окно *)

> XMapWindow(prDisplay, nWnd);


> (* Цикл получения и обработки событий *)

>while (true) do begin

>  XNextEvent(prDisplay, @rEvent);


>case (rEvent.eventtype) of

>  Expose:

>begin

>   (* Запрос на перерисовку *)

>if (rEvent.xexpose.count ‹› 0) then continue;


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.