Для понимания идеологии создания графического интерфейса следует вспомнить работу с обычными графическими объектами MATLAB. Принципиальное значение имеют встроенные функции для доступа к свойствам таких объектов – set и get. Первая функция устанавливает значения свойств, вторая возвращает установленные значения и, что более важно для данной главы, формирует указатели на графические объекты. Важно отметить различие в результатах использования функции set. Например, в программе можно написать – CurFig=figure, и будет создано пустое графическое окно. Инструкция set(CurFig,’Position’,[0 0 800 600]) приведет к созданию окна с размером 800 на 600 пикселей. А команда set(figure,’Position’,[0 0 800 600]) изменит настройки по умолчанию, и все объекты figure далее будут создаваться с такими размерами.

Уникальность MATLAB в части проектирования графического интерфейса заключается в том, что традиционные для любых сред разработки приложений элементы – кнопки, меню, полосы прокрутки и др. – практически не отличаются по своей внутренней структуре от специфических объектов – осей координат, подписей к графикам. Например, в традиционных средствах разработки создание пользовательского интерфейса реализуется легко, а создание средств научной графики требует подключения дополнительных библиотек или низкоуровневого программирования. В MATLAB доступ ко всем графическим объектам реализован одинаково независимо от их специфики. Базируется такая общность на иерархии классов MATLAB.

MATLAB является объекто-ориентированным языком программирования. В основе этой технологии лежат три понятия – класс, наследование, полиморфизм. Рассмотрим эти понятия на примерах. Когда в MATLAB строится график функции, то создаётся новое графическое окно. Пустое окно можно создать встроенной командой figure. В любом случае создаётся (по терминологии объектно-ориентрированного программирования) объект или экземпляр класса. В иерархии MATLAB содержится определение класса, со всеми свойствами, методами событиями и прочим. Когда был создан экземпляр этого класса, то сам базовый класс при этом не был изменен, и далее на основе базового класса можно создавать новые объекты. Таким образом, в MATLAB в одном графическом окне размещаются сразу несколько экземпляров класса Axes. В иерархии классов у всех за исключением самого верхнего есть родительские классы (parent) и дочерние, или производные (children). Идея наследования состоит в том, что дочерние классы обладают теми же свойствами, что и родительские. Таким образом, сокращаются расходы на программирование новых классов, в том числе и пользовательских. В MATLAB объект figure обладает свойством Position, которое хранит координаты левого нижнего угла, ширину и высоту графического окна и у всех объектов ниже по иерархии имеется свойство Position. Это значительно облегчает повторное использование и сопровождение кода, при этом в новых классах, создаваемых на основе базовых, можно определять и новые свойства. Наконец, идея полиморфизма заключается в так называемой перегрузке функций – функции, унаследованные от базового класса, можно переопределить, и в результате функция одна и та же будет возвращать результат в зависимости от того, к какому аргументу она применена.

Иерархию классов в MATLAB продемонстрировать очень просто. В консоли введите команду figure – откроется пустое окно. Далее введите get(gcf), будет выведен подробный список свойств графического объекта. Найдите в этом списке два – Parent и Children. Убедитесь, что значение первого свойства 0, а второго – пустой массив – []. После этого в консоли введите axes. Очень важно, что создание осей координат не вызовет создание нового объекта figure, а приведет к появлению в уже имеющемся окне (окно, созданное после предыдущей команды, закрывать не нужно) осей координат. После этого введите – get(gca) и в списке снова найдите те же свойства. Убедитесь, что для осей они равны соответственно 1 и []. После этого введите get(gcf), и вы увидите, что свойство Children у объекта figure перестало быть пустым массивом – у объекта figure появился дочерний экземпляр класса axes. Далее обратите внимание, что у axes имеются свойства, отсутствующие у figure FontSize, FontName и другие, связанные со шрифтами.

Верхним в иерархии графических объектов является Root, – дословно – корневой объект. Указателем на этот объект является число ноль, и поэтому в качестве родителя объекта figure было именно нулевое значение. Важно понять, что Root это собственно окно самой системы MATLAB (конечно, если MATLAB работает в режиме графического интерфейса). Используя свойства этого объекта, можно, программно управлять настройками MATLAB. Например, обеспечить вывод чисел в консоль в формате longEng set(0,’format’,’longEng’). Следующими в иерархии являются figure и axes. Производными от axes классами являются:

Ввод в консоли MATLAB имени любого из этих объектов обеспечит его создание со всеми параметрами, установленными по умолчанию. Чтобы создавать пользовательские объекты с измененными свойствами, следует использовать функцию set. Для начала нужно создать указатель на новый графический объект, например командой – MyHandle=get(figure). После этого можно по созданному указателю установить любые свойства пользовательского графического окна. Сделать это можно и после того, как окно уже прорисовалось и до этого. Установка значений всегда имеет следующий синтаксис – set(’name’,’value’), name имя свойства, value – название (если название – переменная типа char, то она должна быть в апострофах). Для создания, например, осей координат не обязательно заранее создавать экземпляр класса figure, его создание происходит автоматически, как объекта, расположенного выше по иерархии. То же относится к объектам, дочерним по отношению к axes.