Руководство по программированию с wxWidgets (5. События).

Jan Bodnar, “The wxWidgets programming tutorial (5. Events)”, public translation into Russian from English More about this translation.

Translate into another language.

События.

Все GUI приложения управляются с помощью событий, являющихся их неотъемлемой частью. Приложение реагирует на различные типы событий, генерируемых во время его эксплуатации. Их источником в основном является пользователь. Однако, существуют и другие источники, например интернет соединение, оконный менеджер, таймер. При старте приложение запускает основной цикл, в котором оно благополучно пребывает в ожидании какого-нибудь события. Основной цикл прекращается при выходе из приложения.

Определения (описания).

Событие - часть информации прикладного уровня, лежащей в основе структуры, обычно набора инстурментов GUI (GUI toolkit). Событийный цикл - это программная конструкция, которая ожидает и диспетчеризирует события и сообщения в программе. Этот цикл постоянно находится в ожидании события для обработки. Диспетчер - это процесс прередающий события в обработчиках событий. Обработчики событий - это методы, реагирующие на события.

Событийный объект - это объект связанный с событием. Обычно это окно. Событийный тип - это уникальное сгенерированное событие

Пример простого события.

Традиционным способом работы с событиями в wxWidgets является использование статических таблиц событий. Это сказалось влияние MFC. Более гибким и современным способом является использование метода Connect(). Именно поэтому я использую этот способ на протяжении всего руководства.

Таблица событий.

В следующем примере мы покажем как использовать таблицы событий.

В нашем примере мы создали простую кнопку. Нажимая на кнопу, мы закрываем приложение.

private:

DECLARE_EVENT_TABLE()

В заголовочном файле мы объявили таблицу событий с помощью макроса DECLARE_EVENT_TABLE().

BEGIN_EVENT_TABLE(MyButton, wxFrame)

EVT_BUTTON(wxID_EXIT, MyButton::OnQuit)

END_EVENT_TABLE()

Мы реализовали таблицу событий путём сопоставления каждого события соответствующей функции члену.

Пример использования Connect().

Поговорим о событии перемещения. Оно содержит информацию о событиях изменения движения. Оно генерируется при перетаскивании окна на новую позицию. Классом, представляющим события перемещения является wxMoveEvent, а wxEVT_MOVE - событийным типом.

Пример показывает текущую позицию окна.

Connect(wxEVT_MOVE, wxMoveEventHandler(Move::OnMove));

Здесь мы соединили (connect) событийный тип wxEVT_MOVE с методом OnMove().

wxPoint size = event.GetPosition();

Параметр event в методе OnMove() - это объект специфичный для данного события. В нашем случае это экземпляр класса wxMoveEvent. Этот объект содержит информацию о событии. Мы можем выяснить текущую позицию, вызвав метод GetPosition() события.

Репродукция события.

Существует два типа события. Базовые события и командные события. Они отличаются репродукциями. Репродукция события путешествует от событии из виджетов потомков в родительские и прародительские виджеты. Базовые события не репродуцируются в отличие от командных. Например, wxColseEvent - это базовое событие. Не имеет смысла репродуцировать его в родительский виджет.

По-умолчанию, событие захваченное обработчиком прекращает репродуцироваться. Для продолжения репродуцирования нужно вызвать Skip() метод.

В нашем примере мы создали кнопку на панели. Панель находится в виджете рамки. Мы определили обработчик для всех виджетов.

event reached button class

event reached panel class

event reached frame class

Когда мы нажимаем на кнопку, событие начинает путешествие от кнопки к панели, а затем к рамке.

Попробуйте опустить некоторые методы Skip() и посмотрите, что получится.

Запрещение событий.

Иногда нам нужно прекратить обработку события. Для этого используется метод Veto().

В нашем примере мы обрабатывали событие wxCloseEvent. Оно вызывается нажатием на кнопку X строке заголовка, сочетанием клавиш Alt+F4 или выбором пункта close в системном меню. Во многих программах нам нужно предотвратить случайное закрытие окна, чтобы не потерять изменённые во время работы данные. Для осуществления этого мы должны подключить событийный тип wxEVT_CLOSE_WINDOW.

wxMessageDialog *dial = new wxMessageDialog(NULL,

wxT("Are you sure to quit?"), wxT("Question"),

wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);

При генерации события Close, выводится соответствующий диалог.

if (ret == wxID_YES) {

Destroy();

} else {

event.Veto();

}

В зависимости от возвращаемого значения мы уничтожим окно или запретим это событие. Внимание, чтобы закрыть окно мы должны вызвать метод Destroy(). Вызывав метод Close(), мы попадём в бесконечный цикл.

Идентификаторы окна.

Оконные идентификаторы - это целочисленные константы, которые однозначно определяют уникальность окна в событийной системе. Существует три способа создания оконных идентификаторов:

*Позволить системе автоматически создавать идентификаторы;

*Использовать стандартные идентификаторы;

*Создать свои собственные.

Каждый виджет имеет идентификационный параметр, уникальный в событийной системе. Ведь если мы работаем с несколькими виджетами, мы должны их различать.

wxButton(parent, -1)

wxButton(parent, wxID_ANY)

Если мы зададим -1 или wxID_ANY для идентификационного параметра, то wxWidgets будет автоматически создавать идентификационные номера для нас. Автоматически сгенерированные идентификационные номера (id) всегда отрицательные, в то время как заданные пользователем id должны быть всегда положительными. Мы всегда используем эту опцию когда нам не нужно изменять характеристики виджета. Например, виджет статического текста, который никогда не изменяется за время работы с приложением. Но мы можем получить id, если захотим. Для этого используется метод GetId(), который определит id для нас.

Стандартные идентификаторы должны использоваться везде где возможно. Идентификаторы могут предоставлять различные стандартные графические данные или поведение на некоторых платформах.

В нашем примере мы использовали стандартные идентификаторы для кнопок. В Линукс кнопки снабжаются небольшими иконками.

Original (English): The wxWidgets programming tutorial (5. Events)

Translation: © ber113 .

translated.by crowd

Like this translation? Share it or bookmark!