Чтение онлайн

на главную

Жанры

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

Семериков С. А.

Шрифт:

Часто бывает необходимо создать неинициализированную пиксельную карту, чтобы в дальнейшем в ней можно было рисовать. Это полезно для графических редакторов (создание нового пустого "холста" вызовет создание новой пиксельной карты, в которой будет храниться изображение). Это полезно при чтении различных форматов изображений - мы загружаем графические данные в память, создаем на сервере пиксельную карту, а затем рисуем расшифрованные графические данные на этой пиксельной карте.

var

 (* эта переменная будет содержать дескриптор новой пиксельной карты *)

 pixmap: TPixmap;

 (*
эта переменная будет содержать дескриптор корневого окна экрана, для которого мы хотим создать пиксельную карту *)

 root_win: TWindow;

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

 depth: longint;

 root_win:= XDefaultRootWindow(display);

 depth:= XDefaultDepth(display, XDefaultScreen(display));

 (* создаем новую пиксельную карту шириной 30 и высотой в 40 пикселей *)

 pixmap:= XCreatePixmap(display, root_win, 30, 40, depth);

 (* для полноты ощущений нарисуем точку в центре пиксельной карты *)

 XDrawPoint(display, pixmap, gc, 15, 20);

После получения дескриптора пиксельной карты мы можем отобразить ее в некотором окне, используя функцию XCopyArea. Эта функция позволяет указать устройство рисования (окно или даже другую пиксельную карту) и в какую позицию этого устройства пиксельная карта будет отображена.

(* Рисовать ранее загруженную битовую карту в заданном окне, в позиции x=100, y=50. Мы хотим скопировать всю битовую карту, поэтому указываем координаты x=0, y=0 для копирования с начала битового изображения и его полный размер *)

XCopyArea(display, bitmap, win, gc, 0, 0, bitmap_width, bitmap_height, 100, 50);

Мы могли также скопировать заданный прямоугольный фрагмент пиксельной карты вместо полного ее копирования.

Отметим, что на одном и том же экране возможно создавать пиксельные карты различных глубин. Когда мы выполняем операции копирования (пиксельной карты в окно и т.п.), мы должны убедиться, что источник и приемник имеют одну и ту же глубину. Если их глубина различается, операция не удастся. Единственное исключение - копирование указанной битовой плоскости пиксельной карты с помощью показанной ранее функции XCopyPlane. В этом случае мы можем скопировать указанную плоскость в окно-приемник - в действительности устанавливается указанный бит в цвете каждого копируемого пикселя. Это может быть использовано для создания забавных графических эффектов.

Наконец, когда все операции над данной пиксельной картой выполнены, ее необходимо освободить, чтобы освободить ресурсы Х сервера. Это делается с помощью функции XFreePixmap:

(* освобождение пиксельной карты с заданным дескриптором *)

XFreePixmap(display, pixmap);

1.2.6

Изменение формы мышиного курсора

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

Есть два основных метода создания курсоров. Первый из них - использование набора предопределенных курсоров, поставляемых с Xlib. Второй - использование битовых изображений, определенных пользователем.

В первом методе используется специальный шрифт "cursor" и функция XCreateFontCursor. Эта функция принимает идентификатор формы, и возвращает дескриптор на созданный курсор. Список возможных шрифтовых идентификаторов находится в файле /usr/include/X11/cursorfont.h. Всего их более 70; вот некоторые из таких курсоров:

• XC_arrow - обычный курсор в форме стрелки, отображаемый сервером.

• XC_pencil - курсор в форме карандаша.

• XC_watch - песочные часы.

Создать курсор с использованием этих идентификаторов несложно. Из файла /usr/include/X11/cursorfont.h узнаем номера необходимых идентификаторов и опеределяем их:

const

 XC_watch=150;

var

 (* эта переменная содержит дескриптор создаваемого курсора *)

 watch_cursor: TCursor;

(* создаем курсор "песочные часы" *)

 watch_cursor:= XCreateFontCursor(display, XC_watch);

Другой метод создания курсора - использование пары пиксельных карт глубиной 1. Одна пиксельная карта определяет форму курсора, а другая работает как маска, определяющая, какие пиксели курсора действительно будут нарисованы. Остальная часть пикселей будет прозрачной. Создание такого курсора осуществляется с помощью функции XCreatePixmapCursor. В качестве примера создадим курсор, используя битовое изображение "icon.bmp". Будем предполагать, что оно уже загружено в память и преобразовано в пиксельную карту, дескриптор которой сохранен в переменной bitmap. Мы хотим, что оно было полностью прозрачным. Это означает, что только черные фрагменты нарисуются, а белые будут прозрачными. Чтобы достигнуть такого эффекта, будем использовать иконку и как пиксельную карту курсора, и как маску пиксельной карты.

var

 (* эта переменная содержит дескриптор создаваемого курсора *)

 icon_cursor: TCursor;

 (* вначале необходимо определить основной и фоновый цвета курсора *)

 cursor_fg, cursor_bg: TXColor;

 screen_colormap: TColormap;

 rc: TStatus;

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

Поделиться:
Популярные книги

Последняя Арена 7

Греков Сергей
7. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 7

Пенсия для морского дьявола 4

Чиркунов Игорь
4. Первый в касте бездны
Фантастика:
попаданцы
5.40
рейтинг книги
Пенсия для морского дьявола 4

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Совершенный: пробуждение

Vector
1. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: пробуждение

Новая мама в семье драконов

Смертная Елена
2. В доме драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Новая мама в семье драконов

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Господин следователь. Книга 2

Шалашов Евгений Васильевич
2. Господин следователь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Господин следователь. Книга 2

Провинциал. Книга 4

Лопарев Игорь Викторович
4. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 4

Сбой Системы Мимик! Академия

Северный Лис
2. Сбой Системы!
Фантастика:
боевая фантастика
юмористическая фантастика
5.71
рейтинг книги
Сбой Системы Мимик! Академия

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл