Организация графического интерфейса
Разрабатываемое в курсовом проектировании ПС должно быть обязательно оснащено графическим пользовательским интерфейсом, что соответствует современным тенденциям и требованиям рынка на ПО.
Под графическим пользовательским интерфейсом (GUI - Graphical User Interface) понимается некоторая система (среда), служащая для организации диалога ПС с пользователем на основе графического многооконного представления данных. В среде GUI организацию всего взаимодействия с пользователем берет на себя именно сама среда, оставляя ПС делать только свою работу.
К общим принципам, лежащим в основе графического пользовательского интерфейса, относятся:
- графический режим работы;
- представление ряда объектов пиктограммами;
- многооконность;
- использование указывающего устройства - мыши;
- адекватность изображения на экране изображаемому объекту (принцип WYSIWIG - What You See Is What You Get);
- наглядность;
- стандартизация всех основных действий и элементов (все программы для данной графической среды выглядят и ведут себя совершенно одинаково, используют одинаковые принципы функционирования);
- наличие большого числа стандартных элементов (кнопок, полей редактирования, переключателей и т.д.), которые могут использоваться при конструировании ПС, делая их похожими в обращении и облегчая процесс их написания.
В основе современного графического пользовательского интерфейса лежат две основные концепции.
Первой из них является понятие программы, управляемой данными.
Как правило, эта концепция практически реализуется через механизм сообщений. Внешние устройства (клавиатура, мышь, таймер) посылают сообщения модулям программы о наступлении тех или иных событий (например, при нажатии клавиши или передвижении мыши). Поступающие сообщения попадают в очередь сообщений, откуда извлекаются прикладной программой.
Таким образом, программа не должна все время опрашивать мышь, клавиатуру и другие устройства в ожидании, не произошло ли чего-нибудь, заслуживающего внимания. Когда событие произойдет, программа получит извещение об этом с тем, чтобы надлежащим образом его обработать. Поэтому программы для таких сред обычно представляют собой цикл обработки сообщений: извлечь очередное сообщение, обработать его, если оно интересно, либо передать стандартному обработчику сообщений, обычно входящему в систему и представляющему собой стандартные действия системы в ответ на то или иное событие.
Сообщения могут посылаться не только устройствами, но и отдельными частями программы (в частности, возможна посылка сообщения себе). Так один модуль может послать сообщение другому модулю, или меню посылает сообщение о выборе определенного пункта. При этом существует также способ прямой посылки сообщения, минуя очередь, когда непосредственно вызывается обработчик сообщений адресата.
Второй основополагающей концепцией является понятие окна как объекта. Окно - это не просто прямоугольная область на экране, это и программа (процедура, функция), способная выполнить различные действия, присущие окну. Одним из основных таких действий является реагирование на поступающие сообщения и посылка сообщений другим объектам.
Одной из основных функций окна является перерисовка содержания окна. Любое окно должно уметь при получении соответствующего запроса перерисовать себя (или свою часть) на экране. Перерисовка может реализовываться или как реакция на специальное сообщение, или как виртуальная функция (при использовании объектно-ориентированных языков). В состав любой GUI обязательно входит достаточно мощный графический модуль, обеспечивающий выполнение всех основных графических операций и поддерживающий отсечение изображения по заданной (в том числе и довольно сложной) области отсечения. За счет этого реализуется возможность перерисовки фрагмента окна - устанавливается область отсечения, совпадающая с требуемым фрагментом, а затем выполняется запрос на перерисовку. При отработке запроса на перерисовку окна можно определить размер текущей области и не пытаться рисовать то, что заведомо будет отсечено.
Среди окон вводятся отношения принадлежности и следования, т.е. любое окно может иметь окно-родителя, которому оно принадлежит, и, следовательно, задается во внутренних координатах родительского окна, отсекается в размерах родительским окном и уничтожается при уничтожении родительского окна. Любое окно может иметь и принадлежащие ему окна (подокна), причем последние некоторым образом упорядочиваются. Тем самым окна могут образовывать древовидные структуры подчинения.
Родительское окно и принадлежащие ему подокна могут обмениваться сообщениями друг с другом. Эти сообщения обычно разделяются на два класса - запрос на выполнение окном некоторого действия и сообщение, оповещающее окно о том, что в другом окне (обычно подокне) произошли некоторые изменения.
Любая подобная система должна предоставлять для работы некоторый стандартный набор типов окон, из которых пользователь может строить свои программы.
В состав окна могут входить другие окна и действовать при этом как единое целое. Например, в состав окна-списка может входить скроллер.
Среди окон обычно выделяются окна, предназначенные для ведения диалога с пользователем, ввода данных и т.п. Обычно в их основе лежит стандартное окно с большим набором подокон, играющих роль управляющих элементов. Как правило, диалоговое окно (или процедура, ведущая диалог) снабжается специальной функцией для координации работы управляющих элементов. Например, диалог для выбора файла.
Кроме стандартных окон пользователь может создавать свои собственные типы окон, либо добавляя какие-то новые свойства, либо переопределяя часть старых и наследующих все остальное.
При работе с клавиатурой важную роль играет понятие фокуса ввода. Фокус ввода - это то окно, которому поступают все сообщения от клавиатуры. Существует несколько способов перемещения фокуса ввода:
- при нажатии кнопки мыши фокус передается тому окну, над которым это произошло;
- окна диалога обычно переключают фокус между управляющими элементами диалога при нажатии определенных клавиш (стандартно это Tab и Shift-Tab);
- посредством явного вызова функции установки фокуса ввода.
Окну, теряющему фокус ввода, обычно посылается уведомление об этом, и оно может предотвратить переход фокуса от себя. Окну, получающему фокус, передается сообщение о том, что оно получило фокус ввода.