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

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

>   delay(20);

>  end;


>  (* в цикле увеличиваем окно *)

>  for i:=0 to 39 do begin

>   inc(win_width,3);

>   inc(win_height,3);

>   XResizeWindow(display, win, win_width, win_height);

>   XFlush(display);

>   delay(20);

>  end;

> end;


> delay(1000);


> (* пример перемещения окна *)

> begin


>  (* вначале получаем текущие атрибуты окна *)

>  XGetWindowAttributes(display, win, @win_attr);


>  xx:= win_attr.x;

>  y:= win_attr.y;


>  (* затем находим окно родителя *)

>  begin


>   (* выполним запрос необходимых значений *)

>   XQueryTree(display, win, >@root_win, >@parent_win,>@child_windows, @num_child_windows);


>   (* мы должны освободить список дочерних дескрипторов, так как он был динамически выделен XQueryTree() *)

>   XFree(child_windows);

>  end;


  >(* Транслируем локальные координаты в экранные, используя корневое окно как окно, относительно которого выполняется трансляция. Это работает потому, что корневое окно всегда занимает весь экран, и его левый верхний угол совпадает с левым верхним углом экрана *)

>  XTranslateCoordinates(display, parent_win, win_attr.root, xx, y, @scr_x, @scr_y, @child_win);


>  (* перемещаем окно влево *)

>  for i:=0 to 39 do begin

>   dec(scr_x,3);

>   XMoveWindow(display, win, scr_x, scr_y);

>   XFlush(display);

>   delay(20);

>  end;


>  (* перемещаем окно вниз *)

>  for i:=0 to 39 do begin

>   inc(scr_y,3);

>   XMoveWindow(display, win, scr_x, scr_y);

>   XFlush(display);

>   delay(20);

>  end;


>  (* перемещаем окно вправо *)

>  for i:=0 to 39 do begin

>   inc(scr_x,3);

>   XMoveWindow(display, win, scr_x, scr_y);

>   XFlush(display);

>   delay(20);

>  end;


>  (* перемещаем окно вверх *)

>  for i:=0 to 39 do begin

>   dec(scr_y,3);

>   XMoveWindow(display, win, scr_x, scr_y);

>   XFlush(display);

>   delay(20);

>  end;

> end;


> delay(1000);


> (* пример сворачивания и восстановления окна *)

> begin

>  (* сворачиваем окно *)

>  XIconifyWindow(display, win, XDefaultScreen(display));

>  XFlush(display);

>  delay(2000);

>  (* восстанавливаем окно *)

>  XMapWindow(display, win);

>  XFlush(display);

>  delay(2000);

> end;


> XFlush(display);


> (* короткая передышка *)

> delay(2000);


> (* закрываем соединение с Х сервером *)

> XCloseDisplay(display);

>end.

1.1.10 Лабораторная работа #1 "Основные понятия Xlib"

1. Используя компилятор командной строки, выполните компиляцию примера из п. 1.1 и выполните полученную программу.

2. Настройте интегрированную среду Анюта для работы с кириллицей и выполните компиляцию в ней предыдущей программы.

3. На основе примера напишите программу, которая при нажатии клавиши мыши пишет сообщение Pressed, а при отпускании - Released.

4. Используя функции XFlush() / XSync() и delay(), напишите программу без цикла обработки сообщений, отображающую черное окно размером 100х100 пикселей в течение 5 секунд.

1.2 Текст и графика

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

1.2.1 Графический контекст

Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется графическим контекстом (Graphic Context (GC)). Указатель на GC используется в качестве одного из параметров при вызове "рисующих" функций X. Графический контекст содержит ряд атрибутов, влияющих на отображение объектов: текста, линий, фигур и др. Выделенный GC должен быть освобожден до завершения работы программы.

Графический контекст создается процедурой XCreateGC(), имеющей следующий прототип:

>function XCreateGC(prDisplay: PDisplay; nDrawable: TDrawable; nValueMask: cardinal; prValues: PXGCValues): TGC; cdecl; external;

Первый аргумент - это указатель на структуру типа TDisplay, который программа получает после вызова XOpenDisplay(); второй - идентификатор окна (или карты пикселей), в котором программа будет рисовать; третий - битовая маска, определяющая, какие атрибуты GC задаются; последний аргумент - структура типа TXGCValues, определяемая следующим образом:

>TXGCValues = record

> Xfunction: longint; {Renamed function to Xfunction}

> plane_mask: cardinal;

> foreground: cardinal;

> background: cardinal;

> line_width: longint;

> line_style: longint;

> cap_style: longint;

> join_style: longint;

> fill_style: longint;

> fill_rule: longint;

> arc_mode: longint;

> tile: TPixmap;

> stipple: TPixmap;

> ts_x_origin: longint;

> ts_y_origin: longint;

> font: TFont;

> subwindow_mode: longint;

> graphics_exposures: TBool;

> clip_x_origin: longint;

> clip_y_origin: longint;

> clip_mask: TPixmap;

> dash_offset: longint;

> dashes: char;

>end;

>PXGCValues = ^TXGCValues;

Значения полей данной структуры будут объяснены ниже. Каждому из них соответствует бит в маске, которая передается в качестве третьего параметра при вызове процедуры XCreateGC(). Эти биты обозначаются символическими константами, определенными в модуле X. Если бит установлен, то значение соответствующего атрибута должно быть взято из переданной функции XCreateGC() структуры TXGCValues. Если бит сброшен, то атрибут принимает значение по умолчанию.


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

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


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

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


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

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


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

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


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

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


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

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