Глава II – Начало. Часть 3
Текст программы
Объединим все кусочки вместе, чтобы увидеть как будет выглядеть программа целиком. Обычно я отделяю заголовочные файлы и файлы реализации, но для данного крошечного примера я объединил их в один файл.
// Имя: minimal.cpp
// Цель: Пример минимального приложения на wxWidgets
// Автор: Julian Smart
#include "wx/wx.h"
// Объявляем класс приложения
class MyApp : public wxApp
{
public:
// Вызывается при старте приложения
virtual bool OnInit();
};
// Объявляем класс главного окна
class MyFrame : public wxFrame
{
public:
//Конструктор
MyFrame(const wxString& title);
// Обработчики сообщений
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
// Этот класс перехватывает сообщения
DECLARE_EVENT_TABLE()
};
// Реализация MyApp& GetApp()
DECLARE_APP(MyApp)
// Говорит wxWidgets, что надо создать объект MyApp
IMPLEMENT_APP(MyApp)
// Инициализируем приложение
bool MyApp::OnInit()
{
// Создаем главное окно приложения
MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));
// Показываем его
frame->Show(true);
// Запускаем петлю сообщений
return true;
}
// Таблица сообщений для MyFrame
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
END_EVENT_TABLE()
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"),
wxVERSION_STRING);
wxMessageBox(msg, wxT("About Minimal"),
wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnQuit(wxCommandEvent& event)
{
// Уничтожаем фрейм
Close();
}
#include "mondrian.xpm"
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title)
{
// Устанавливаем иконку для фрейма
SetIcon(wxIcon(mondrian_xpm));
// Создаем меню
wxMenu *fileMenu = new wxMenu;
// Добавляем пункт "About" (о приложении), который
// должен показывать маленькую помощь
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),
wxT("Show about dialog"));
fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
wxT("Quit this program"));
// Теперь добавляем созданное меню в строку меню...
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("&File"));
menuBar->Append(helpMenu, wxT("&Help"));
// ... и присоединяем к фрейму
SetMenuBar(menuBar);
// Создаем строку состояния для красоты
CreateStatusBar(2);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
Компиляция и запуск программы
Данный пример можно найти на прилагаемом CD-ROM в папке examples/chap02. Для компиляции его необходимо скопировать на ваш жесткий диск. В связи с тем, что невозможно создать makefile, который будет работать “из коробки” с любой средой программирования, которая возможно установлена у читателя, мы сделали проект для среды DialogBlocks с конфигурацией, подходящей для большинства платформ и компиляторов. Обратитесь к Приложению 3 Создание приложений с помощью DialogBlocks, чтобы настроить программу DialogBlocks для ее использования на вашем компьютере. Детали компиляции wxWidgets-приложений рассматриваются в Приложении 2 Сборка ваших собственных приложений на wxWidgets.Установите wxWidgets и DialogBlocks с предлагаемого CD. В системе Windows вам также необходимо установить подходящий компилятор (один из них присутствует на CD), если он у вас еще не установлен. После этого пропишите пути до библиотеки wxWidgets и вашего компилятора в настройках DialogBlocks на вкладке Paths и откройте файл examples/chap02/minimal.pjd. Выберете подходящую конфигурацию для вашего компилятора и платформы, например MinGW Debug или VC++ Debug (Windows), GCC Debug GTK+ (Linux) или GCC Debug Mac (Mac OS X). Далее нажмите кнопку Build and Run Project. Возможно среда спросит не хотите ли вы собрать библиотеку wxWidgets, если вы еще этого не сделали.Вы можете найти похожий пример в папке samples/minimal в дистрибутиве wxWidgets. Если вы не хотите использовать DialogBlocks, то вы можете просто скомпилировать указанный пример вместо нашего. Обратитесь к Приложению 1 Установка wxWidgets, чтобы узнать как собрать стандартные примеры wxWidgets.
Поток выполнения
Действия, происходящие при старте программы:
- В зависимости от платформы запускается функция main, WinMain или эквивалентная ей (эта функция предоставляется библиотекой wxWidgets, а не вашим приложением). wxWidgets инициализирует внутренние структуры данных и создает экземпляр класса MyApp.
- wxWidgets вызывает метод MyApp::OnInit, который создает экземпляр класса MyFrame.
- Конструктор класса MyFrame создает окно через конструктор wxFrame и добавляет иконку, меню и строку состояния.
- MyApp::OnInit показывает фрейм и возвращает true.
- wxWidgets запускает петлю сообщений, ждет сообщения и вызывает соответствующий обработчик сообщений.
Как уже было указано, приложение завершается, когда закрывается основной фрейм, что можно сделать через соответствующий пункт меню, через стандартные кнопки или стандартные меню (это зависит от платформы).
Итоги
Глава дает представление о том, как работает простейшее приложение на wxWidgets. Мы коснулись темы обработки сообщений, использования класса wxFrame инициализации приложения, создания меню и строки состояния. Однако, несмотря на сложность вашего реального приложения, базовые принципы его функционирования останутся теми же самыми, как и у нашего маленького примера. В следующей главе мы подробнее рассмотрим сообщения и методы их обработки.