Программирование в 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;


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


MFC и OpenGL

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


Как функции, не являющиеся методами, улучшают инкапсуляцию

Когда приходится инкапсулировать, то иногда лучше меньше, чем большеЯ начну со следующего утверждения: Если вы пишете функцию, которая может быть выполнена или как метод класса, или быть внешней по отношению к классу, Вы должны предпочесть ее реализацию без использования метода. Такое решение увеличивает инкапсуляцию класса. Когда Вы думаете об использовании инкапсуляции, Вы должны думать том, чтобы не использовать методы.Удивлены? Читайте дальше.


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

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


Программное обеспечение встроенных систем. Общие требования к разработке и документированию

Embedded system software. General requirements for development and documentationСтандарт подготовлен в развитие ГОСТ Р ИСО/МЭК 12207-99 «Информационная технология. Процессы жизненного цикла программных средств» с целью учета специфики разработки и документирования программного обеспечения встроенных систем реального времени.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.