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 Графический контекст
Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется
Графический контекст создается процедурой XCreateGC(), имеющей следующий прототип:
function XCreateGC(prDisplay: PDisplay; nDrawable: TDrawable; nValueMask: cardinal; prValues: PXGCValues): TGC; cdecl; external;
Первый аргумент - это указатель на структуру типа TDisplay, который программа получает после вызова XOpenDisplay(); второй - идентификатор окна (или карты пикселей), в котором программа будет рисовать; третий - битовая маска, определяющая, какие атрибуты GC задаются; последний аргумент - структура типа TXGCValues, определяемая следующим образом:
TXGCValues = record
Xfunction: longint;
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. Если бит сброшен, то атрибут принимает значение по умолчанию.
Следующий пример показывает процесс создания графического контекста, в котором устанавливаются два атрибута: цвет фона и цвет переднего плана.
…
var
prGC: TGC;
rValues: TXGCValues;
prDisplay: PDisplay;
nScreenNum: integer;
…
rValues.foreground:= XBlackPixel (prDisplay, nScreenNum);
rValues.background:= XWhitePixel (prDisplay, nScreenNum);
…
prGC:= XCreateGC(prDisplay, XRootWindow (prDisplay, nScreenNum), (GCForeground OR GCBackground), @rValues);
Вызов XCreateGC() - не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC().
Когда контекст порожден, его атрибуты могут изменяться процедурой XChangeGC(). Например:
rValues.line_width:= 10;
XChangeGC (prDisplay, prGC, GCLineWidth, @rValues);
Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.
Для того, чтобы получить значение полей GC, используется процедура XGetGCValues().
1.2.2 Характеристики графического контекста
В предыдущем разделе мы говорили, что GC имеет ряд атрибутов, воздействующих на вывод изображений. Для текста это цвет и шрифт, для линий - цвет и толщина и т.д. Как уже упоминалось выше, атрибуты контекста задаются в момент его создания. Потом они могут меняться с помощью функции XChangeGC(). Кроме того, X поддерживает специальные функции для изменения параметров GC.
Ниже перечисляются основные характеристики графического контекста и процедуры, меняющие их.
GXclear | 0x0 | 0 |
GXand | 0x1 | src AND dst |
GXandReverse | 0x2 | src AND NOT dst |
GXcopy | 0x3 | src |
GXandInverted | 0x4 | (NOT src) AND dst |
GXnoop | 0x5 | dst |
GXxor | 0x6 | src XOR dst |
GXor | 0x7 | src OR dst |
GXnor | 0x8 | (NOT src) AND (NOT dst) |
GXequiv | 0x9 | (NOT src) XOR dst |
GXinvert | 0xa | NOT dst |
GXorReverse | 0xb | src OR (NOT dst) |
GXcopyInverted | 0xc | NOT src |
GXorInverted | 0xd | (NOT src) OR dst |
GXnand | 0xe | (NOT src) OR (NOT dst) |
GXset | 0xf | 1 |
По умолчанию Xfunction равно GXcopy. Устанавливается режим рисования с помощью процедуры XSetFunction().
1. Поле line_width задает толщину линии в пикселях. Нулевое значение поля соответствует тому, что линия должна быть толщиной в один пиксель и рисоваться с помощью наиболее быстрого алгоритма для данного устройства вывода.
2. Поле line_style определяет тип линии. Возможные значения следующие:
• LineSolid - сплошная линия;