HelloWorld
Rudimentary HelloWorld application with menu and status bar
Исторически почти каждый язык или среда программирования имеют различного вида примеры типа "Hello world!", и Ultimate++ не является исключением :). В этом коротком уроке я постараюсь объяснить Вам основы U++ приложения с помощью HelloWorld U++ примера.
Когда вы запустите приложение HelloWorld и выберете пункт меню "File->About" вы увидите что-то вроде этого:

Давайте изучим исходный код HelloWorld U++ приложения:
#include <CtrlLib/CtrlLib.h>
class HelloWorld : public TopWindow {
MenuBar menu;
StatusBar status;
void FileMenu(Bar& bar);
void About();
public:
typedef HelloWorld CLASSNAME;
HelloWorld();
};
void HelloWorld::About()
{
PromptOK("{{1@5 [@9= This is the]::@2 [A5@0 Ultimate`+`+ Hello world sample}}");
}
void HelloWorld::FileMenu(Bar& bar)
{
bar.Add("About..", THISBACK(About));
bar.Separator();
bar.Add("Exit", THISBACK(Close));
}
HelloWorld::HelloWorld()
{
AddFrame(menu);
AddFrame(status);
menu.Add("File", THISBACK(FileMenu));
status = "Welcome to the Ultimate++ !";
}
GUI_APP_MAIN
{
SetLanguage(LNG_ENGLISH);
HelloWorld().Run();
}
Много еще неизвестных Вам инструментов, но давайте не будем торопиться, разберем код построчно.
В первую очередь, мы подключаем "CtrlLib/CtrlLib.h"; этот заголовок включает в себя большую часть U++ виджетов. Все U++ виджеты порождены от базового класса Ctrl, поэтому их также называют "Ctrls" (контролы).
Следующий шаг - наследуем HelloWorld от класса TopWindow, который представляет из себя базовое окно, интерфейс работы с которым не зависит от особенностей операционной системы. Класс содержит множество инструментов, таких как, например, заголовок, кнопки закрытия/свертывания окна и т. п. Иначе говоря, это наше стандартное окно, ;).
Окно HelloWorld имеет главное меню и строку статуса, которые в классе описаны как два private члена.
MenuBar menu;
StatusBar status;
В конструкторе HelloWorld с помощью AddFrame функции добавлены главное меню и строка статуса. AddFrame добавляет данные элементы как Frames (рамки), помещая их на границу окна и уменьшая видимую область окна. И главное меню, и строка статуса знают где должно быть место их размещения, когда они используются в качестве рамок (главное меню вверху, строка статуса внизу).
Следующая строка в конструкторе очень интересна:
menu.Add("File", THISBACK(FileMenu));
и заслуживает более подробного объяснения. U++ использует callbacks - callbacks могут быть описаны как весьма обобщенная форма указателей на функции. Каждый Callback представляет из себя некоторое действие (обычно вызов некоторой определенной функции или же метода класса), которое может быть вызвано в любой момент. Сейчас,
THISBACK(x)
это макрос, который разворачивается в
callback(this, &CLASSNAME::x)
где x - это название метода, который мы хотим вызывать этим действием. Функция callback - шаблонная функция, для ее работы необходимо определить переменную CLASSNAME. Каждый U++ класс, который использует THISBACK макрос содержит следующую строку
typedef HelloWorld CLASSNAME;
То есть
menu.Add("File", THISBACK(FileMenu));
добавляет меню "File" в главное меню нашего приложения и, когда пользователь выберет это меню, U++ вызовет соответствующую функцию из нашего HelloWorld
void HelloWorld::FileMenu(Bar& bar)
{
bar.Add("About..", THISBACK(About));
bar.Separator();
bar.Add("Exit", THISBACK(Close));
}
Что произойдет теперь: после выбора "File" меню пользователем, U++ создает раскрывающееся меню и затем вызывает FileMenu функцию, параметром которой является адрес только что созданного главного меню. После этого FileMenu добавляет "About" и "Exit" в меню, с разделителем между ними (Separator), и назначает пунктам вызовы функций из нашего HelloWorld объекта (более детальное обсуждение указателей на функции здесь).
Последняя строка конструктора
status = "Welcome to the Ultimate++ !";
Класс StatusBar имеет перегруженный оператор =, который устанавливает текст нашей строки статуса. Красиво и чисто.
Последняя функция HelloWorld класса
void HelloWorld::About()
{
PromptOK("{{1@5 [@9= This is the]::@2 [A5@0 Ultimate`+`+ Hello world sample}}");
}
Очевидно, когда пользователь кликает по "File"->"About" в меню вызывается именно эта функция. PromtOK - удобная глобальная функция, описанная в "CtrlLib\RichText.h", отображает простой диалог со значком информации и кнопкой OK. Также, этот диалог содержит информационное сообщение для пользователя, и этот текст является параметром PromtOK функции. Как вы заметили, есть странные символы в нашем информационном сообщении, это QTF коды (QTF - родной формат U++ форматированных текстов).
И в конце мы имеем
GUI_APP_MAIN
{
SetLanguage(LNG_ENGLISH);
HelloWorld().Run();
}
Как вы догадываетесь, каждая программа должна иметь точку входа, где начинается ее выполнение. U++ код начинается с макроса GUI_APP_MAIN. Этот макрос инициализирует U++ GUI приложение для соответствующей ОС платформы, а также завершает работу U++ среды.
Каждая хорошая среда разработки U++ имеет хорошую поддержку мультиязычных программ, но для примера основным языком мы установили Английский.
Далее мы создаем один экземпляр (объект) класса HelloWorld и вызываем Run функцию, определенную в TopWindow классе, которая запустит наше приложение.
hello.cpp
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class HelloWorld : public TopWindow {
MenuBar menu;
StatusBar status;
void FileMenu(Bar& bar);
void MainMenu(Bar& bar);
void About();
public:
typedef HelloWorld CLASSNAME;
HelloWorld();
};
void HelloWorld::About()
{
PromptOK("{{1@5 [@9= This is the]::@2 [A5@0 Ultimate`+`+ Hello world sample}}");
}
void HelloWorld::FileMenu(Bar& bar)
{
bar.Add("About..", THISBACK(About));
bar.Separator();
bar.Add("Exit", THISBACK(Close));
}
void HelloWorld::MainMenu(Bar& bar)
{
menu.Add("File", THISBACK(FileMenu));
}
HelloWorld::HelloWorld()
{
AddFrame(menu);
AddFrame(status);
menu.Set(THISBACK(MainMenu));
status = "Welcome to the Ultimate++ !";
}
GUI_APP_MAIN
{
SetLanguage(LNG_ENGLISH);
HelloWorld().Run();
}
|