Файл: Средства разработки клиентских программ (Архитектура клиент-сервер).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 23.04.2023

Просмотров: 907

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

После описания и регистрации в системе класс окна, приложение на его основе может создать множество различных окон. Создание окна выполняется функцией 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: