Новость из категории: Информация

Программирование для Haiku OS шаг за шагом: создание окна программы

Содержание:
1. Выбираем инструменты разработки;
2. Коротко об архитектуре Haiku OS;
3. Создание окна программы (Вы читаете данный раздел).
Программирование для Haiku OS шаг за шагом: создание окна программы

Для начала займёмся созданием каркаса будущей головоломки. Основой игрового поля в нашей программе будет окно, в которое в качестве дочернего мы впоследствии добавим виджет класса, унаследованного от BView. В качестве фишек мы используем кнопки, которые будут перемещаться по клеткам (ячейкам) игрового поля, т.е. «внутренний квадрат» окна программы будет всё время меняться. Однако, поскольку Haiku API не предоставляют (в отличие от Qt в Linux) вертикальных и горизонтальных менеджеров компоновки, рассчитывающих размеры дочерних виджетов при изменении размеров окна, то понятно, что в нашей программе границы окна - игрового поля - должны быть заданы жёстко и не меняться во время выполнения программы.

Создадим каталог для будущей программы, которую назовём просто - Lucas. Откроем Pe, в который внесём текст из листинга 1:
Листинг 1
#ifndef _ TMainForm _ h _
#define _ TMainForm _ h _
#include
class TMainForm : public BWindow {
public:
TMainForm(BRect WindowFrame, const char* psTitle = "Игра", window _ type WindowType = B _ TITLED _ WINDOW, uint32 uiFlags = B _ NOT _ RESIZABLE | B _ NOT _ ZOOMABLE, uint32 uiWorkspaces = B _ CURRENT _ WORKSPACE) ;
void MessageReceived(BMessage*); bool QuitRequested();
};
#endif

Итак, мы объявили класс главного окна нашей программы TMainForm, унаследовав его от класса окна Haiku, BWindow, подключаемого директивой #include [Window.h]. К слову, Be Book настоятельно рекомендует поступать именно так, а не использовать класс BWinow напрямую. В конструкторе класса мы задаём следующие параметры: размеры окна, задаваемые прямоугольником BRect WindowFrame, заголовок окна, флаги и рабочее пространство окна.

Программирование для Haiku OS шаг за шагом: создание окна программы
Окно KEYMAP

Обратите внимание, что, хотя Haiku OS не полностью локализована, поскольку используемая системная локаль - UTF-8, проблем с выводом русского текста нет. Переключение между языками ввода (русский, английский) достигается сменой раскладки клавиатуры в окне настроек Keymap (вызывается из меню «Preferences» в DeskBar - см. рис. выше).

Флагам (uint32 uiFlags) мы присвоили следующие значения:
- B_NOT_RESIZABLE - размеры окна невозможно будет поменять, потянув мышью за правый нижний его угол;
- B_NOT_ZOOMABLE - пользователь не сможет изменить размеры окна, нажав кнопку масштабирования в правом верхнем углу заголовка окна.

Собственно, этого мы и добивались. Подробнее о флагах окна приложения вы можете прочитать в Be Book (Раздел Interface Kit - BWindow). Сохраним файл с внесёнными изменениями в каталоге программы под именем TMainForm.h.

Добавим реализацию класса. В редакторе Pe создайте новый документ и внесите в него текст из листинга 2:
Листинг 2
#include
#include
#include "TMainForm.h"
TMainForm::TMainForm(BRect WindowFrame, const char* psTitle,
window _type WindowType, uint32 uiFlags,
uint32 uiWorkspaces)
: BWindow(WindowFrame, psTitle, WindowType, uiFlags, uiWorkspaces)
{ }
void TMainForm::MessageReceived(BMessage* pMessage) {
switch(pMessage->what) {
default:
{
BWindow::MessageReceived(pMessage);
}
}
}
bool TMainForm::QuitRequested() {
be _ app->PostMessage(B _ QUIT _ REQUESTED); return BWindow:: QuitRequested();
}

Приложение с графическим интерфейсом пользователя в Haiku функционирует так же, как и окно графической среды любой другой операционной системы. В своём главном цикле программа получает сообщения (BMessage), генерируемые различными виджетами в зависимости от действий пользователя. Обработка сообщений осуществляется виртуальной функцией MessageReceived(BMessage*), которую мы переопределяем. Пока единственное, что делает функция, - это перехват всех необработанных сообщений, не требующих реакции на них окна.

Замечание: даже если окно никак не реагирует на сообщения, они должны быть перехвачены. Поэтому вызов функции BWindow::MessageReceived(BMessage*); в реализации метода MessageReceived(BMessage*) вашего класса является обязательным.

Следующая виртуальная функция, которую мы переопределяем, - QuitRequested(). Она очень важна: вызывается, когда объект приложения (be_app) получает сообщение о завершении работы (B_QUIT_REQUESTED), и осуществляет последовательный вызов функций BWindow::QuitRequested() и BWindow::Quit(). Последняя уничтожает окно и все его компоненты, включая дочерние виджеты (именно поэтому в нашем классе нет деструктора). Если функция QuitRequested() не определена, то закрытие окна щелчком по верхней левой кнопке в его заголовке не приводит к уничтожению объекта приложения, который сохраняется в памяти, несмотря на то, что программа становится недоступной для пользователей.

Обратите внимание, что доступ к свойствам объекта приложения из методов класса главного окна осуществляется через глобальную переменную be_app (подключается директивой #include ). Сохраните файл под именем TmainForm. cpp. Теперь создадим класс нашего приложения, TProgramme, унаследовав его от класса BApplication. Объявление класса приведено в листинге 3:
Листинг 3
#ifndef _ TProgramme _ h _
#define _ TProgramme _ h _
#include class TMainForm;
class TProgramme : public BApplication {
public:
TProgramme(const char* psSignature =
"application/x-vnd.linmedsoft-lucas");
private:
TMainForm* pMainWindow;
};
#endif

Каждая программа в Haiku характеризуется уникальным строковым идентификатором, сигнатурой, который конструктор класса принимает в качестве параметра. Сигнатура формируется из следующих частей: слова application (приложение), после которого через слеш идёт обозначение x-vnd. и название организации-разработчика, и далее через дефис - название программы со строчной буквы.

В качестве закрытого члена класса нашего приложения объявим указатель на ранее созданный класс окна (TMainForm). Реализация класса приложения приведена в листинге 4:
Листинг 4
#include "TProgramme.h" #include "TMainForm.h"
TProgramme::TProgramme(const char* psSignature)
: BApplication(psSignature)
{
pMainWindow = new TMainForm(BRect(100, 100, 665, 185)); pMainWindow->Show();
}

В качестве параметра конструктор класса окна приложения принимает прямоугольник BRect, в котором заданы, соответственно, левая, верхняя, правая и нижняя границы виджета. Метод Show() отображает созданное окно на экране компьютера.

И наконец, реализация главной функции программы показана в листинге 5 (сохраните его в файле main.cpp):
Листинг 5
#include "TProgramme.h"
int main() {
TProgramme MyProgramme; MyProgramme.Run(); return 0;
}

Запуск главного цикла приложения осуществляется методом Run() его класса. Эта функция автоматически производит вызов виртуального метода ReadyToRun(), который выполняет предварительную настройку программы. Поэтому часто рекомендуют осуществлять переопределение этой функции и делать вызов функции показа главного окна именно из неё. Однако никаких изменений в работе программы это не вызывает, так что написание этого дополнительного кода я считаю излишним.
Осталось откомпилировать приложение. Для облегчения работы напишем небольшой makefile (см. листинг 6):
Листинг 6
OBJ = TMainForm.o TProgramme.o main.o
Lucas: $(OBJ)
g++ -o Lucas $(OBJ) -lbe
include /boot/develop/etc/makefile-engine

Обратите внимание, что для успешной компиляции программы необходимо связать объектные файлы со стандартной библиотекой Be (для построения графического интерфейса пользователя BeOS и Haiku используют собственную графическую среду), а также подключить ссылку на makefile-engine.

Программирование для Haiku OS шаг за шагом: создание окна программы
Первая программа на Haiku API

Вызовите терминал в каталоге с исходными текстами программы и наберите «make». Запустите программу и убедитесь, что её размеры не изменяются перетягиванием, а кнопка масштабирования в заголовке отсутствует (см. рис. выше).

Во второй части (следующий выпуск «Open Source») мы создадим игровое поле для нашей головоломки и начнём использовать IDE.



Решили заполучить данную статью в печатном варианте, но картридж вашего принтера "приказал долго жить"? Что ж, в таком случае я могу порекомендовать Вам только заправить картридж на Октябрьском Поле (http://www.brg-cosmetics.ru/moscow/oktpole-metro-file-zapravka-cart.htm)! Данная процедура стоит гораздо дешевле, чем покупка нового картриджа, и может проводится множество раз!

Рейтинг статьи

Оценка
5/5
голосов: 1
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх