Сегодня я хочу рассказать о таком полезном явлении в wxWidgets, как плавающие
окна (Docking Windows). Со временем, каждого из нас посещает желание, так или
иначе, сделать интерфейс своих программных продуктов более привлекательным и
более удобным. Одним из способов достичь этого являются плавающие окна.
Использование плавающих панелей инструментов, информационных и прочих панелей в
приложении, позволяет настроить внешний вид программного продукта, которым вы
пользуетесь очень часто, как говорится «под себя» и тем самым сделать работу с
ним более комфортной. Эта возможность используется во многих современных
приложениях и многие пользователи, сами того не замечая, уже давно привыкли к
ней.
Итак, начнем наше знакомство…
Создадим простейшее приложение wxWidgets.
В настройках Application Type необходимо указать Windows Application, а в
Additional Properties выставить флаг Empty Project
Добавим заголовочные файлы и файлы исходного кода в наше приложение
Запускаем. У нас должно получиться простейшее окно с меню и строкой
состояния.
Итак, база у нас готова, теперь можно приступать к созданию плавающих панелей
(Docking Windows).
Поодержка Docking Windows в wxWidgets реализована библиотекой wxAUI, которая с
недавнего времени является частью wxWidgets. Основным элементом движка,
отвечающего за работу Docking Windows, является класс
wxAuiManager. Этот класс отвечает за размещение плавающих окон, установку
их размеров и параметров в процессе работы приложения.
Внесем некоторые изменения в наш исходный код и посмотрим, что получилось.
Для ассоциации менеджера плавающих окон с формой необходимо вызвать метод
wxAuiManager::SetManagedWindow() и передать в
качестве параметр указатель на объект класса wxFrame (или производного). В нашем
примере это реализовано строкой
m_Manager.SetManagedWindow(this);
Перед тем, как форма, ассоциированная с менеджером плавающих окон будет удалена,
необходимо обязательно произвести деинициализацию менеджера. Лучше всего это
делать в деструкторе класса формы. В нашем примере это строка
m_Manager.UnInit();
После внесения изменений необходимо сообщить менеджеру плавающих окон о том, что
необходимо применить эти изменения. Это можно сделать, вызвав метод
wxAuiManager::Update. В нашем примере єто
реализуется строкой m_Manager.Update().
Для создания плавающей панели необходимо вызвать метод
wxAuiManager::AddPane, котрому в качестве параметров передать указатель
на компонент, который будет помещен на плавающую панель, а также объект
wxAuiPaneInfo, который описывает параметры
плавающей панели.
Теперь пара слов о том, что же делает приведенный выше пример.
В дополнение к уже созданным панели меню и строке состояния, мы создаем две
плавающие панели инструментов, wxAuiNotebook с
двумя страницами в центре формы и плавающий wxTreeCtrl.
Как видно из исходного кода, мы используем несколько XPM-изображений в качестве
иконок для кнопок панели инструментов. Эти изображения можно взять в подкаталоге
art каталога с исходным кодом wxWidgets.
Теперь наше приложение выглядит подобным образом.
Панели инструментов и плавающее дерево можно размещать в слева, справа,
сверху или снизу от центральной панели (на которой находится
wxAuiNotebook). Центральная панель – это
основная рабочая область приложения и она не может и не должна быть отстыкована
от формы, ассоциированной с менеджером плавающих окон.
При перемещении плавающей панели с помощью мышки над областью, где возможна
стыковка панели с главным окном, отображается полупрозрачный прямоугольник,
показывающий область возможной стыковки.
Страницы нашего wxAuiNotebook можно
перетаскивать и размещать рядом друг с другм по горизонтали илм по вертикали
У каждой плавающей панели есть свойство, разрешающее или запрещающее
отстыковку от главной формы. Отстыкованные панели (а также неотстыкованные, при
условии установленного флага HasCloseButton())
имеют кнопку закрытия, которая позволяет скрыть плавающую панель. При нажатии на
кнопку закрытия, панель и связанный с ней компонент не удаляются, а становятся
невидимыми (если не установлен флаг IsDestroyOnClose(),
который обеспечивает удаление панели и связанного с ней компонента при закрытии
панели).
.
В нашем примере существует возможность скрытия плавающей панели с деревом, но
нет возможности заново отобразить скрытую панель. Давайте исправим эту ситуацию.
Добавим новый пункт меню и обработчик к нему, а также изменим свойства уже
существующих пунктов меню View и добавим к ним обработчики событий.
Как видно из исходного кода, основной функционал, связанный с
отображением/скрытием плавающих панелей обеспечивается методами
DockingWindowsSampleMainFrame::GetPaneVisibility
и DockingWindowsSampleMainFrame::TogglePaneVisibility.
В качестве параметра мы передаем имя плавающей панели, далее выполняется поиск
панели с указанным именем, и производятся необходимые действия. Список панелей
можно получить с помощью метода
wxAuiManager::GetAllPanes.
Из такого вида формы
вот такой
Существует также возможность задания позиции панели на форме (положение в
ряду и номер ряда).
Номер позиции в ряду задается методом
wxAuiPaneInfo::Position, а номер ряда методом
wxAuiPaneInfo::Layer.
Например, для указания того, что дополнительная панель инструментов должна
находиться на первой позиции, а главная панель инструментов – на второй в первом
ряду, нам необходимо при создании панелей использовать следующий код:
Библиотека wxAUI предоставляет возможность сохранения и загрузки общего
расположения панелей. Общее расположение панелей называется перспективой
(Perspective).
Для получения настроек расположения панелей используется метод
wxAuiManager::SavePerspective, а для установки –
метод wxAuiManager::LoadPerspective.
Давайте добавим в наш пример возможность загрузки и сохранения перспектив.
После сохранения, файл .layout будет содержать параметры всех панелей.
Необходимо запомнить, что при внесении изменений в приложение, в случае, если
некоторые панели біли удалены и больше не используются (в случаях, когда
менеджер плавающих окон не содержит некоторых пенелей из .layout файла), такой
.layout файл использовать нельзя.
Ну вот, для первого раза достаточно. В следующий раз расскажу о поддержке
скинов библиотекой wxAUI и о возможностях настройки внешнего вида плавающих
панелей.
При разработке CMS S.Builder наша команда
активно использовала AJAX. Теперь вот решили поделиться накопленным
опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные
фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в
S.Builder написана библиотека
sbAJAX. Можете качать и пользоваться :). В этом файле есть функция
sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке
на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет
или полезут баги. Эта функция как раз решает поставленную задачу.
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной
версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и
гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и
имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией
Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые
другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все
внимание на флагманский продукт —
Dojo
1.2.
Если вы профессиональный веб-разработчик и постоянно имеете дело с
разработкой и отладкой сложных AJAX приложений, то наверняка знаете и
используете Firebug — плагин для браузера
Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его
версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем,
которые могут возникнуть при разработке. Но и этот инструмент не лишён если не
недостатков, то некоторых фич, которые могли бы облегчить работу. И даже
идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.