Продолжение. (Начало - здесь).
Добавляем окно. Окно создается путем наследования его от класса wxFrame.
Добавляем окно. Окно создается путем наследования его от класса wxFrame.
В конструкторе нового класса выполняем настройку окна: добавляем меню, строку состояния ("статус-бар"), определяем поведение при выборе пунктов меню ("реакцию на события") и т.п..
Реакция на события реализуется с помощью т.н. "обработчиков событий", которые являются просто функциями (можно использовать или функторы, в т.ч. и "лямбды", если используется C ++ 11). Такие функции принимаю параметр "событие" с типом, соответствующем обрабатываемому событию, например wxCommandEvent - для события от простых элементов управления вроде кнопок, текстовых полей поля и пунктов меню. В нашем примере мы реагируем на три пункта меню: "Привет", "Выход" и "О программе".
Обратите внимание, обработчики событий не обязательно должны быть virtual или public.
Добавим в проект пару файлов: MainFrame.h и MainFrame.cpp. Добавим в них объявление и определение класса CMainFrame.
MainFrame.h:
#pragma once #include "stdafx.h" class CMainFrame : public wxFrame { public: CMainFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: void OnHello(wxCommandEvent & event); void OnExit(wxCommandEvent & event); void OnAbout(wxCommandEvent & event); }; enum { ID_Hello = 1 };
Наблюдаем конструктор, три обработчика событий и какое-то перечисление.
Чтобы реагировать на команду меню, этой команде должен быть сопоставлен уникальный идентификатор, который может быть определен как переменная const или элемент перечисления (enum). Часто используется именно enum, т.к. обычно требуется много таких констант.
А где же ID_Exit и ID_About? Дело в том, что в wxWidgets уже предопределяет стандартные значения, такие как wxID_ABOUT и wxID_EXIT. По возможности, следует их использовать, так как они могут быть обработаны особым способом в зависимости от конкретной платформы.
Как упоминалось выше, wxApp :: OnInit () вызывается при запуске и должен использоваться для инициализации программы, возможно, показывая "заставку" и создавая главное окно (или несколько окон). По умолчанию окна создаются скрытыми, чтобы можно было создавать дочерние окон до их показа. После этого необходимо их явно показать. В конце работы OnInit() возвращает true, чтобы сообщить системе wxWidgets об успешной инициализации.
См. файл wxHelloWorld.cpp:
#include "stdafx.h" #include "MainFrame.h" class wxHelloWorld : public wxApp { public: virtual bool OnInit() { CMainFrame *frame = new CMainFrame("Здравствуй, Мир!", wxPoint(50, 50), wxSize(450, 340)); frame->Show(true); return true; } }; wxIMPLEMENT_APP(wxHelloWorld);
В конструкторе главного окна (или позже) мы создаем меню с нашими пунктами меню, а также строку состояния, которая будет отображаться в нижней части главного окна.
CMainFrame::CMainFrame(const wxString & title, const wxPoint & pos, const wxSize & size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenuBar *menuBar = new wxMenuBar; // Создание главного меню wxMenu *menuFile = new wxMenu; // Создание пункта меню "Файл" menuBar->Append(menuFile, "&Файл"); // Добавление созданного пункта меню к главному меню menuFile->Append(ID_Hello, "П&ривет...\tCtrl-H",// Добавлении строки меню к пункту "Файл" "Строка помощи в строке стостояния для данного пункта меню"); menuFile->AppendSeparator(); // Разделитель списка пунктов меню menuFile->Append(wxID_EXIT, "В&ыход", "Завершить приложение"); // Добавление пункта меню к пункту "Файл" wxMenu *menuHelp = new wxMenu; // Создание пункта меню "Помощь" menuBar->Append(menuHelp, "&Помощь"); menuHelp->Append(wxID_ABOUT); SetMenuBar(menuBar); // CreateStatusBar(); // Создание строки состояния ("статусбар") SetStatusText("Привет, это wxWidgets!"); // Текст в строке состояния по умолчанию // Привязка идентификаторов событий к обработчикам событий Bind(wxEVT_MENU, &CMainFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, &CMainFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, &CMainFrame::OnExit, this, wxID_EXIT); }
Обратите внимание, что не обязательно указывать метки для стандартных пунктов меню
wxID_ABOUT
и wxID_EXIT
- им будут присвоены стандартные (даже правильно переведенные, при включении соответствующей опции) ярлыки и стандартные шорткаты, подходящие для текущей платформы, что делает наше поведение программы для этой платформы более "родным". По этой причине вам следует предпочесть повторное использование стандартных идентификаторов (см. Зарезервированные элементы ), где это возможно.
Мы также должны подключить обработчики событий к событиям, которые мы хотим обработать в них. Мы делаем это, вызывая Bind (). Таким образом, события выбора пунктов меню (обозначенные типом события wxEVT_MENU) приязываются к нужной функции-обработчику с помощь. идентификатора.
Параметры, которые мы передаем Bind ():
- Тип события, например wxEVT_MENU, wxEVT_BUTTON, wxEVT_SIZE, или одно из многих других событий, используемых wxWidgets.
- Указатель на метод вызова и объект для его вызова. Здесь мы просто вызываем нашу собственную функцию и передаем
this
указатель на сам объект. Мы могли бы вместо этого вызвать метод другого объекта или функцию, не являющуюся членом, - фактически, можно использовать любой объект, который можно вызвать с помощью wxCommandEvent. - Необязательный идентификатор, позволяющий выбрать для обработки только конкретные события типа wxEVT_MENU, а именно те, которые указаны при создании пунктов меню с таким идентификатором, а не обрабатывать их все в предоставленном обработчике. Это в основном полезно с элементами меню и редко с другими событиями:
// Привязка идентификаторов событий к обработчикам событий Bind(wxEVT_MENU, &CMainFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, &CMainFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, &CMainFrame::OnExit, this, wxID_EXIT);
Обычно обработчик событий MyFrame :: OnExit () закрывает главное окно, вызывая Close(). Параметр true указывает, что в других окнах нет права отмены, например, после запроса "Вы действительно хотите закрыть приложение?". Если нет других главных окон не остается, то приложение прекратит работу:
void CMainFrame::OnExit(wxCommandEvent & event)
{
Close(true);
}
Обработчик MyFrame :: OnAbout () покажет небольшое окно с некоторым текстом в нем. В данном случае - окно "О программе" с информацией о программе:
void CMainFrame::OnAbout(wxCommandEvent & event) { wxMessageBox("Это пример wxWidget - приложения ' Привет, Мир!", "О приложении", wxOK | wxICON_INFORMATION); }
void CMainFrame::OnHello(wxCommandEvent & event) { wxLogMessage("Привет от wxWidgets!"); }
В программах на C ++ 11 в качестве обработчиков событий удобно использовать анонимные функторы - "лямбды", поскольку это делает код более компактным и позволяет обрабатывать событие прямо в точке связи события с его идентификатором. Например, вместо обработчика события wxID_EXIT можно было бы написать:
Bind ( wxEVT_MENU , [=] ( wxCommandEvent &) {Close ( true );}, wxID_EXIT );
|
Полный исходник приложения скачать можно ЗДЕСЬ.
Напомню, что библиотека была собрана лишь для конфигураций x32, для x64 следует собрать с опцией TARGET_CPU=X64, как указано здесь.
Напомню, что библиотека была собрана лишь для конфигураций x32, для x64 следует собрать с опцией TARGET_CPU=X64, как указано здесь.
Комментариев нет:
Отправить комментарий