Ultimate++: использование компоновок
Содержание:
1. Реакция на события и логика программы;
2.Использование компоновок (Вы читаете данный раздел);
3. Иерархия виджетов в U++;
4. Библиотека контейнеров NTL.
Размещать виджеты, задавая их координаты вручную, крайне неудобно. Для облегчения этого процесса в ThelDE имеется визуальный редактор компоновок (Layout Editor). Компоновки виджетов описываются файлами с расширением lay. Они представляют собой автоматически генерируемый код на С++, использующий многочисленные специальные макросы и включаемый прямо в код программы директивами #include. Создадим файл компоновки для программы. Для этого щелкнем правой кнопкой мыши на списке файлов нашего пакета, выберем Insert package directory file(s) и введем имя нового файла: demol.lay. Файл компоновки сразу же открывается в визуальном редакторе, который теперь занимает место редактора кода. В режиме визуального редактора слева находится редактор свойств виджетов, а справа - поле для их размещения (пока и то, и другое пусто). Вызовем контекстное меню в верхнем окне колонки свойств, выберем Add new layout и введем имя, например main (см. рис. ниже). В одном lay-файле может находиться множество компоновок с разными именами, но нам понадобится только одна для главного окна.
Теперь в области редактирования появилось серое поле формы. Щелкнув по нему правой кнопкой мыши, можно выбрать виджет из контекстного меню и поместить его на форму. Нужно заметить, что далеко не все виджеты U++ доступны из этого меню, однако можно вставить любой (даже созданный пользователем) виджет с помощью опции User Class. Виджеты можно перетаскивать и менять их размеры. Каждый виджет имеет четыре «якоря», тянущихся к сторонам экрана. Те из них, которые отображаются сплошными линиями означают, что расстояние от края виджета до соответствующего края формы фиксировано (виджет «привязан» к краю), а те, которые отображаются пунктиром, означают, что оно может меняться. Скажем, если кнопка «привязана» и слева, и справа, то она будет растягиваться при изменении размеров окна. Этот механизм использует «под капотом» уже знакомые нам методы указания логических координат, однако их теперь не нужно прописывать вручную. Редактируемые свойства виджетов включают их название (имя переменной), надпись (или значение для полей ввода), шрифт и выравнивание текста.
Создадим компоновку программы так, чтобы получилось нечто похожее на рис. выше.
Важно, чтобы имена виджетов совпадали с теми, что уже есть в программе. Макросы в lay-файле сами отвечают за создание виджетов и их размещение, так что делать это вручную больше не нужно. Уберем из класса MyWindow определения всех переменных виджетов (строки, начиная с EditDouble vall, val2;), а из конструктора класса уберем все строки Add(..).
Теперь нужно использовать в программе созданную компоновку. Это требует трех простых шагов. Перед определением класса вставляем строки:
Первая строка включает lay-файл, а вторая загружает необходимый библиотечный файл для работы с компоновками.
Следующим шагом меняем предка нашего класса MyWindow c TopWindow на Withmain . Шаблонный класс Withmain создан автоматически и определен в lay-файле. Именно в нем и объявлены теперь все наши виджеты. Его имя состоит из слова With и имени нашей компоновки - main. Если компоновок несколько, то для каждой будет создан свой класс. Если мы решим, что должны наследовать не класс TopWindow, а какой-то другой, то нужно поменять только параметр шаблонного класса, не затрагивая сам файл компоновок.
Наконец, последний шаг - разместить созданные в lay-файле виджеты в окне. Для этого в начало конструктора вставляется следующая строка:
Все! Теперь программу можно скомпилировать и убедиться, что она работает аналогично предыдущему варианту. Заметьте, что логика программы полностью отделена от визуального дизайна - можно как угодно менять компоновку, использовать lay-файлы или размещать виджеты вручную - на логике это никак не отражается. Полный текст программы выглядит теперь так:
Добиться подобного лаконизма в других наборах инструментов практически невозможно.
1. Реакция на события и логика программы;
2.
3. Иерархия виджетов в U++;
4. Библиотека контейнеров NTL.
Размещать виджеты, задавая их координаты вручную, крайне неудобно. Для облегчения этого процесса в ThelDE имеется визуальный редактор компоновок (Layout Editor). Компоновки виджетов описываются файлами с расширением lay. Они представляют собой автоматически генерируемый код на С++, использующий многочисленные специальные макросы и включаемый прямо в код программы директивами #include. Создадим файл компоновки для программы. Для этого щелкнем правой кнопкой мыши на списке файлов нашего пакета, выберем Insert package directory file(s) и введем имя нового файла: demol.lay. Файл компоновки сразу же открывается в визуальном редакторе, который теперь занимает место редактора кода. В режиме визуального редактора слева находится редактор свойств виджетов, а справа - поле для их размещения (пока и то, и другое пусто). Вызовем контекстное меню в верхнем окне колонки свойств, выберем Add new layout и введем имя, например main (см. рис. ниже). В одном lay-файле может находиться множество компоновок с разными именами, но нам понадобится только одна для главного окна.
Теперь в области редактирования появилось серое поле формы. Щелкнув по нему правой кнопкой мыши, можно выбрать виджет из контекстного меню и поместить его на форму. Нужно заметить, что далеко не все виджеты U++ доступны из этого меню, однако можно вставить любой (даже созданный пользователем) виджет с помощью опции User Class. Виджеты можно перетаскивать и менять их размеры. Каждый виджет имеет четыре «якоря», тянущихся к сторонам экрана. Те из них, которые отображаются сплошными линиями означают, что расстояние от края виджета до соответствующего края формы фиксировано (виджет «привязан» к краю), а те, которые отображаются пунктиром, означают, что оно может меняться. Скажем, если кнопка «привязана» и слева, и справа, то она будет растягиваться при изменении размеров окна. Этот механизм использует «под капотом» уже знакомые нам методы указания логических координат, однако их теперь не нужно прописывать вручную. Редактируемые свойства виджетов включают их название (имя переменной), надпись (или значение для полей ввода), шрифт и выравнивание текста.
Создадим компоновку программы так, чтобы получилось нечто похожее на рис. выше.
Важно, чтобы имена виджетов совпадали с теми, что уже есть в программе. Макросы в lay-файле сами отвечают за создание виджетов и их размещение, так что делать это вручную больше не нужно. Уберем из класса MyWindow определения всех переменных виджетов (строки, начиная с EditDouble vall, val2;), а из конструктора класса уберем все строки Add(..).
Теперь нужно использовать в программе созданную компоновку. Это требует трех простых шагов. Перед определением класса вставляем строки:
#define LAYOUTFILE #include
Первая строка включает lay-файл, а вторая загружает необходимый библиотечный файл для работы с компоновками.
Следующим шагом меняем предка нашего класса MyWindow c TopWindow на Withmain
Наконец, последний шаг - разместить созданные в lay-файле виджеты в окне. Для этого в начало конструктора вставляется следующая строка:
CtrlLayout(*this);
Все! Теперь программу можно скомпилировать и убедиться, что она работает аналогично предыдущему варианту. Заметьте, что логика программы полностью отделена от визуального дизайна - можно как угодно менять компоновку, использовать lay-файлы или размещать виджеты вручную - на логике это никак не отражается. Полный текст программы выглядит теперь так:
#include
using namespace Upp;
#define LAYOUTFILE
#include
class MyWindow: public Withmain {
public:
typedef MyWindow CLASSNAME;
MyWindow(){
CtrlLayout(*this);
Title("Hello world!") .MinimizeBox().MaximizeBox() .Sizeable().SetRect(0, 0, 300, 230);
// Заполняем список операций
operation.Add("+") .Add("-").Add("*") .Add("/") .SetIndex(0) ; // Реагируем на нажатие кнопки compute <<= THISBACK(on _ click); // Реагируем на выбор операции operation <<= THISBACK(on _ click);
}
void on _ click() {
// Как в предыдущем варианте
}
};
GUI _APP_ MAIN { MyWindow w; w.Run();
}
using namespace Upp;
#define LAYOUTFILE
#include
class MyWindow: public Withmain
public:
typedef MyWindow CLASSNAME;
MyWindow(){
CtrlLayout(*this);
Title("Hello world!") .MinimizeBox().MaximizeBox() .Sizeable().SetRect(0, 0, 300, 230);
// Заполняем список операций
operation.Add("+") .Add("-").Add("*") .Add("/") .SetIndex(0) ; // Реагируем на нажатие кнопки compute <<= THISBACK(on _ click); // Реагируем на выбор операции operation <<= THISBACK(on _ click);
}
void on _ click() {
// Как в предыдущем варианте
}
};
GUI _APP_ MAIN { MyWindow w; w.Run();
}
Добиться подобного лаконизма в других наборах инструментов практически невозможно.