Программирование в X-Window
средствами Free Pascal
Авторы: А.П. Полищук, С.А. Семериков
[Оформление в HTML: Valery Votintsev]
Содержание
1. Основы программирования в системе X Window
1.2. Текст и графика
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 . Если бит
сброшен, то атрибут приникает значение по умолчанию.
Следующий пример показывает процесс создания графического
контекста, в котором устанавливаются два атрибута: цвет фона и цвет переднего
плана.
. . . . . . .
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 OE GCBackground), @rValues);
Вызов XCreateGC() - не единственный способ создания графического
контекста. Так, например, новый контекст может быть получен из уже
существующего GC с помощью XCopyGC() .
Когда контекст порожден, его атрибуты могут изменяться процедурой
XChangeGC() . Например:
rValues.line_width := 10;
XChangeGC (prDisplay, prGC, GCLineWidth, @rValues);
Приведенный фрагмент кода меняет ширину линий, рисуемых с
помощью графического контекста.
Для того, чтобы получить значение полей GC, используется
процедура XGetGCValues() .
|