Файл: Средства разработки клиентских программ (Архитектура клиент-сервер).pdf
Добавлен: 23.04.2023
Просмотров: 907
Скачиваний: 7
СОДЕРЖАНИЕ
Глава 1. Обзор архитектуры клиентских приложений
1.2 Эволюция архитектуры клиент-сервер
1.3 Классы приложений клиент-сервер
Глава 2. Обзор API для создания клиентских приложений
2.1.1 Создание клиентских приложений в Windows.
2.1.3 Платформенно-независимые оконные API
2.2 Разработка клиентских приложений для web-ресурсов
После описания и регистрации в системе класс окна, приложение на его основе может создать множество различных окон. Создание окна выполняется функцией Win32 API CreateWindowEx. В качестве результата функция возвращает уникальный дескриптор окна hWnd, который необходимо сохранить.
Какой именно кнопке послано сообщение, оконная функция определяет по полю hwnd в структуре сообщения. Наличие одного класса для всех кнопок гарантирует их одинаковое поведение.
Все параметры, передаваемые функции CreateWindowEx, сохраняются в создаваемой Windows внутренней структуре CREATESTRUCT.
Параметр hlnst— дескриптор приложения, создающего окно.
Параметр hMenu — дескриптор главного меню окна.
Параметр hWndParent — дескриптор родительского окна.
Параметр dwStyle определяет стиль окна приложения.
Параметр szTitleName — указатель на ASCII-строку содержащее имя класса окна
Параметр szClassName — указатель на ASCII-строку содержащее текст, помещаемый в заголовок окна.
Параметр dwExStyle задаёт дополнительные стили окна.
В качестве результата функция CreateWindowExA возвращает дескриптор окна hWnd. Он имеет уникальное значение и является одним из важнейших описателей объектов приложения. Он передается как параметр многим функциям Win32 API и как значение полей в некоторых структурах. Дескриптор hWnd однозначно идентифицирует то окно в Windows, для работы с которым вызывается какая-либо функция Win32 API. Также результатом работы функции CreateWindowExA является посылка асинхронного сообщения WMCREATE в оконную функцию приложения.
В случае успешного выполнения функции CreateWindowExA требуемое окно будет создано, но пока это произойдет лишь внутри самой системы Windows — на экране это новое окно пока еще не отобразится. Для того чтобы созданное окно появилось на экране, необходимо применить еще одну функцию Win32 API — ShowWindowA. В качестве параметров этой функции передаются дескриптор hWnd окна, которое необходимо отобразить на экране, и константа, задающая начальный вид окна на экране. В зависимости от значения последнего параметра окно отображается в стандартном виде, развернутым на весь экран или свернутым в значок. Весь вывод на экран должен производиться в оконной функции [11].
Это показывает роль сообщений (и не только WMPAINT), циркулирующих в системе.
Сообщение в Win32 - это объект особой структуры, формируемый Windows. Формирование и доставка этого объекта в нужное место в системе позволяют управлять работой как самой системы Windows, так и загруженных Windows-приложений. Инициировать формирование сообщения могут несколько источников: пользователь, само приложение, система Windows, другие приложения. Именно наличие механизма сообщений позволяет Windows реализовать многозадачность, которая при работе на одном процессоре является, конечно же, псевдо мультизадачностью. Windows поддерживает очередь сообщений для каждого приложения [5].
Если в системе произошло какое-то событие, например, некоторому приложению необходимо перерисовать свое окно, в результате чего система Windows сформировала сообщение WMPAINT. Данное сообщение попадает в очередь сообщений приложения, создавшего окно.
Выход из цикла обработки сообщений означает одно — необходимо завершить программу. В программе на C/C++ для этого непосредственно за циклом обработки сообщений помешается оператор return: return LpMsg.wParam;
Оконная функция призвана организовать адекватную реакцию со стороны Windows-приложения на действия пользователя и поддерживать в актуальном состоянии то окно приложения, сообщения которого она обрабатывает.
В схеме, реализованной в Windows, обработка сообщений приложением проводится в два этапа: на первом этапе приложение выбирает сообщение из очереди и отправляет его обратно во внутренние структуры Windows; на втором этапе Windows вызывает нужную оконную функцию приложения, передавая ей параметры сообщения. Преимущество этой схемы в том, что Windows самостоятельно решает все вопросы организации эффективной работы приложений.
Таким образом, при поступлении сообщения Windows вызывает оконную функцию и передает ей ряд параметров. Все они берутся из соответствующих полей сообщения. В нотации языка C/C++ заголовок оконной функции описан следующим образом:
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAH LParam)
Здесь hWnd — дескриптор окна, которому предназначено сообщение; message — идентификатор сообщения, характеризующий тип сообщения; wParam и IParam — дополнительные параметры, являющиеся копиями соответствующих полей структуры поступившего сообщения.
Центральным местом оконной функции является синтаксическая конструкция, в задачу которой входит распознавание поступившего сообщения по его типу (параметр message) и передача управления на ту ветвь кода оконной функции, которая продолжает далее работу с параметрами сообщения. В языке C/C++ для этого используется оператор switch (переключатель).
Представленная схема показывает, что оконная функция, обрабатывающая сообщения, имеет одну точку входа и множество точек выхода. Выход осуществляется из той ветви оконной функции, где обрабатывалось сообщение. Сообщения, для которых не предусмотрена отдельная обработка, должны обрабатываться функцией DefWindowProc. Эта процедура по отношению к переданным ей сообщениям предпринимает действия по умолчанию.
2.1.2 Создание клиентских приложений в ОС Linux.
Введение в систему X.
Система X первоначально разработанная в MIT (Массачусетский технологический институт) вначале 1980 гг., имеет длинную и яркую историю. Она была создана в качестве унифицированной оконной системы для высокопроизводительных рабочих станций того времени.
Одной из наиболее передовых и в результате разочаровывающих характеристик X является жесткая привязка к идеологии "инструментов, а не политики". Это означает, что в системе X не существует определения какого-нибудь пользовательского интерфейса» но имеются средства для его создания. Программист может создавать полностью свою собственную среду рабочего стола, добавляя совершенно новые элементы при желании
Х-сервер находится в состоянии ожидания ввода и передаёт нажатия клавиш и щелчки мыши в приложения Х-клиентам. Такие сообщения называются событиями; они являются ключевыми элементами программирования GUI.
Х-клиент — все программы, использующие X Window System как GUI. Например xterm, xcalc и другие более сложные приложения, например. Abiword. Х-клиент ожидает события от пользователя, которые посылаются Х-сервером, затем он отвечает на них путём отправки серверу сообщений об внесение изменений в изображение.
Х-клиент и Х-сервер взаимодействуют друг с другом посредством Х-протокола, это протокол позволяет клиентам и серверу быть установленными на разных машинах в сети. Например, можно запустить Х-клиент на удаленном компьютере через Интернет VPN. В большинстве PC Х-сервер и Х-клиент и работают на одной и той же машине.
Для генерации сообщений Х-протокола Х-клиент использует библиотеку Xlib. Эта библиотека предлагает свой API, который позволяет клиентам отрисовывать простейшие элементы и откликаться на простейший ввод. Xlib является библиотекой очень низкого уровня, и разработка с ее применением даже простого меню, будет невероятно трудоемким процессом с сотнями строк кода [9].
Разработчики GUI не могут эффективно программировать непосредственно при помощи Xlib. Для этого им требуется API, делающий более простым создание таких элементов GUI, как списки, панели меню, кнопки и т.д. Эту роль выполняет комплекты инструментальных средств или комплекты элементов интерфейса.
Комплекты инструментов. Оконные менеджеры
Комплект элементов интерфейса - это библиотека GUI, применяемая Х-клиентами для упрощения создания панелей меню, окон и т. д. С помощью комплекта элементов интерфейса программист можете создать окна, флажки и тому подобное посредством вызовов одной функции. Виджеты - это общий термин для обозначения элементов GUI. Они являются универсальными элементами, которые можно найти во всех современных библиотеках GUI.
Из массы комплектов элементов интерфейса для системы X можно выбирать те, которые обладают нужными достоинствами. Вопрос о том какой комплект выбрать является важным проектным решением для приложения, поэтому рекомендуется брать в расчёт следующие факторы:
- Для чего предназначено приложение?
- Есть ли библиотеки комплекта элементов у пользователей?
- Присутствует ли комплект элементов в других популярных ОС?
- На какой лицензии распространяется комплект?
- Есть ли поддержка нужного языка программирования?
В течение многих лет наиболее популярными комплектами инструментальных средств были OpenLook, Motif, и Xt, но затем они уступили более совершенным комплектам GTK+ и Qt, формирующим основу рабочих столов GNOME и KDE соответственно.
Оконный менеджер или диспетчер отвечает за положение окна на экране. Диспетчер часто поддерживает отдельные "рабочие области", на которые может делиться рабочий стол, чтобы увеличить область экрана, с которой пользователь можете работать. Также оконный диспетчер ответственен за графическое оформление окна, состоящее, обычно, из полосы заголовка и пиктограмм минимизации, максимизации и закрытия окна. Оконные диспетчеры частично обеспечивают внешний вид рабочего стола, например заголовки окон [12].
Наиболее популярные оконные менеджеры:
- Metacity — используется для рабочего стола GNOME по умолчанию;
- KWin—применяется для рабочего стола KDE по умолчанию;
- Openbox— разработан для запуска на системах с сильно ограниченными ресурсами, запускается на медленных и старых системах;
- Enlightenment—отображает превосходную графику и спецэффекты.
Оконные диспетчеры в системе X можно переключать.
Введение в GTK+
Вначале GTK+ был лишь частью одного из популярных графических редакторов GNU Imаgе Маnipulation Program (GIMР), от него он и получил своё имя (Thе Gimр ToоlKit). Затем GTK+ стал самостоятельным проектом, сейчас он один из самых мощных и популярных комплектов инструментов.
Комплект GTK+ полностью реализован на языке С и преобладающая часть программного обеспечения GTK+ тоже реализована на С. В GTK, присутствуют привязки к некоторым языкам (language binding), которые позволяют применять GTK+ с предпочитаемыми языками программирования: С++, Python. PHP, Ruby, Perl, C# или Java.
Комплект GTK+ был создан в качестве надстройки для нескольких других библиотек. К этим библиотекам относятся следующие:
- Glib – это ряд низкоуровневых структур данных, типы, которые обеспечивают многопоточную разработку, циклы событий и динамическую загрузку;
- GObjec - реализация объектно-ориентированной системы на языке С, благодаря которой не требуется применять язык С++;
- Pango - поддержка визуализации и форматирования текста;
- АТК— используется для создания приложений которые пользователи могут запускать используя средства чтения экрана и другие средства доступа;
- GDK (GIMP Drawing Kit) – используется для обработки визуализации низкоуровневой графики поверх библиотеки Xlib;
- GdkPixbuf - используется для манипуляции изображениями в программах созданных с помощью GTK+;
- Xlib – используется для работы с низкоуровневой графикой в системах Linux и UNIX.
GLib и GObject - библиотеки переносимости языка С, на которых основан набор средств GTK+, они определяют эти типы для того, чтобы реализовать возможность межплатформенных разработок.
GLib и GObject обеспечивают стандартные наборы типов данных замещения, функций и макросов, поддержку управления памятью и общих задач, что помогает межплатформным разработкам,
Все современные комплекты инструментов, включая GTK.+, написаны в объектно-ориентированном стиле программирования.
Независимо от того, что набор инструментов GTK+ реализован на чистом С, благодаря библиотеке GObject он имеет поддержку объектов и ООП. Библиотека GObject поддерживает концепцию наследования объектов и полиморфизма с помощью макросов.
Все функции, которые предназначены для создания виджетов, должны возвращать тип GtkWidget [9].
Каркасное приложение средствами GTK+
Далее приведён фрагмент простейшей из программ GUI, созданной средствами GTK+ - отображение окна.
#include <gtk/gtk.h>
int main (int _argc, char *_argv[]) (
GtkWidget *_window;
gtk_init(&_argc, &_argv);
_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show(_window);
gtk_main ();
return 0;
)
Как видно из листинга библиотеки GTK+ в действии и большой набор функциональных возможностей, получаемых из очень короткого программного кода.
Для начала программирования средствами GTK+ необходимо включить заголовочные файлы, необходимые для библиотек GTK+ и связанных с ними библиотек с помощью одного оператора #include <gtk/gtk.h>. Далее объявлено окно как указатель на объект Gtkwidget.
Затем для инициализации библиотек GTK+ следует выполнить вызов gtkimt, передав аргументы командной строки _argc и _argv. Это дает возможность GTK+ выполнить синтаксический анализ любых параметров командной строки, о которых комплект должен знать. Необходимо всегда инициализировать GTK + таким способом перед вызовом любых функций GTK+.
Суть примера заключается в вызове функции gtkwindownew. Далее приведен ее прототип:
GtkWidget* gtk windownew (GtkWindowType type) ;
Параметр type может принимать в зависимости от назначения окна одно из двух значений:
- gtk_window_toplevel — стандартное окно с рамкой;
- gtkwindowpopup — окно без рамки, подходящее для диалогового окна.
Почти всегда применяется значение gtk_window_toplevel, потому что для создания диалоговых окон есть гораздо более удобные способы.
Вызов gtk_window_new создает окно в памяти, таким образом, у программиста появляется возможность перед реальным выводом окна на экран заполнить его виджетами, изменить размер окна, его заголовок и т.д. Для того чтобы окно появилось на экране, происходит вызов функции gtk_widget_show: