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

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

Отображение окна может быть выполнено с помощью XMapWindow(), скрытие - с помощью XUnmapWindow(). Функция отображения заставит событие Expose послаться программе, если только окно полностью не закрыто другими окнами.

Другое действие, которое можно выполнить над окнами - переместить их в другую позицию. Это может быть выполнено функцией XMoveWindow(), которая принимает новые координаты окна. Имейте в виду, что после перемещения окно может быть частично скрытым другими окнами (или наоборот, открыто ими), и таким образом, может быть сгенерировано сообщение Expose.

Изменить размер окна можно с помощью функции XResizeWindow(). Мы можем также объединить перемещение и изменение размеров, используя одну функцию XMoveResizeWindow().

Все приведенные выше функции изменяли свойства одного окна. Существует ряд свойств, связанных с данным окном и другими окнами. Одно из них - порядок засылки в стек: порядок, в котором окна располагаются друг над другом. Говорят, что окно переднего плана находится на верхе стека, а окно заднего плана - на дне стека. Перемещение окна на вершину стека осуществляет функция XRaiseWindow(), перемещение окна на дно стека - функция XLowerWindow().

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

Следующий пример демонстрирует использование операций над окнами:

>uses x,xlib,xutil,crt,dos;


>(* create_simple_window - создает окно с белым фоном заданного размера.

> Принимает в качестве параметров дисплей, размер окна (в пикселях) и положение окна (также в пикселях). Возвращает дескриптор окна.

> Окно создается с черной рамкой шириной в 2 пикселя и автоматичсеки отображается после создания. *)

>function create_simple_window(display: PDisplay; >width, height, x, y: integer): TWindow;

>var

> screen_num, win_border_width: integer;

> win: TWindow;

>begin

> screen_num:= XDefaultScreen(display);

> win_border_width:= 2;


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


> win:= XCreateSimpleWindow(display, XRootWindow(display, screen_num), >x, y, width, height, win_border_width, >XBlackPixel(display, screen_num), >XWhitePixel(display, screen_num));


>(* Отображаем окно на экране. *)

> XMapWindow(display, win);


>(* Заставляем выполниться все запросы к Х серверу. *)

> XFlush(display);


> create_simple_window:=win;

>>end;


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

>var

> display: PDisplay; (* указатель на структуру дисплея Х *)

> screen_num: integer; (* количество экранов для размещения окон *)

> win: TWindow; (* дескриптор создаваемого окна *)

> display_width, display_height: word; (* высота и ширина Х дисплея *)

> win_width, win_height: word; (* высота и ширина нового окна *)

> display_name: array [0…30] of Char;

> name: string;

> i: integer;

> win_attr: TXWindowAttributes;

> xx, y, scr_x, scr_y: integer;

> child_win: TWindow; >(* переменная для хранения дескриптора родительского окна *)

>> parent_win: TWindow; >(* эта переменная будет хранить дескриптор корневого окна  экрана, на котором отображено наше окно *)

> root_win: TWindow; (* эта переменная будет хранить массив дескрипторов дочерних окон нашего окна, *)

> child_windows: PWindow; (* а эта - их количество *)

> num_child_windows: integer;


>begin

> name:= getenv('DISPLAY'); (* имя Х дисплея *)

> for i:=1 to byte(name[0]) do >display_name[i-1]:=name[i];

> display_name[byte(name[0])]:=#0;

> (* устанавливаем соединение с Х сервером *)

> display:= XOpenDisplay(display_name);

> if (display = NIL) then begin

>  writeln(paramstr(0),': не могу соединиться с Х сервером ',>  display_name);

>  halt(1);

> end;


> (* получаем геометрию экрана по умолчанию для нашего дисплея *)

> screen_num:= XDefaultScreen(display);

> display_width:= XDisplayWidth(display, screen_num);

> display_height:= XDisplayHeight(display, screen_num);


> (* создаем новое окно в 1/9 площади экрана *)

> win_width:= (display_width div 3);

> win_height:= (display_height div 3);

> (* отладочная печать в стандартный вывод *)

> writeln('ширина окна - ', win_width, '; высота - ', win_height);


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

> win:= create_simple_window(display, win_width, win_height, 0, 0);

> XFlush(display);


> (* отдохнем после трудов праведных *)

> delay(3000);


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

> begin


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

>  for i:=0 to 39 do begin

>   dec(win_width,3);

>   dec(win_height,3);

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

>   XFlush(display);


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

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


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

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


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.