- : Программирование в среде X Window на основе библиотеки Xlib :
- Первый пример
- : Программирование в среде X Window на основе библиотеки Xlib :
- Введение
- Linux xlib создание окна
- 2. Почему не используются визуальные элементы (виджеты)?
- 3. Основы
- 3.1 Открытие дисплея
- 3.2 Создание окна
- 3.3 Обработка событий
- 3.4 Рисование
- 4. Создание кнопки
- 4.1 Требования к кнопке
- 4.2 Создание собственного окна
- 4.3 Реализация состояний «нажатая» и «отпущенная»
- 4.4 Дополнительные аспекты при отображении состояния кнопки
- 4.5 Свойство «text»
- 4.6 Генерация события «on_click()»
- 5. Заключение
- a. Ссылки
- b. Файлы
- Rob Tougher
: Программирование в среде X Window на основе библиотеки Xlib :
С о д е р ж а н и е
Первый пример
Начнем изучение с программы, рисующей на экране строку, например «First, example!». Для начала рассмотрим основные шаги, необходимые для работы в X Window. Этот пример можно в дальнейшем можно использовать как шаблон для ваших собственных более сложных программ.
Программа должна выполнить следующие действия:
- Установить соедининение клиента с X сервером при помощи функции XOpenDisplay() , в случае неудачи выход с сообщением об ошибке.
- Получить информацию о физическом экране, это можно использовать, чтобы вычислить желаемый размер окна.
- Создать окно с помощью функции XCreateSimpleWindow() .
- Установить свойства для менеджера окна.
- Выбрать тип события, который будет обрабатываться XSelectInput() .
- Создать графический контекст, чтобы управлять запросами на прорисовку.
- Показать окно с помощью функции XMapWindow() .
- Бесконечный цикл для приёма событий
- Создать запрос на перерисовку Expose , также здесь описываются действия программы по умолчанию.
- Добавить другие события, KeyPress , ButtonPress , или другие.
Исходный код программы example1.c
Для сборки программы используется команда:
cc -o primer1.out primer1.c -lX11 -L/usr/X11R6/lib
Здесь cc — имя исполняемого файла компилятора. Как правило, это символическая ссылка на реальное имя компилятора (например, gcc). Параметр -o задает имя исполняемого файла; в нашем случае это hello. -lX11 указывает на необходимость подключения библиотеки Xlib, а -L/usr/X11R6/lib определяет путь к ней.
На рис. 1.3 показан внешний вид приложения после его запуска.
Рис. 1.3. Окно приложения xhello в среде KDE
Программа использует ряд функций, предоставляемых библиотекой Xlib: XOpenDisplay(), XCreateSimpleWindow() и др. Их прототипы, стандартные структуры данных, макросы и константы описаны в следующих основных файлах-модулях: .
Перейдем к рассмотрению самой программы. Она начинается установлением связи с Х-сервером. Делает это функция XOpenDisplay() . Ее аргумент определяет сервер, с которым надо связаться. Если в качестве параметра XOpenDisplay() получает NULL , то она открывает доступ к серверу, который задается переменной среды (environment) DISPLAY . И значение этой переменной, и значение параметра функции имеют следующий формат: host:server.screen , где host — имя компьютера, на котором выполняется сервер, server — номер сервера (обычно это 0), а screen — это номер экрана.
Функция XOpenDisplay() возвращает указатель на структуру типа Display . Это большой набор данных, содержащий информацию о сервере и экранах. Указатель следует запомнить, т.к. он используется в качестве параметра во многих функциях Xlib.
XOpenDisplay() соединяет программу с X сервером, используя протоколы TCP или DECnet, или же с использованием некоторого локального протокола межпроцессного взаимодействия. Если имя машины и номер дисплея разделяются одним знаком двоеточия (:), то XOpenDisplay() производит соединение с использованием протокола TCP. Если же имя машины отделено от номера дисплея двойным двоеточием (::), то для соединения используется протокол DECnet. При отсутствии поля имени машины в имени дисплея, то для соединения используется наиболее быстрые из доступных протоколов. Конкретный X сервер может поддерживать как все, так и некоторые из этих протоколов связи. Конкретные реализации Xlib могут дополнительно поддерживать другие протоколы.
Если соединение проведено удачно, XOpenDisplay() возвращает указатель на структуру Display , которая определяется в <X11/Xlib.h> . Если же установить соединение не удалось, то XOpenDisplay() возвращает NULL . После успешного вызова XOpenDisplay() клиентской программой могут использоваться все экраны дисплея. Номер экрана возвращается функцией XDefaultScreen() . Доступ к полям структур Display и Screen возможен только посредством использования макроопределений и функций.
После того, как связь с сервером установлена, программа «Hello» определяет номер экрана. Для этого используется функция XDefaultScreen() , возвращающий номер основного экрана. Переменная nScreenNum может иметь значение от 0 до величины (ScreenCount(display)-1) . Макрос XScreenCount() позволяет получить число экранов, обслуживаемых сервером.
Следующий шаг — создание окна и показ его на дисплее. Для этого программа обращается к фунуции XCreateWindow() или XCreateSimpleWindow() . Для простоты мы используем вторую функцию, параметры которой задают характеристики окна.
Для задания цветов окна используются функции XBlackPixel() и XWhitePixel() . Они возвращают значения пикселей, которые считаются на данном дисплее и экране соответствующими «черному» и «белому» цветам. Функция XCreateSimpleWindow() ( XCreateWindow() ) возвращает значение типа Window . Это целое число, идентифицирующее созданное окно.
Среди параметров функций, создающих окна, есть те, которые определяют положение окна и его размеры. Эти аргументы принимаются во внимание системой X Window. Исключение составляет случай, когда родительским для создаваемого окна является «корневое» окно экрана. В этом случае решение о положение окна и его размерах принимает менеджер окон. Программа может пытаться повлиять на решение менеджера окон, сообщив ему свои «пожелания» с помощью функции XSetWMProperties() .
Из листинга видно, что программа может сообщить менеджеру следующие параметры:
- имя (заголовок) окна;
- имя пиктограммы окна;
- саму пиктограмму;
- параметры argc и argv , передаваемые от UNIX программе;
- желаемое положение окна, его размеры, другие рекомендации о его геометрии.
Имя окна и имя пиктограммы должны быть в начале преобразованы в «текстовые свойства», описываемые структурами типа XTextProperty . Это выполняется функцией XStringListToTextProperty() .
Для передачи информации о желаемой геометрии окна используется структура XSizeHints .
X Window позволяет сообщить менеджеру также следующее:
- начальное состояние окна; нормальное или минимизированное;
- воспринимает ли окно ввод с клавиатуры;
- класс программы и ее имя для чтения ресурсов из базы данных ресурсов.
После того, как «рекомендации» менеджеру окон переданы, программа выбирает события, на которые она будет реагировать. Для этого вызывается функция XSelectInput() . Ее последний аргумент есть комбинация битовых масок (флагов). В нашем случае это ExposureMask or KeyPressMask . ExposureMask сообщает X Window, что программа обрабатывает событие Expose . Оно посылается сервером каждый раз, когда окно должно быть перерисовано. KeyPressMask выбирает событие KeyPress — нажатие клавиши клавиатуры.
Теперь окно программы создано, но не показано на экране. Чтобы это произошло, надо вызвать функцию XMapWindow() . Заметим, что из-за буферизации событий библиотекой Xlib, окно не будет реально нарисовано, пока программа не обратится к функции получения сообщений от сервера XNextEvent() .
Программы для X построены по принципу управляемости событиями. Поэтому, после того, как окно создано, заданы необходимые параметры для менеджера окон, основная ее работа — это получать сообщения от сервера и откликаться на них. Выполняется это в бесконечном цикле. Очередное событие «вынимается» функцией XNextEvent() . Само оно есть переменная типа XEvent , который представляет собой объединение структур. Каждое событие Expose , KeyPress и т.д.) имеет свои данные (и, следовательно, свое поле в объединении XEvent ).
При получении сообщения Expose программа перерисовывает окно. Это событие является одним из наиболее важных событий, которые приложение может получить. Оно будет послано нашему окну в одном из различных случаев:
- другое окно перекрыло часть нашего;
- наше окно было выведено поверх всех других окон;
- наше окно впервые прорисовывается на экране;
- наше окно было восстановлено после сворачивания.
Когда мы получаем событие Expose , мы должны взять данные события из члена xexpose объединения XEvent . Он содержит различные интересные поля:
count — количество других событий Expose , ожидающие в очереди событий сервера. Это может быть полезным, если мы получаем несколько таких сообщений подряд — рекомендуется избегать перерисовывать окно, пока мы не получим последнее из их (то есть пока count не равно 0).
window — идентификатор окна, которому было послано сообщение Expose (в случае, если приложение зарегистрировало это событие в различных окнах).
x , y — координаты верхнего левого угла области окна, которая должна быть перерисована.
Действия по обработке Expose начинаются с создания графического контекста — структуры, которая содержит данные, необходимые для вывода информации, в нашем случае — текста: gc = XCreateGC (display, window, 0, NULL);
После этого рисуется строка «First example!». Более графический контекст не нужен — он уничтожается: XFreeGC (display, gc);
Окно может получить несколько событий Expose одновременно. Чтобы не перерисовывать себя многократно, программа дожидается прихода последнего из них и только потом осуществляет вывод.
Приход события KeyPress означает, что программу надо завершить: прекратить связь с сервером: XCloseDisplay (display); и вызвать функцию exit() .
XCloseDisplay() закрывает соединение с Х сервером, закрывает все окна и удаляет идентификаторы ресурсов, созданных клиентом на дисплее. Для удаления только окна без разрыва связи с Х сервером необходимо использовать функции XDestroyWindow() и XDestroySubWindows() .
Источник
: Программирование в среде X Window на основе библиотеки Xlib :
С о д е р ж а н и е
Введение
X Window System или просто X — это система для создания графического интерфейса, которая используется в операционных системах Unix. В начале 80-х существовала некая «Операционная система V» (The V System), а при ней — оконная подсистема W следующая буква алфавита после V, а заодно — первая буква слова Window Система созданная в сентябре 1987г. в MIT (Массачусетский Технологический Институт) стала стандартом. К 1984 году совместными усилиями института и исследовательского отделения Digital Equipment Corporation (DEC) эту оконную подсистему сделали системно-независимой (crossplatforming или X-platforming). Вдобавок первый разработчик X Window использовал весьма привлекательный и совершенный по сегодняшним меркам объектно-ориентированный язык программирования CLU, а затем молодой проект был перепрограммирован на язык С.
Как и любой большой и долгоживущий проект, X Window обладает массой специфических достоинств и недостатков. К достоинствам относиться то, что X Window работает, и работает хорошо (даже в приложениях относящихся к mission critical). X Window развивается, в настоящее время уже версия 11.6(X11R6) и уже активно идёт подготовка к выпуску версии 7). А также X Window так и осталась уникальной системой, у которой нет реальной альтернативы с 1987г. Недостатки системы были критичными только на ранней стадии использования, ругали обоснованно и необоснованно конкретные реализации и по мере развития системы по мере сил недостатки убирались. Несмотря на сетевой характер X Window не имела сетевой защиты, а также элементарно можно было получить сетевой доступ к компьютеру, использующему эту графическую подсистему. Вдобавок X Window была чрезвычайно прожорлива к системным ресурсам. К счастью эти особенности остались в прошлом.
X Window System позволяет рисовать на экране дисплея графические изображения, поддерживать концепцию окон и унифицировать работу с различными устройствами на основе библиотеки Xlib (именно о программировании на Xlib и будет идти речь в данном учебнике). Xlib — X library, это библиотека нижнего уровня, реализующая интерфейс X протокола к языку C и является основой для всех программ для X Window. Для того чтобы облегчить программирование с применением Xlib (X11) и упростить создание пользовательских интерфейсов, существует несколько пакетов, из которых наиболее широко распространены X Toolkit Intrinsics (Xt), Athena (Xaw) и Motif (Xm). В последние годы появились два новых пакета: GTK+ и Qt, лежащих в основе популярных среди пользователей Linux графических интерфейсов GNOME и KDE.
Конечно, использовать Qt для разработки приложения на C очень удобно, но чтобы более глубоко понять устройство X Window System, нужно заглянуть под покров библиотек Qt и GTK, умение писать Xlib приложения может оказаться полезным.
Источник
Linux xlib создание окна
Xlib — это библиотека, позволяющая программам на языке C рисовать на экране любого X-сервера — локального или удаленного. Все, что для этого требуется — вставить в исходный файл программы строку «include «, добавить в Makefile ключ компоновщика -lX11 , и вот вы уже готовы к вызову любой функции из библиотеки Xlib.
Для примера рассмотрим как нарисовать окно на экране локального компьютера. Это можно сделать следующим образом:
Listing 1: http://gazette.linux.ru.net/lg78/articles/misc/tougher/example1.cpp.txt
Скомпилируйте программу командой:
И, вуаля, в течение 10 секунд можете любоваться окном на экране:
Рисунок. Если очень хочется — можнопосмотреть на http://gazette.linux.ru.net/lg78/articles/misc/tougher/screen_small.png
Цель данной статьи — познакомить вас с некоторыми простыми классами, которые можно использовать при разработке Xlib-приложений. Мы создадим приложение с одним окном и кнопкой в этом окне. Кнопку мы напишем сами, используя только библиотеку Xlib.
2. Почему не используются визуальные элементы (виджеты)?
Вы можете задаться вопросом: «А почему бы не использовать библиотеки визуальных элементов (виджетов), скажем QT (http://www.trolltech.com/) или GTK (http://www.gtk.org/) ?». Законный вопрос. Я использую QT, и нахожу ее очень удобной для разработки приложений на C++ для платформы Linux.
Причина, по которой я пишу эти строки, заключается в намерении дать вам более глубокое понимание X Window System, а для этого нужно заглянуть под покров библиотек QT и GTK. Несколько раз уже я приходил к выводу, что умение писать Xlib приложения действительно полезно .
Я надеюсь, что эта статья поможет вам использовать имеющиеся классы в ваших приложениях.
3. Основы
В этом разделе мы пройдемся по основным особенностям библиотеки Xlib. Давайте сейчас рассмотрим исходный код примера.
3.1 Открытие дисплея
Первый класс, который создается в программе — это класс display (http://gazette.linux.ru.net/lg78/articles/misc/tougher/display.hpp.txt) , основная задача которого — открытие и закрытие дисплея. Заметьте, что в примере examle1.cpp, дисплей не закрывается явно с помощью вызова XCloseDisplay(). Дисплей будет закрыт самим классом display перед завершением программы. Немножко усложним наш пример, и он уже выглядит вот так:
Listing 2: http://gazette.linux.ru.net/lg78/articles/misc/tougher/example2.cpp.txt
Собственно, ничего особенного. Все то же самое — открывается и закрывается дисплей. Однако, вы наверняка заметили, что экземпляр класса display в данной реализации (http://gazette.linux.ru.net/lg78/articles/misc/tougher/display.hpp.txt) приводится к типу Display*, таким образом, создавая экземпляр этого класса , вы в действительности получаете указатель на Xlib Display.
Конечно же вы заметили и блок try/catch. Все классы в данной статье для извещения об ошибках порождают исключения.
3.2 Создание окна
Далее, я хотел бы упростить процесс создания окна, для этого я добавлю класс window (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window.hpp.txt) . Этот класс создает и отрисовывает окно в конструкторе, а «разрушает» окно в деструкторе. Теперь пример выглядит так (обратите внимание на класс event_dispatcher, который мы рассмотрим несколько ниже):
Listing 3 : http://gazette.linux.ru.net/lg78/articles/misc/tougher/example3.cpp.txt
Обратите внимание на то, что наш класс main_window порожден от класса xlib::window . Когда создается объект main_window, вызывается базовый конструктор, который создает окно Xlib.
3.3 Обработка событий
Вы наверняка обратили внимание на класс event_dispatcher (http://gazette.linux.ru.net/lg78/articles/misc/tougher/event_dispatcher.hpp.txt ) в последнем примере. Этот класс получает события из очереди событий приложения и передает их требуемому окну.
Определен этот класс следующим образом:
Listing 4 : http://gazette.linux.ru.net/lg78/articlesmisc/tougher/event_dispatcher.hpp.txt
Класс event_dispatcher передает события классу окна через интерфейс класса window_base (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window_base.hpp.txt) . Все классы окон, в этой статье, являются наследниками именно этого класса и, после регистрации себя вызовом метода register_window , могут получать сообщения от диспетчера. Из объявления класса window_base (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window_base.hpp.txt) следует, что все классы, порождаемые от него, смогут получать события, реализовав следующие методы:
Listing 5 : window_base.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window_base.hpp.txt)
Давайте проверим, а так ли это в действительности? Попробуем обработать событие ButtonPress в нашем окне. Добавим в определение нашего класса main_window следующий код:
Listing 6 : example4.cpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example4.cpp.txt)
Скомпилируйте и запустите приложение, а потом щелкните в окне мышкой. Код сработал! Класс event_dispatcher получил событие ButtonPress и передал его в наше окно через вызов предопределенного метода on_left_button_down .
3.4 Рисование
Теперь попробуем рисовать в нашем окне. Система X Window определяет концепцию «графического контекста» («graphics context»), поэтому я, естественно, создаю класс graphics_context . Вот определение класса:
Listing 7 : graphics_context.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/graphics_context.hpp.txt)
Передав этому классу id окна и объект display, вы, используя для этого соответствующие методы, получаете возможность рисовать на поверхности окна. Давайте попробуем. Добавьте в наш пример следующий код:
Listing 8 : example5.cpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example5.cpp.txt)
Метод on_expose() вызывается всякий раз, когда окно выводится на экран. Внутри этого метода я разместил код, на поверхности окна (в клиентской его области) рисующий линию и выводящий некоторый текст. Когда вы скомпилируете и запустите этот пример, то вы должны увидеть примерно следующее:
Рисунок на http://gazette.linux.ru.net/lg78/articles/misc/tougher/draw_line.png
Класс graphics_context широко используется в данной статье.
Вы могли заметить в выше приведенном коде два вспомогательных класса: point и line (http://gazette.linux.ru.net/lg78/articles/misc/tougher/shapes.hpp.txt) . Эти маленькие классы, которые я создал для упрощения построения фигур. Сейчас они не столь необходимы, но позднее, когда потребуется выполнять комплексные операции типа трансформации фигур, они окажутся полезными. Например, куда как проще написать «line.move_x(5)», чем «line_x += 5; line_y += 5;». И проще, и ниже вероятность допустить ошибку.
4. Создание кнопки
4.1 Требования к кнопке
Давайте приступим к созданию визуального элемента, который потом может быть использован в других наших программах. Требования к кнопке можно выразить так:
- должна иметь свое окно для приема событий
- должна иметь два состояния — «нажатая кнопка» и «отпущенная кнопка»
- должна отображаться как «нажатая» при нажатии на нее кнопкой мыши (т.е. когда указатель мыши неподвижно расположен над кнопкой)
- должна отображаться как «ненажатая» если кнопка мыши отпущена, либо когда указатель мыши находится вне пределов кнопки
- должна иметь свойство text и методы get и set для управления им
- должна передавать клиенту событие «on_click()»
Выглядит довольно просто, но реализация всего этого не столь тривиальная задача.
4.2 Создание собственного окна
Для начала создается отдельное окно кнопки. Конструктор вызывает метод show , который в свою очередь передает управление методу create , ответственному за создание окна:
Listing 9 : command_button.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt)
Очень похоже на конструктор класса window , не так ли? Первым делом создается окно с помощью вызова Xlib API XCreateSimpleWindow(), затем окно регистрируется в event_dispatcher, включаясь тем самым в цикл обработки событий, и наконец — устанавливается фон.
Примечательно, что в XCreateSimpleWindow() передается id родительского окна, тем самым сообщая Xlib, что кнопка является дочерним окном указанного родителя.
4.3 Реализация состояний «нажатая» и «отпущенная»
Поскольку кнопка регистрирует свое окно в event_dispatcher, появляется возможность при необходимости перерисовки получать события on_expose() . Для отображения обоих состояний кнопки используется класс graphics_context .
Ниже показан ход отображения «отпущенной» кнопки
Listing 10 : command_button.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt)
После компиляции и запуска приложения, кнопка будет выглядеть примерно так:
Рисунок на http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.png
Следующий фрагмент кода рисует «нажатую» кнопку:
Listing 11 : command_button.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt)
Нажатая кнопка выглядит так:
Рисунок на http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button_pressed.png
4.4 Дополнительные аспекты при отображении состояния кнопки
Казалось бы, все довольно просто: когда над кнопкой нажимается клавиша мыши — рисуется «нажатая» кнопка, а когда клавиша мыши отпускается — рисуется «отпущенная». Однако это не совсем верно. Если над изображением кнопки нажимается, а затем удерживается в нажатом состоянии, левая клавиша мыши, а после этого указатель мыши перемещается за пределы кнопки, то, не смотря на то, что клавиша мыши остается нажатой, кнопка должна отобразить состояние «отпущенная».
Для обработки такой ситуации класс command_button (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt) имеет два поля — m_is_down и m_is_mouse_over . Сначала, нажатие клавиши мыши над кнопкой (смотри on_left_button_down() ) переводит ее в состояние «нажатая» и перерисовывает ее, затем, если курсор мыши выводится за пределы кнопки (смотри on_mouse_exit() ), то поле m_is_mouse_over устанавливается в состояние false и кнопка опять перерисовывается, но уже как «отпущенная». Если теперь курсор мыши опять переместить на кнопку, то поле m_is_mouse_over перейдет в состояние true и кнопка будет перерисована как «нажатая». Когда клавиша мыши отпускается, то кнопка переводится в состояние «отпущенная» и перерисовывается.
4.5 Свойство «text»
Реализация свойства «text» — довольно простая задача. Для управления этим свойством в распоряжение программиста предоставляется два метода: первый — получить текст надписи на кнопке, второй — изменить его:
Listing 12 : command_button.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt)
Вызов метода refresh() служит для отображения кнопки с обновленной надписью.
4.6 Генерация события «on_click()»
Теперь необходимо снабдить нашу кнопку возможностью порождать событие «on_click()» в тот момент, когда по ней производится щелчок мышью. Ниже приведено определение класса command_button_base :
Listing 13 : command_button_base.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button_base.hpp.txt)
По существу этот код утверждает: «кнопка поддерживает все события, которые поддерживает класс окна, плюс еще одно — on_click()». В результате, породив дочерний класс, программист получает возможность реализовать метод on_click() для выполнения необходимых действий.
5. Заключение
Я надеюсь, что вам понравилась эта статья. Мы рассмотрели некоторые из свойств библиотеки Xlib и «завернули» их в классы C++, чтобы сделать разработку программ на основе Xlib проще. Если у вас есть какие либо вопросы, комментарии или предложения по данной статье или по работе с Xlib в целом, можете написать мне..
a. Ссылки
- www.xfree86.org — домашняя страничка XFree86, open-source реализация X Window System
- Xlib Programming Manual (http://tronche.com/gui/x/xlib/) — замечательный ресурс для тех, кто работает с Xlib.
- The X Protocol (http://www.x.org/about_x.htm) — информация об X протоколе на сайте www.x.org
b. Файлы
- Примеры
- Makefile (http://gazette.linux.ru.net/lg78/articles/misc/tougher/Makefile.txt) — для компиляции всех примеров
- Example1 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example1.cpp.txt) — создание простого окна с помощью Xlib
- Example2 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example2.cpp.txt) — использование класса display
- Example3 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example3.cpp.txt) — использование класса window
- Example4 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example4.cpp.txt) — обработка событий с помощью event_dispatcher
- Example5 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example5.cpp.txt) — рисование линий и текста с помощью класса graphics_context
- Example6 (http://gazette.linux.ru.net/lg78/articles/misc/tougher/example6.cpp.txt) — наша кнопка в действии
- классы xlib++
- shapes.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/shapes.hpp.txt) — содержит различные классы фигур
- character.hpp, (http://gazette.linux.ru.net/lg78/articles/misc/tougher/character.hpp.txt) color.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/color.hpp.txt) — вспомогательные классы
- command_button_base.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button_base.hpp.txt) — абстрактный класс command_button_base
- command_button.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/command_button.hpp.txt) — класс command_button
- event_dispatcher.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/event_dispatcher.hpp.txt) — класс event_dispatcher для обработки событий
- display.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/display.hpp.txt) — класс display
- exceptions.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/exceptions.hpp.txt) — различные классы исключений
- graphics_context.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/graphics_context.hpp.txt) — класс для рисования graphics_context
- window_base.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window_base.hpp.txt) — абстрактный класс window_base
- window.hpp (http://gazette.linux.ru.net/lg78/articles/misc/tougher/window.hpp.txt) — класс window для создания окна
- COPYING (http://gazette.linux.ru.net/lg78/articles/misc/tougher/COPYING.txt) — Информация об авторском праве на исходные тексты в данной статье
Rob Tougher
Роб — пишущий на C++ программист из Нью-Йорка. В свободное от работы время его можно найти прогуливающимся по пляжу со своей девушкой Николь (Nicole) и их собакой Холли (Halley).
Copyright (C) 2002, Rob Tougher.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 78 of Linux Gazette , May 2002
Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн, Андрей Киселев
Источник