В этой главе рассматривается структура простой программы, написанной с использованием wxWidgets.
Мы покажем запуск и процесс завершения wxWidgets-приложения, как показать главное окно и как обрабатывать команды от пользователя. На этом, следуя философии wxWidgets использовать только простые и красивые решения, мы главу и закончим. Для компиляции примеров вам возможно придется обратится к Приложению 1 Установка wxWidgets.
Минимальное приложение на wxWidgets показывает главное окно (класс wxFrame) со строками меню и статуса. Меню позволяет увидеть вам информацию О программе или выйти из программы. Это очень простое приложение, однако его вполне достаточно, чтобы проиллюстрировать некоторые базовые принципы построения приложений. Кроме того с накоплением опыта вы можете использовать этот пример, добавляя в него необходимую вам функциональность.
Каждое приложение на wxWidgets определяет свой собственный класс приложения, являющийся потомком от wxApp. В программе существует единственный экземпляр данного класса, который представляет из себя представление данного приложения. Обычно этот класс объявляет функцию OnInit, которая вызывается, когда библиотека wxWidgets готова запустить ваш код (функция является эквивалентом функции main языка C или WinMain в Win32-приложениях).Ниже дано минимально возможное объявление класса приложения:
Реализация функции OnInit обычно создает по крайней мере одно окно, считывает параметры из командной строки, инициализирует нужные для работы структуры данных и выполняет другие действия, необходимые для запуска программы. Если функция возвращает true, то wxWidgets запускает петлю сообщений, которая обрабатывает ввод пользователя и запускает обработчик сообщений в случае необходимости. Если данная функция возвращает false, то wxWidgets корректно очищает свои внутренние структуры и завершает работу приложения.Простейшая реализация функции OnInit может иметь следующий вид:
Реализация создает экземпляр нового класса окна MyFrame (мы определим этот класс позднее), показывает окно на экране и возвращает true, чтобы запустить петлю сообщений. Главные окна(такие как фреймы и диалоги), в отличие от дочерних, должны быть показаны сразу после создания.Заголовок главного окна передается конструктору, обернутым в макрос wxT(). В дальнейшем вы заметите, что этот макрос используется в большинстве примеров библиотеки wxWidgets и позволяет преобразовать строки и символы к правильному типу, что позволяет приложению компилироваться в режиме Unicode. Данный макрос является синонимом макроса _T(). Также в программах вы возможно встретите макрос _(), который говорит библиотеке, что строку можно перевести на другой язык. Обратитесь к Главе 16 Написание локализованных приложений за дополнительной информацией.Где же находится код, который создает экземпляр класса MyApp? wxWidgets делает это самостоятельно, но вы должны явно указать тип объекта, который необходимо создать. Поэтому вам необходимо добавить следующие строки в ваш файл с реализацией:
Без этого определения wxWidgets не сможет создать объект вашего приложения. Данный макрос также вставляет код, который проверяет, что объект является приложением и библиотека была скомпилирована с необходимыми опциями. Это позволяет wxWidgets сообщать о некоторых ошибках, которые впоследствии могли бы вызвать появление трудно выявляемых ошибок времени выполнения.Когда wxWidgets создает объект типа MyApp, результат сохраняется в глобальной переменной wxTheApp. Можно использовать эту переменную в вашей программе, однако лучше явно не обращаться к ней в своем коде. Вместо этого, после объявления вашего класса приложения поместите макрос
после чего вы сможете использовать в программе функцию wxGetApp, которая возвращает ссылку на объект приложения типа MyApp.Совет: Даже если вы не используете макрос DECLARE_APP, вы все равно можете использовать переменную wxTheApp для доступа к функциям wxApp. Это позволяет избежать необходимости включения заголовочных файлов вашего приложения. Также это может быть полезно внутри кода, который не знает о специфичных классах приложения (например, при создании библиотек), а также для уменьшения времени компиляции.