Конструктор Форм позволяет создавать дизайн форм визуально используя технику перетащил и бросил. Он также генерирует код класса формы. После чтения этой статьи Вы будете знать все о его использовании и его мощных функциях.
Все последующие пояснения описывают Конструктор Форм в виде отдельного приложения. Если Вы пользуетесь расширением Nitisa и, соответственно, Конструктором Форм интегрированным в Visual Studio, все пояснения остаются такими же за исключением того, что кнопки New(новая форма), Open(открыть), Save(сохранить) и Save as(сохранить как) в интегрированном Кострукторе Форм недоступны и нужно использовать стандартные возможности Visual Studio.
Посмотрите на Конструктор Форм. Его окно состоит из нескольких частей
Между редактором формы и секцией слева, содержащей редакторы иерархии, свойств и событий, находится разделитель. Вы можете перемещаеть его с помощью мышы и менять размер части занимающей редактором формы и секции слева. Аналогичный разделитель расположен между редактором иерархии и редакторами свойств/событий. Давайте теперь поговорим обо всех частях и посмотрим как они могут быть использованы.
На панели действий расположены 5 кнопок для различных действий. Это(слева на право) New(новая форма), Open(открыть форму), Save(сохранить форму), Save as(сохранить форму как), Configure(настройки).
В Конструкторе Форм, интегрированном в Visual Studio, доступна только последняя кнопа(настройка). Создавайте новые формы, открывайте и сохраняйте их обычным образом, так же как Вы создаете, открываете и сохраняете любые файлы в Visual Studio.
Переключатель шкурок представляет собой простой выпадающий список. В нем перечислены все доступные шкурки. Выбирая элемент в этом выпадающем списке Вы измените внешний вид формы. Одна из шкурок показана на картинке ниже. Будте осторожны при переключении шкурок. Размер формы может поменятся.
По умолчанию существует несколько шкурок. Они предстваляют собой форму наподобие как у ОС Windows, телефон(как портретная так горизонтальная ориентация) и планшет(так же как портретная так и горизонтальная ориентация). Вы можете также создавать свои собственные шкурки. Конструктор Форм загружает шкурки из специфического места. Это должна быть папка называющаяся FormLayouts и находящаяся либо в той же папке где и приложение Конструктор Форм или на один или два уровня выше. В этой папке можно создавать подпапки для своих шкурок. По умолчанию там есть папка с названием Standard. Создать шкурку достаточно просто. Все что для этого нужно это набор картинок для представления границ формы и конфигурационный файл в формате json.
В начале давайте обсудим картики шкурки формы. У каждой формы есть 4 границы: левая, верхняя, правая, нижняя. Вам необходимо создать картинки для этих границ. Или как минимум для тех из них, которые Вы хотите чтобы были видны в Конструкторе Форм. Картинки границы могут иметь следующие части.
Каждая граница может иметь все или только некоторые из этих частей. Когда у границы есть нетрансформируемые части, такие как start(начальная), end(конечная) и middle(средняя), минимальный размер формы вычисляется с использованием размеров этих картинок. Так же одни и те же картинки можно использовать на разных границах. Картинки левой границы поворачиваются против часовой стрелки на 90o перед отображением. Картинки правой границы поворачиваются на тот же угол, но по часовой стрелке. Обратите на этот факт внимание при создании картинок для границ. Все картинки должны быть размещены в папке, которую Вы создали для Вашей шкурки.
Когда у Вас есть картинки границ Вашей шкурки, Вам нужно создать файл конфигурации. Его нужно поместить в ту же самую папку. Ему можно дать любое имя, но расширение должно быть json. Это должен быть файл в формате JSON и кодировке UTF-8. В нем могут быть указаны следующие свойства.
left
- левая, top
- верхняя, right
- правая, или bottom
- нижняя.Вот пример файла конфигурации шкурки.
{
"title": "Phone",
"landscape" : false,
"left": {
"fill": "phone-leftright-fill.png"
},
"top": {
"start": "phone-top-start.png",
"middle": "phone-top-middle.png",
"end": "phone-top-end.png",
"fill": "phone-top-fill.png"
},
"right": {
"fill": "phone-leftright-fill.png"
},
"bottom": {
"start": "phone-bottom-start.png",
"middle": "phone-bottom-middle.png",
"end": "phone-bottom-end.png",
"fill": "phone-bottom-fill.png"
},
"size": {
"width": "670",
"height": "1280"
},
"caption": {
"border": "top",
"padding": [8, 0, 0, 0]
}
}
Эта секция содержит все элементы управления и компоненты(также называемые виджетами) доступные для добавления на форму. У нее может быть несколько вкладок. Чтобы добавить элемент управления на форму, просто кликните на кнопке нужного элемента управления или компонента в этой секции на любой вкладке и дальше кликните на форме в том месте, где нужно добавить выбранный элемент управления/компонент. Если Вы кликнули не на том элементе управления, просто кликните на нужном и потом добавьте его на форму. При наведении мышы на кнопки в этой секции, через пару секунд появляется всплывающая подсказка с именем(и иногда другой информацией об элементе управления, что зависит от самого элемента управления) элемента управления. Если на табке не хватает места для отображения всех элементов управления, присутствующих на ней, как можно увидеть на картинке ниже, появляется возможность прокрутки. Можно прокручивать зажав кнопку мышы на левой или правой стрелке для прокрутки табки или используя колесико мыши, когда указатель мышы находится над этими частями.
Вы можете открыть форму настройки Конструктора Форм соответствующей кнопкой в панеле действий. На этой форме Вы можете изменить настройки Конструктора Форм, касающиеся сетки формы, выделения и генерирования заголовочного файла прототипа формы. После изменений Вы можете кликнуть по любой кнопке Apply или использовать комбинацию клавиш Ctrl+Return чтобы применить изменения глобально, а так же кликнуть по кнопке Cancel или нажать Escape для отмены изменений. Форма настроек выглядит как на картинке ниже.
И вот список с описаниями всех опций.
Когда это может быть полезным? Предположим Вы создаете Ваши собственные виджеты в пакете с названием SuperWidgets. В этом случаю, если Вы следуете соглашениям по структуре фреймверка, Ваш пакет будет находится в папке SuperWidgets и весь его код(включая все виджеты) будет находится в пространстве имен superwidgets
. Если в Вашем пакете есть формы, Вы без сомнения будете использовать Конструктор Форм для их создания. Предположим, что Вы поместили один или несколько виджетов из Вашего пакета на такую форму. В этом случае Конструктор Форм сгенерирует прототип формы стандартным способом, добавляя #include
в том виде, в котором Вы указали в пакетных сущностях и аналогично добавляя соответствующее пространство имен к виджетам. Пусть в Вашем пакете есть виджет с названием SuperGrid. Этот виджет описан стандартным способом и код, сгенерированный для него, будет таким как следующий.
...
#include "SuperWidgets/Controls/SuperGrid/SuperGrid.h
...
namespace nitisa
{
...
m_pSuperGrid1 = new superwidgets::CSuperGrid();
...
}
Это не правильно, так как Ваша форма тоже включена в Ваш пакет. Чтобы заставить Конструктор Форм генерировать прототип формы правильно, можно использовать функции переопределения. Итак, в этом случае просто добавьте переопределение включения заголовочного файла с SuperWidgets на ../..(предполагая что Ваша форма находится в папке SuperWidgets/Forms/[Name]/) и пространства имен с superwidgets на пустую строку. Если Вы это сделаете, то Конструктор Форм сгенерирует следующее вместо того что было ранее.
...
#include "../../Controls/SuperGrid/SuperGrid.h
...
namespace nitisa
{
...
m_pSuperGrid1 = new CSuperGrid();
...
}
standard::CButton *getButtonOk();
IFormMain
. Если переключить настройку в DialogBox и выбрать от какого диалогового виджета наследовать Ваш и сохранить форму снова, Вы получите файл с названием DialogBoxMain.h с прототипом диалогового виджета внутри с названием IDialogBoxMain
.Вы можете изменить цвета кликнув на соответствующей панели. Появится диалоговое окно выбора цвета.
Кнопка Apply to form only закрывает окно конфигурации и применяет настройки только к Вашей форме. Это означает, что когда Вы закроете Конструктор Форм и откроете его заново, будут применены старые настройки. Однако каждый раз, когда Вы загружаете эту конкретную форму, новые настройки будут загружены из ее *.nfr файла и применены в Конструкторе Форм.
Apply globally кнопка закрывает окно настроек и применяет их глобально, а так же удаляет настройки из формы, если они там были. Так же можно использовать комбинацию клавиш Ctrl+Enter.
Кнопка Cancel закрывает окно настроек и отменяет сделанные изменения. Так же можно использовать клавишу Esc.
Некоторые настройки в настоящий момент не представлены в окне конфигурации Конструктора Форм. Эти настройки относятся к пакетам и элементам управления и могут быть изменены редактированием специального конфигурационного файла packages.json, который должен находится в той же папке где и исполняемые файлы Конструктора Форм. По умолчания такой файл отсутствует и используются настройки по умолчанию. Это значит что все доступные пакеты будут загружаться и все доступные в них сущности будут использоваться Конструктором Форм. Если Вы желаете скрыть некоторые виджеты или целые пакеты, Вам нужно создать файл packages.json с содержимым в следующем формате. Он должен быть в кодировке UTF-8. Следующие свойства могут быть помещены в него.
Вот пример файла конфигурации. Два элемента из Стандартного пакета называющиеся Container и ValueListEditor скрыты в Конструкторе Форм.
{
"packages": [
{
"filename": "Package.Standard.dll",
"hidden" : false,
"controls": ["Container", "ValueListEditor"]
}
]
}
Редактор формы - это часть Конструктора Форм, в которой происходит создание внешнего вида форм для приложений. Чтобы разместить элемент управление на нем, просто выберите нужный улемент управления в секции с элементами управления и компонентами кликнув на нужном и дальше кликните в нужном месте редактора формы. Чтобы выбрать элемент управления в редакторе формы просто щелкните левой кнопкой мышы на нем. Чтобы выбрать несколько элементов управления, кликайте на всех нужных элементах управления зажав клавишу Shift на клавиатуре. Если кликнуть еще раз на выбранном элементе управления пока нажата клавиша Shift, то элемент управления перестанет быть выбранным. Чтобы выбрать все элементы управления и компоненты на форме, используйте сочетание клавиш Ctrl+A. Так же можно выделять нажав левую кнопку мыши где-нибудь на форме и протянув курсор так, чтобы нужные элементы управления попали в выбранный прямоугольник. После этого отпустите кнопку мышы.
Для удаления выделенных элементов управления и компонентов можно нажать клавишу Delete на клавиатуре. Заметьте, клавиши и их комбинации на клавиатуре работают только когда редактор формы активен. Он становится не активным, когда Вы кликаете на других частях Констуктора Форм, таких как кнопки элементов управления или редактор свойств. Для активации редактора формы нужно кликнуть на нем(левой или правой кнопкой мышы; в случае клика правой кнопкой выделение останется незатронутым). Когда выделено несколько элементов управления, только их перемещения остается доступным. Вы можете заметить это по изменившемуся цвету маркеров трансформаций. Так же, компоненты нельзя ни вращать ни менять их размер. По умолчанию все операции, как перемещение, изменение размера и вращение, привязаны к сетке. Сетку можно отключить в окне настроек Конструктора Форм. Можно перемещать выделенные элементы управления и компоненты с помощью стрелок на клавиатуре. Если при этом держать нажатой клавишу Shift, то будет менятся их размер вместо перемещения. Операции производимые с помощью стрелок на клавиатуре не привязаны к сетке, однако, если Вы хотите чтобы они все же были привязаны, просто зажмите клавишу Ctrl.
Если текущая выбранная шкурка разрешает изменения размера формы, это можно сделать перетаскивая правую или нижнюю границу формы или ее правый нижний угол.
Когда Редактор Формы активен, он подсвечивается синей границей как показано на картинке ниже. Вы можете изменить цвет подсветки и ширину границ в настройках Конструктора Форм. Так же возможно полностью убрать такую подсветку установив ширину всех границ в ноль. Назначением этой подсветки является улучшение и облегчение работы пользователю с Конструктором Форм. Некоторые сочетания клавиш работают только когда Редактор Формы активен, а некоторые даже имеют разное значение, в зависимости от того, какая часть Конструктора Форм активна. Так что теперь можно видеть когда Редактор Формы активен и можно быть уверенным что нужная комбинация клавиш будет делать именно то, что Вы от нее ожидаете.
Редактор иерархии представляет Вашу форму в иерархическом виде и позволяет делать некоторые операции недоступные в редакторе формы. Когда Вы выделяете элемент управления или снимаете выделение с него в редакторе формы, тоже самое автоматически происходит в редакторе иерархии и аналогично наоборот. Чтобы выбрать элемент управления в редакторе иерархии достаточно кликнуть по нему. Чтобы добавить элемент управления к уже выделенным(или исключить из выделенных) зажмите клавишу Ctrl при клике. И хотя несколько элементов могут быть выбраны одновременно, только один из них может быть активным. Вы можете видеть это по подсвеченной красным границе, если элемент так же выделен, или черной границе, если он активен но не выделен. Некоторые действия происходят только с активным элементом управления. Так же можно использовать стрелки на клавиатуре, кнопки Home и End, для выбора и активации первого, последнего, предидущего и следующего элемента управления, а так же навигации внутрь и наружу по иерархии. Вы можете переключать видимость дочерних элементов в иерархии кнопками выглядящими как "+" и "-" в квадратике. Кнопки с верхней и нижней стрелкой нужны для изменения порядка создания элементов управления. Если нажать на клавишу Delete, все выбранные элементы управления, компоненты и другие объекты будут удалены. Тоже самое произойдет если нажать на кнопку выглядящую как кружек с "-" внутри. Некоторые элементы управления и компоненты позволяют добавлять дочерние элементы управления или другие сущности. Если активировать элемент управления/компонент/элемент списка, который позволяет это делать, то можно кликнуть на кнопке выглядящей как кружечек с "+" внутри и добавить дочерний элемент. Некоторые элементы управления позволяют добавлять элементы только первого уровня(например, ListBox). Так что, даже если кликнуть на одном из существующих элементов и после этого нажать на кнопку добавления, то новый элемент все равно будет добавлен к ListBox, а не к активному элементу. Некоторые другие элементы управления могут иметь многоуровневую структуру. Эта структура называется деревом. Для таких элементов управления, новые элементы будут добавлятся как дочерние элементы активного элемента. Некоторые элементы управления, такие как MainMenu показанный ниже, спрашивают какой тип элемента нужно добавить и дополнительные данные перед добавлением.
Одно из наиболее важных действий, которое можно производить только в редакторе иерархии - это перемещение элементов управления на и с других элементов управления. Чтобы это сделать достаточно перетащить и отпустить выбранные элементы управления на нужный элемент управления. Если операция недоступна, Вы будете проинформированы измененным курсором мышы при перетаскивании. Чтобы переместить элемент управления с другого элемента управления непостредственно на форму, перетащите и отпустите его на свободное пространство редактора иерархии. Также можно выделять элементы списка, что невозможно делать в редакторе формы. Если выбрать элемент(ы) списка, можно редактировать его свойства в редакторе свойств. Элементы управления, компоненты и элементы списка различаются разными иконками в редакторе иерархии. Вы найдете больше информации о различных типах объектов в статье Принципы.
Редактор позволяет редактировать свойства элементов управления, компонентов, элементов списка и форм. Если ничего не выбрано, то редактор свойств содержит свойства формы. Когда Вы выделяете что-то на форме или в редакторе иерархии, его свойства появляются в редакторе свойств. При выделении нескольких объектов их общие свойства так же можно редактировать. Заметьте, в этом случае отображаются значения свойств только первого выбранного объекта однако, когда Вы отредактируете любое свойство, изменения применятся ко всем выделенным объектам. Можно пользоваться стрелками на клавиатуре и обычными кнопками, такими как Home, PageDown и так далее, для навигации по свойствам. Некоторые свойства, как Вы можете видеть, имеют несколько "подсвойств". Получить доступ к ним можно кликнув по иконке "+" слева от имени свойства. Эти "подсвойста" говорят о том, что свойство может иметь разные значения в зависимости от состояния элемента управления и эти значения можно изменять отдельно для каждого доступного состояния. Когда Вы кликаете на свойстве(то же самое происходит если Вы используете клавиатуру для перемещения к другому свойству в списке), оно становится активным и можно изменять его значение. Некоторые свойства можно редактировать непосредственно в редакторе свойств, другие же можно отредактировать в окне внешнего редактора. Обычно у таких свойств в активном состоянии присутствует небольшая кнопка справа с 3-мя точками указывающая на наличие внешнего редактора. Вы можете кликнуть на этой кнопке(или сделать двойной щелчек мышью по значению свойства), чтобы открыть окно редактора. Существует много типов внешних редакторов. Их внешний вид и поведение зависит от свойства и реализация предоставляется установленными пакетами.
Перетаскивая тонкую полоску между именами свойств и их значениями можно менять соотношение места занимаемое ими. При двойном клике на этой полоске зона разделится ровно поровну.
Большинство внешних редакторов достаточно просты и понятны. Однако, чтобы иметь полную документацию, мы собираемся написать немного о каждом внешнем редакторе входящем в состав Стандартного Пакета. И хотя эта информация относится к Стандартному Пакету, мы размещаем ее здесь вместо того, чтобы поместить ее в справочную систему по Стандартному Пакету.
Этот редактор позволяет выбирать цвет. Можно кликать на цветных секциях для выбора цвета визуально. Левая секция называется HSV-панель, а вторая HSV-полоса. Так же можно указывать точные значения в полях ввода либо в HSV либо в RGB форматах. Не забывайте указывать нужное значение "A", которое представляет собой прозрачность или альфа-канал. 0 - полностью прозрачный цвет, 255 - полностью непрозрачный цвет. Можно воспользоваться клавишами Enter и Esc на клавиатуре для применения изменений или их отмены.
Этот редактор позволяет легко проектировать градиенты. Можно добавлять контрольные точки к градиенту кликая на его графическом представлении в верхней части формы редактора и удалять кликая правой кнопкой мышы на нужной точке. Можно кликнуть на точке, чтобы выделить ее и перетаскивать в нужное положение. Так же можно установить точное положение в поле ввода. Это значение должно быть в диапазоне 0..1. У выбранной точки можно поменять цвет кликнув на панель слева ниже градиента. Появится уже знакомый Вам редактор цвета. Используя кнопки со стрелками можно переключатся между точками градиента. Это полезно когда они находятся очень близко друг к другу и становится невозможным выбрать нужную точку кликая по ней. Так же можно выбрать тип градиента в выпадающем списке. При этом представление градиента на форме не изменится однако не волнуйтесь - нужный тип будет применен к редактируемому свойству. Так же можно применить изменения нажав Ctrl+Enter и отменить их нажав клавишу Esc.
Используется для указания комбинации клавиш. Просто активируйте поле ввода и нажмите любую комбинацию клавиш, которая Вам нужна. Укажите будет ли это комбинация на нажатие или отпускание клавиш(многие свойства работают в независимости от состояния этого флага) используя чекбокс справа. Если никакая комбинация клавиш больше не нужна, используйте кнопку No hotkey чтобы очистить поле ввода.
Этот редактор похож на предидущий, только он управляет списком горячих клавиш. Можно добавлять и удалять горячие главиши, очищать список и кликнув на OK применять изменения или на Cancel для их отмены.
Редактор позволяет загружать и удалять картинку в свойство. После загрузки картинки, ее размер появится ниже кнопок. Избегайте использования свойств с большими картинками. Будет лучше иметь картинки отдельно от приложения и загружать их вручную. Картинки в свойствах хранятся без каких-либо оптимизаций и сжатий и, более того, они производят огромное количество исходного кода при генерации прототипа формы.
Этот редактор позволяет редактировать свойства, которые могут содержать несколько картинок одновременно. Мы называем их списком картинок. В просмотре картинок можно кликнуть и выбрать картинку, а так же удалить ее если она была добавлена случайно или больше не нужна. То же самое предостережение: избегайте использования больших картинок или большого количества маленьких.
Редактор позволяет указывать матрицы непосредственно редактируя их элементы. Во фреймверке используются квадратные матрицы размером 4x4 для преобразования векторов. При преобразовании вектора матрица умножается на вектор (матрица * вектор). Помните это при задании элементов матрицы.
Этот редактор представляет простой текстовый редактор для многострочного текста. Он обладает общими свойствами и сочетаниями клавиш для подобных редакторов.
Это специфический редактор. Он разработан только для элементов управления типа меню Стандартного Пакета. Он позволяет выбирать какой тип элемента добавить к элементам управления MainMenu или PopupMenu.
Эти четыре похожих редактора позволяют редактировать свойства, которые хранят 2 значения либо в виде целых чисел либо в виде чисел с плавающей точкой. У многих свойств значения хранятся в такой форме. Например, ShadowShift указвающее как далеко располагается тень относительно элемента управления в направлениях X и Y.
Этот редактор позволяет редактировать свойства, которые представляют собой набор из 2 булевских значений.
Эти редакторы позволяют указывать значения свойств, которые представляют собой набор из 4 значений являющихся либо целыми числами либо числами с плавающей точкой. Например, свойство BorderWidth обычно хранит информацию о ширине всех четырех границ.
Этот редактор позволяет редактировать свойства, которые представляют собой набор из 4 булевских значений.
Этот редактор используется для редактирования значений свойств, которые хранят набор из 4х значений цвета. Например, свойство BorderColor часто указывает цвета всех 4х возможных границ.
Этот редактор служит для редактирования трансформаций. Объект трансформация используется очень часто. Все элементы управления используют трансформации. Трансформация состоит из трех типов преобразований: трансляция или перемещение, вращение и масштабирование. Их значения можно указать в полях ввода. Значения вращений должны быть в радианах. Так же трансформация хранит информацию о том, как все эти преобразования должны сочетаться вместе. Можно указать порядок вращения и порядок применения преобразований. Рекомендуется использовать значения по умолчанию.
Этот редактор позволяет визуально редактировать двоичные маски. Двоичная маска представляет собой 32-битное беззнаковое целое число, в котором каждый бит используется как маска. Если значение бита равно нулю, то не будет ничего рисоваться в соответствующей позиции. Рисование с использованием масок обычно можно обнаружить в элементах управления использующих свойства "обводки". Например, StringGrid использует его для обозначения активной ячейки.
Назначением этого редактора является управление свойствами, которые представляют собой массивы логических значений.
Назначением этого редактора является управление свойствами, которые представляют собой массивы целых чисел.
Назначением этого редактора является управление свойствами, которые представляют собой массивы чисел с плавающей точкой.
Назначением этого редактора является управление свойствами, которые представляют собой массивы цветов.
This editor allows to select which type of item is to be added to the Select widget and widgets like it having two types of items: regular and category.
Редактор событий позволяет редактировать названия событий элементов управления. Эти названия будут в заголовочном файле прототипа формы в виде методов класса и должны быть реализованы в Вашем приложении. Если событие Вам более не нужно, просто очистите значение рядом с его именем. Если событию не назначено название Вы можете с помощью двойного клика сгенерировать для него название, которое собирается из имен элемента управления и события. Так же можно использовать выпадающий список чтобы выбрать уже существующее событие. Только совместимые события будут в этом выпадающем списке. Отметьте: когда вы назначаете одно и то же имя разным событиям, один и тот же метод будет вызываться для этих разных событий и Вам, скорее всего, придется каким-то образом принимать решение в Вашем C++ коде о том, какое действие предпринять.