О графических библиотеках

  1. Лирическое наступление
  2. Общая информация
  3. Обзор библиотек
    1. MFC
    2. GTK
    3. Qt
    4. wxWindows (wxFrames)

Лирическое наступление

В этом опусе рассмотрено несколько популярных платформеннонезависимых библиотек для языков C/C++ для построения графических интерфейсов. В отличие от Java, языки C и C++ не содержат стандартной библиотеки для разработки графического интерфейса пользователя (GUI). Возможно, такая ситуация объясняется тем что, что эти языки появились до широко распространения графических интерфейсов. Поэтому C/C++ содержат стандартную библиотеку консольного ввода/вывода, а для построения GUI используются сторонние библиотеки.

Общая информация

Как правило, GUI основан на событийной модели поведения программы. Обычная консольная программа представляет собой набор функций, которые последовательно вызывают друг друга. GUI-приложение же содержит набор функций, которые прямо не связаны друг с другом и вызываются операционной системой при наступлении тех или иных событий: перемещение мыши, нажатие кнопки на клавиатуре, выбора пункта меню, выделение элемента в списке. Такие функции называются функциями "обратного вызова" (callback-functions). В терминахGUI-библиотек, которые вызываются в ответ на то или иное событие называются "обработчиками событий". Обычно соответствие между событием и его обработчиком устанавливается с помощью специальных макросов препроцессора.

Практически все GUI-библиотеки в той или иной степени поддерживают Common User Architecture (CUA), предложенную в свое время IBM. Этот стандарт определяет органы управления, с помощью которых пользователь может общаться с программой: меню (menu), кнопки (buttons), редакторы текста (editors), списки (listbox) и т.д. Эти органы управления в Windows называются controls, в UNIX - widgets.

В программе может быть много окон, поэтому необходимо иметь возможность создавать массивы различных типов окон. Списки (listbox) могут содержать списки различных объектов, например, строк или более сложных структур. По этой причине графические библиотеки содержат механизмы для построения массивов, списков, хэшей и т.д. для произвольных типов данных. Так как эти библиотеки начинали разрабатываться еще до того, как STL стала частью стандарта C++, библиотеки самостоятельно реализуют функциональность STL или ее части.

Библиотеки также могут содержать дополнительные классы, не имеющие отношения к построению GUI, но позволяющие писать платформеннонезависимые программы. Как правило имеются классы для работы с файловой системой, поддержки сетевых протоколов и т.д.

В Windows при размещении органов управления (дочерних окон) на поверхности окна их координаты задаются в виде абсолютных значений. По этой причине при изменении размеров окна программист должен самостоятельно перерасчитывать новые координаты дочерних окон. С другой стороны, использование шрифта другого размера или другого разрешения экрана также приводит и искажению вида окна. Некоторым решением это проблемы является использование диалоговых окон, размеры которых зависят от размеров используемого шрифта. Но, во-первых, остается проблема изменения размеров окна, во-вторых, использование в приложении другого языка (в результате этого изменяются длины строк, например Cancel и Отменить) также искажает внешний вид. В UNIX применяется другой подход - задаются не координаты виджетов, а их положение друг относительно друга. Для упрощения программирования применяются вспомогательные классы (менеджеры компоновок), которые управляют расположением и размерами элементов. При этом можно задать поведение виджета при его изменении. Например,у кнопки или однострочного редактора может изменяться только ширина, а высота остается неизменной, многострочный редактор или список могут изменяться в обоих направлениях. Такое поведение обычно задается один-двумя дополнительными параметрами.

С развитием процессов глобализации :) все чаще возникает необходимость (или желание програмиста) разрабатывать программы так, чтобы их интерфейс мог использовать сообщения на различных языках (так называемая интернационализация или internationalization, i18n, 18 - это число букв междуй первой i и последней n). В Windows для реализации таких особенностей автор программы должен самостоятельно разрабатывать методы хранения и работы с переводами интерфейса на другой язык. В UNIX применяется стандартный инструмент gettext. При ее использовании программисту достаточно вызвать несколько библиотечных функций и каким-либо образом выделить строки (обычно один-двумя дополнительными символами). В результате этих действий и применения инструментов gettext будет создан специальный файл, содержащий все сообщения, которые надо перевести. Выбор файла перевода и его загрузку в программу библиотека выполняет самостоятельно.

Так как от интерфейсной части программы не требуется большого быстродействия, то более рационально разрабатывать ее на каком-нибудь интерпретируемом языке, например Python, Ruby, Tk. Поэтому помимо собственно GUI-библиотек для языков C и C++ существуют и привязки к другим языкам, позволяющие полностью или частично использовать библиотеку в программах на этих языках.

Очень часто GUI-библиотеки распространяются под GNU Public License (GPL) или даже бесплатны для коммерческого применения.

Обзор библиотек

MFC

Microsoft foundation classes - библиотека классов, которая, как нетрудно догадаться программистами Microsoft. Стоит денег и немалых, а нас ведь в молодости учили, что воровать нехоршо :) IMHO, программировать на MFC не намного проще чем непосредственно на WinAPI. Такие возможности как менеджеры компоновок, интернационализация и т.д. Microsoft обещает сделать в следующей версии Windows. Библиотека упомянута в обзоре лишь потому, что большинство программистов пишут программы для Windows, знакомы с этой библиотекой и могут сравнить ее с другими.

GTK

Эта C-библиотека изначально проектировалась как набор виджетов для разработки графического редактора GIMP. Поддерживает все возможности описанные ранее. Распространяется под GPL. Существую биндинги для Python, Perl и ряда других языков. К недостаткам можно отнести не очень высокое качество документации. Библиотека располагается по адресу www.gtk.org.

Qt

C++-библиотека разработана фирмой Trolltech. Библиотека содержит множество классов как для построения интерфейсов, так и вспомогательных: реализующих функциональность классов STL, обеспечивающих поддержку сетевых протоколов и баз данных т.д. Классы очень удобны. Например для статического текста применяется класс QLabel. Такая метка может быть связана с другим виджетом и акселератор или горячую клавишу (hot-key). При нажатии на эту клавишу фокус будет передан на связанный виджет. Эта возможность очень полезна для создания в диалоговых окна подписей к редакторам текста, спискам и т.д.

Особенностью библиотеки является использование для связывания событий и их обработчиков механизма сигналов (signal) и слотов (slot). Такой подход является очень гибким, но требует дополнительных инструментов для преобразования сигналов и слотов в обычные мктоды C++. В Qt для этих целей применяется metobject compiler (moc), который в большинстве случаев запускается автоматически.

Библиотека содержит механиз интернационализации, аналогичный gettext, но существующий также и для Windows.

Библиотека содержит очень подробную и доходчивую документацию (правда, почему-то только на английском :). Для начала работы с библиотекой можно использовать поставляемый вместе с ней tutorial. В последнее время интернете появилсь книги об использовании Qt на русском языке.

Для Python существует привязка PyQt, использующая практически все возможности библиотеки. Существуют также биндинги для других языков.

Библиотека распространяется под несколькими лицензиями. Для коммерческого использования она стоит денег. Для UNIX существует GPL-версия. 4-я версия библиотеки для Windows также будет распространяться под GPL.

Скачачть библиотеку можно с сайта Trolltech.

wxWindows (wxFrames)

Еще одна библиотека для построения GUI. В отличие от GTK и Qt, это как бы кросплатформенная оболочка над системными средствами для разработки интерфейсов. В Windows классы библиотеки обращаются непосредственно к WinAPI, в UNIX - к библиотеке Motif или (что сейчас встречается чаще) к GTK.

Copyleft, 2005 Vadim A. Khohlov aka xvadim (xvadim AT newmail.ru)