Работа с ресурсами для оптимизации MapInfo: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 29 промежуточных версий 2 участников)
Строка 1: Строка 1:
В этой заметке будет описан способ редактирования диалоговых окон, текстовых объектов и других объектов интерфейса, находящиеся в ресурсах динамических библиотек, подгружаемых MapInfo.
{{Статья|Опубликована|mapinfo-resources}}
 
'''Внимание! Действия, производимые в статье, могут нарушать [http://www.pitneybowes.com/us/license-terms-of-use/software-and-data-end-user-license-agreement.html лицензионное соглашение] разработчиков MapInfo — компании Pitney Bowes. Поэтому любые изменения файлов и (или) их дальнейшая публикация производятся на свой страх и риск.'''
 
В этой заметке описан способ редактирования диалоговых окон, текстовых объектов и других объектов интерфейса, находящихся в ресурсах динамических библиотек MapInfo.


Для работы потребуется утилита [http://angusj.com/resourcehacker/resource_hacker.zip Resource Hacker], которая является бесплатной и не требует установки.
Для работы потребуется утилита [http://angusj.com/resourcehacker/resource_hacker.zip Resource Hacker], которая является бесплатной и не требует установки.
Строка 5: Строка 9:
== Работа с диалоговыми окнами ==
== Работа с диалоговыми окнами ==


Диалоговые окна в MapInfo - тема довольно интересная. Связано это с тем, что диалоговые окна по большей части являются статическими: их невозможно ни развернуть, ни растянуть, ни запомнить их последующее положение. Практически все окна в MapInfo небольшие по своему. Возможно, это связано с тем, чтобы окна полностью уменьшались на экране монитора даже на самом низком разрешении. Однако, с развитием технологий и увеличением разрешения экрана, размер окон остался неизменным и всё таким же неудобным. Но существуют возможности исправить эти недочёты, о чём и будет сказано в этом разделе.
Диалоговые окна в MapInfo тема довольно интересная. Связано это с тем, что диалоговые окна по большей части являются статическими их невозможно ни развернуть, ни растянуть, ни запомнить их последующее положение. Практически все окна в MapInfo небольшие по размеру. Возможно, это связано с тем, чтобы окна полностью уменьшались на экране монитора даже на самом низком разрешении. Однако, с развитием технологий и увеличением разрешения экрана, размер окон остался неизменным и всё таким же неудобным. Существуют возможности исправить эти недочёты, о чём и будет сказано в этом разделе.


После распаковки и запуска программы Resource Hacker, открываем файл '''mires.dll''', находящийся в корневой директории с MapInfo. Для примера написания данной статьи взята последняя 32-х битная версия MapInfo, а именно 15.0. Но файл mires.dll принципиально ничем не отличается, поэтому информация будет также актуальной и для старых версий MapInfo.
После распаковки и запуска программы Resource Hacker открываем файл '''mires.dll''', находящийся в корневой директории MapInfo. Для написании данной статьи использовалась 32-х битная версия MapInfo 15.0. Но файл mires.dll принципиально ничем не отличается в различных версиях, поэтому информация будет также актуальной и для старых версий MapInfo.


После того, как файл mires.dll будет открыт, необходимо перейти в директорию Dialog. Далее, для примера, поработаем с окном "Закрыть таблицу". Для того, чтобы быстро найти нужный диалог и вдобавок узнать номер ресурса, можно воспользоваться поиском. Диалог и его описание выглядят так:
После того, как файл mires.dll будет открыт, необходимо перейти в директорию Dialog. Далее, для примера, поработаем с окном "Закрыть таблицу". Для того, чтобы быстро найти нужный диалог и вдобавок узнать номер ресурса, можно воспользоваться поиском. Диалог и его описание выглядят так:


[[Файл:Resources1.jpg|200px|thumb|center|Диалог "Закрыть таблицу"]]
[[Файл:Resources1.png|400px|center|Диалог "Закрыть таблицу"]]
 
'''2520 DIALOG 21, 30, 203, 98''' — Здесь следует объявление номера ресурса, а также начальные координаты появления окна на экране и размеры окна.
 
'''STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU''' —Объявление стилей согласно Win32 API. Полное их описание можно почитать на [https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms632600(v=vs.85).aspx сайте MSDN].
 
'''CAPTION "Закрыть таблицу"''' — Заголовок окна
 
'''LANGUAGE LANG_RUSSIAN, 0x0''' — Объявление используемого языка ресурса. В изменении нет необходимости
 
'''FONT 8, "Helv"''' — Объявление стиля и размера используемого в диалоге шрифта
 
Далее следуют объявления компонентов диалога. Рассмотрим только создание статической надписи:
 
'''CONTROL "&Закрыть таблицы:"''' — Объявление заголовка для элемента диалога. Подходит преимущественно для текстовых надписей или кнопок.
 
'''-1''' - идентификатор элемента диалога, и при этом самая важная его часть. Если для статических надписей это число всегда равно "-1", то для остальных элементов это число уникально. Или почти уникально, в зависимости от выполняемой операции. Например, если в диалоге присутствует кнопка "ОК" или "Сохранить" (для диалога "Сохранить таблицу") или "Восстановить" (для диалога "Восстановить таблицу"), то идентификатор этой кнопки всегда будет "1", что будет означать, что пользователь указал всё необходимое в диалоге и готов применить изменения. Для "Отмены" и "Справки" идентификаторы равны 2 и 5 соответственно, причём в любом диалоге. Например, список типов открытия таблицы ("В новой карте", "В активной карте" и т.д.) фигурирует в нескольких диалогах и в каждом из них имеет один и тот же идентификатор, так как список передаётся туда программно.
 
'''STATIC''' - тип элемента диалога. В данном случае статическая строка, на которую ничего не передаётся из другого элемента управления.
 
Далее следуют знакомые уже типы стилей оформления и координаты.
 
Элементы диалога возможно изменять как путём перемещения и растягивания оных с помощью указателя, так и задавая точные необходимые значения. Например, если необходимо будет поменять размер и сдвинуть какие-то кнопки, то проще это сделать путём редактирования координат и размеров, представленных в числовом виде. При этом необходимо в конце редактирования нажимать клавишу F5 для компиляции ресурса, чтобы изменения сразу вступили в силу, и их можно было увидеть. В случае изменения объектов указателем нажимать каждый раз F5 необязательно (так как изменения буду стразу же видны), однако, это всё равно потребуется в конце всех операций. В конечном итоге, может получиться подобный результат:
 
[[Файл:Resources2.png|center|Измененный диалог в MapInfo]]
 
После компиляции всех изменений файл '''mires.dll''' необходимо сохранить. Сохранение возможно только при закрытом MapInfo.
 
== Работа с динамическими элементами диалога ==
 
В диалогах MapInfo не все элементы являются статическими. Некоторые элементы подгружаются посредством программного кода. Самый яркий пример — окно регистрации растра, которое является крайне неудобным для выполнения своих задач.
 
[[Файл:Resources3.png|700px|center|Окно регистрации растра]]
 
Чтобы его расширить, необходимо помимо растягивания главного окна диалога вытянуть по длине полосы вертикальной и горизонтальной прокрутки. После этого рабочее пространство привязки увеличится. А при желании можно поиграться с другими элементами управления и в итоге получить что-то вроде этого:
 
[[Файл:Resources4.png|700px|center|Растянутое окно регистрации растра]]
 
Как уже говорилось ранее, если окно растянуть до размеров экрана 1920х1280, то при разрешении экрана, например, 1280х960, окно выползет за пределы и работать станет практически невозможно. За этим необходимо следить.
 
== Примеры настройки стилей в диалоговых окнах ==
 
=== Пример 1. Стили полей ввода текста. ===
 
[[Файл:Resources5.png|700px|center|Диалог правки текстовых объектов]]
 
Речь пойдёт о поле ввода текста. Основное неудобство его в том, что диалог нельзя завершить путём нажатия клавиши Enter — необходимо нажимать мышкой на кнопку ОК. Либо посредством клавиши Tab переключаться между элементами диалога до тех пор, пока не дойдём до кнопки ОК. Тогда клавиша Enter сработает. Связано это с тем, что нажатие клавиши Enter в поле ввода текста приводит к началу новой строки и возврату «каретки». Однако эта особенность — не более чем один из стилей оформления данного элемента диалога. Чтобы изменить элемент, нужно кликнуть по нему правой кнопкой мыши и выбрать "Edit Control".
 
[[Файл:Resources6.png|center|Окно редактирования стилей и других параметров элемента диалога]]
 
Интересующий нас стиль называется '''ES_WANTRETURN'''. После его отключения, компиляции изменений и сохранения файла, текст в этом диалоге (уже в самом MapInfo) можно будет закрыть посредством нажатия клавиши Enter. А так как клавиша Enter больше не создаёт новую строку текста, то для её создания нужно использовать комбинацию Ctrl+Enter. Кроме того, поле ввода текста можно тоже увеличить и получить что-то подобное:
 
[[Файл:Resources7.png|center|Растянутый диалог правки текстовых объектов]]
 
По этой же технологии можно изменить поле ввода текста для диалога редактирования выносных подписей.
 
=== Пример 2. Стили кнопочных элементов. ===
 
Снова обратимся к диалогу "Закрыть таблицу" и к кнопкам "Закрыть" и "Отмена".
 
'''CONTROL "Закрыть", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 170, 19, 45, 14'''
 
''' CONTROL "Отмена", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 170, 37, 45, 14'''
 
Если нас не устраивает тот факт, что клавиша "Закрыть" подсвечена по-умолчанию, и при нажатии клавиши Enter выбранные таблицы будут закрыты, то можно изменить стиль оформления с '''BS_DEFPUSHBUTTON''' на '''BS_PUSHBUTTON''' у кнопки "Закрыть". При этом необходимо провести обратную операцию для кнопки "Отмена". В этом случае кнопкой по-умолчанию станет она, и результат будет достигнут.
 
=== Пример 3. Дополнительные стили кнопочных элементов. ===
 
Рассмотрим диалог под номером 9070 из файла '''mires.dll'''.
 
[[Файл:Resources10.png|700px|center|Динамический диалог]]
 
Диалог интересен тем, что является динамическим, то есть его содержимое меняется в зависимости от запросов MapInfo. Кроме того, программно устанавливается, какая кнопка будет главной (подсвеченной) по-умолчанию. Например, если в MapInfo подгружена только одна таблица, в которой произошли изменения, и есть необходимость восстановить её, то MapInfo выдаст соответствующий запрос, в котором предложит либо восстановить таблицу, либо отменить и закрыть диалог. При этом кнопка "Восстановить" (та же кнопка "ОК", только с заменённым текстом) будет в приоритете, хотя стиль '''BS_DEFPUSHBUTTON''' не установлен. В других случаях, таких как изменение типа полей таблицы, может возникать другое окно, где уже кнопка "Отмена" будет в приоритете.
 
Предположим, что существует необходимость, чтобы кнопка "Отмена" никогда не бывала активной по-умолчанию. Но тут возникает интересная особенность. Кнопка "Отмена" вместо ID 2 имеет ID 4. Попытка смены ID даёт то, что кнопка перестаёт отображаться вообще. Попытка принудительно назначить кнопке "ОК" стиль '''BS_DEFPUSHBUTTON''' ничего не даёт. Поэтому альтернативным вариантом решения является возможность отключения этой кнопки, так как диалог в любом случае можно закрыть с помощью клавиши Esc. Чтобы отключить кнопку, необходимо применить для кнопки стиль '''WS_DISABLED'''. После чего можно получить такой результат:
 
[[Файл:Resources11.png|center|Отключенная кнопка]]
 
== Добавление и изменение текстовых констант ==


'''2520 DIALOG 21, 30, 203, 98''' - здесь следует объявление номера ресурса, а также начальные координаты появления окна на экране и размеры окна.
В этом разделе речь пойдёт о текстовых строках, которые также содержатся в ресурсах. Основные файлы, где они хранятся — '''mires.dll''' и '''micore.dll'''. Рассматриваться будет '''micore.dll'''. Необходимо открыть файл, перейти в директорию '''String Table''' и открыть раздел строк под номером 393.


'''STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU''' - объявление стилей согласно Win 32 API. Некоторые из них будут рассмотрены далее, но полное их описание можно почитать на [https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms632600(v=vs.85).aspx сайте MSDN]
[[Файл:Resources8.png|700px|center|Текстовые строки]]


'''CAPTION "Закрыть таблицу"''' - Заголовок окна
Как видно из примера, здесь представлено некоторое количество строк. Некоторые из них специальные, содержащие переменные, в которые будут подставлены названия таблиц или колонок. Однако, нас интересуют строки под номерами 6276-6279. Там представлены функции соответствующего списка из диалога "SQL-запрос". Если следовать представленному синтаксису, то можно дописать в этот раздел свои собственные функции. Например, можно добавить функции ObjectInfo и ObjectGeography в строку 6278. После сохранения и компиляции результат будет выглядеть так:


'''LANGUAGE LANG_RUSSIAN, 0x0''' - объявление используемого языка ресурса. В изменении нет необходимости
[[Файл:Resources9.png|center|Новые добавленные функции]]


'''FONT 8, "Helv"''' - объявление стиля и размера используемого в диалоге шрифта
== Заключение ==


Далее следуют объявления компонентов диалога: статической строки, списка и кнопок. Большинство их атрибутов интуитивно понятны и могут быть изменены на своё усмотрение. Единственное, что не стоит менять, так это номер исполняемого действия для элемента. В вышеуказанном диалоге для кнопки "Закрыть" этот номер равен 1, для кнопки "Отмена" - 2, а для кнопки вызова справки - 5. В случае изменения данного атрибута элемент диалога будет выполнять не те действия, которые для него были прописаны. Все остальные атрибуты возможно изменять как путём перемещения и растягивания оных с помощью мышки, так и задавая точные необходимые значения. Например, если необходимо будет
В статье показаны варианты редактирования диалоговых окон и их элементов. Возможности добавления своих элементов сильно ограничены, так как основная их часть должна быть запрограммирована для достижения тех или иных результатов, чего через ресурсы выполнить невозможно. Но тем не менее, при определённых навыках и творчестве можно получить интересные варианты.


{{Статья|Черновик}}
На этом всё. Успешной работы!

Текущая версия от 09:09, 17 февраля 2017

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/mapinfo-resources.html


Внимание! Действия, производимые в статье, могут нарушать лицензионное соглашение разработчиков MapInfo — компании Pitney Bowes. Поэтому любые изменения файлов и (или) их дальнейшая публикация производятся на свой страх и риск.

В этой заметке описан способ редактирования диалоговых окон, текстовых объектов и других объектов интерфейса, находящихся в ресурсах динамических библиотек MapInfo.

Для работы потребуется утилита Resource Hacker, которая является бесплатной и не требует установки.

Работа с диалоговыми окнами

Диалоговые окна в MapInfo — тема довольно интересная. Связано это с тем, что диалоговые окна по большей части являются статическими — их невозможно ни развернуть, ни растянуть, ни запомнить их последующее положение. Практически все окна в MapInfo небольшие по размеру. Возможно, это связано с тем, чтобы окна полностью уменьшались на экране монитора даже на самом низком разрешении. Однако, с развитием технологий и увеличением разрешения экрана, размер окон остался неизменным и всё таким же неудобным. Существуют возможности исправить эти недочёты, о чём и будет сказано в этом разделе.

После распаковки и запуска программы Resource Hacker открываем файл mires.dll, находящийся в корневой директории MapInfo. Для написании данной статьи использовалась 32-х битная версия MapInfo 15.0. Но файл mires.dll принципиально ничем не отличается в различных версиях, поэтому информация будет также актуальной и для старых версий MapInfo.

После того, как файл mires.dll будет открыт, необходимо перейти в директорию Dialog. Далее, для примера, поработаем с окном "Закрыть таблицу". Для того, чтобы быстро найти нужный диалог и вдобавок узнать номер ресурса, можно воспользоваться поиском. Диалог и его описание выглядят так:

Диалог "Закрыть таблицу"

2520 DIALOG 21, 30, 203, 98 — Здесь следует объявление номера ресурса, а также начальные координаты появления окна на экране и размеры окна.

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU —Объявление стилей согласно Win32 API. Полное их описание можно почитать на сайте MSDN.

CAPTION "Закрыть таблицу" — Заголовок окна

LANGUAGE LANG_RUSSIAN, 0x0 — Объявление используемого языка ресурса. В изменении нет необходимости

FONT 8, "Helv" — Объявление стиля и размера используемого в диалоге шрифта

Далее следуют объявления компонентов диалога. Рассмотрим только создание статической надписи:

CONTROL "&Закрыть таблицы:" — Объявление заголовка для элемента диалога. Подходит преимущественно для текстовых надписей или кнопок.

-1 - идентификатор элемента диалога, и при этом самая важная его часть. Если для статических надписей это число всегда равно "-1", то для остальных элементов это число уникально. Или почти уникально, в зависимости от выполняемой операции. Например, если в диалоге присутствует кнопка "ОК" или "Сохранить" (для диалога "Сохранить таблицу") или "Восстановить" (для диалога "Восстановить таблицу"), то идентификатор этой кнопки всегда будет "1", что будет означать, что пользователь указал всё необходимое в диалоге и готов применить изменения. Для "Отмены" и "Справки" идентификаторы равны 2 и 5 соответственно, причём в любом диалоге. Например, список типов открытия таблицы ("В новой карте", "В активной карте" и т.д.) фигурирует в нескольких диалогах и в каждом из них имеет один и тот же идентификатор, так как список передаётся туда программно.

STATIC - тип элемента диалога. В данном случае статическая строка, на которую ничего не передаётся из другого элемента управления.

Далее следуют знакомые уже типы стилей оформления и координаты.

Элементы диалога возможно изменять как путём перемещения и растягивания оных с помощью указателя, так и задавая точные необходимые значения. Например, если необходимо будет поменять размер и сдвинуть какие-то кнопки, то проще это сделать путём редактирования координат и размеров, представленных в числовом виде. При этом необходимо в конце редактирования нажимать клавишу F5 для компиляции ресурса, чтобы изменения сразу вступили в силу, и их можно было увидеть. В случае изменения объектов указателем нажимать каждый раз F5 необязательно (так как изменения буду стразу же видны), однако, это всё равно потребуется в конце всех операций. В конечном итоге, может получиться подобный результат:

Измененный диалог в MapInfo

После компиляции всех изменений файл mires.dll необходимо сохранить. Сохранение возможно только при закрытом MapInfo.

Работа с динамическими элементами диалога

В диалогах MapInfo не все элементы являются статическими. Некоторые элементы подгружаются посредством программного кода. Самый яркий пример — окно регистрации растра, которое является крайне неудобным для выполнения своих задач.

Окно регистрации растра

Чтобы его расширить, необходимо помимо растягивания главного окна диалога вытянуть по длине полосы вертикальной и горизонтальной прокрутки. После этого рабочее пространство привязки увеличится. А при желании можно поиграться с другими элементами управления и в итоге получить что-то вроде этого:

Растянутое окно регистрации растра

Как уже говорилось ранее, если окно растянуть до размеров экрана 1920х1280, то при разрешении экрана, например, 1280х960, окно выползет за пределы и работать станет практически невозможно. За этим необходимо следить.

Примеры настройки стилей в диалоговых окнах

Пример 1. Стили полей ввода текста.

Диалог правки текстовых объектов

Речь пойдёт о поле ввода текста. Основное неудобство его в том, что диалог нельзя завершить путём нажатия клавиши Enter — необходимо нажимать мышкой на кнопку ОК. Либо посредством клавиши Tab переключаться между элементами диалога до тех пор, пока не дойдём до кнопки ОК. Тогда клавиша Enter сработает. Связано это с тем, что нажатие клавиши Enter в поле ввода текста приводит к началу новой строки и возврату «каретки». Однако эта особенность — не более чем один из стилей оформления данного элемента диалога. Чтобы изменить элемент, нужно кликнуть по нему правой кнопкой мыши и выбрать "Edit Control".

Окно редактирования стилей и других параметров элемента диалога

Интересующий нас стиль называется ES_WANTRETURN. После его отключения, компиляции изменений и сохранения файла, текст в этом диалоге (уже в самом MapInfo) можно будет закрыть посредством нажатия клавиши Enter. А так как клавиша Enter больше не создаёт новую строку текста, то для её создания нужно использовать комбинацию Ctrl+Enter. Кроме того, поле ввода текста можно тоже увеличить и получить что-то подобное:

Растянутый диалог правки текстовых объектов

По этой же технологии можно изменить поле ввода текста для диалога редактирования выносных подписей.

Пример 2. Стили кнопочных элементов.

Снова обратимся к диалогу "Закрыть таблицу" и к кнопкам "Закрыть" и "Отмена".

CONTROL "Закрыть", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 170, 19, 45, 14

CONTROL "Отмена", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 170, 37, 45, 14

Если нас не устраивает тот факт, что клавиша "Закрыть" подсвечена по-умолчанию, и при нажатии клавиши Enter выбранные таблицы будут закрыты, то можно изменить стиль оформления с BS_DEFPUSHBUTTON на BS_PUSHBUTTON у кнопки "Закрыть". При этом необходимо провести обратную операцию для кнопки "Отмена". В этом случае кнопкой по-умолчанию станет она, и результат будет достигнут.

Пример 3. Дополнительные стили кнопочных элементов.

Рассмотрим диалог под номером 9070 из файла mires.dll.

Динамический диалог

Диалог интересен тем, что является динамическим, то есть его содержимое меняется в зависимости от запросов MapInfo. Кроме того, программно устанавливается, какая кнопка будет главной (подсвеченной) по-умолчанию. Например, если в MapInfo подгружена только одна таблица, в которой произошли изменения, и есть необходимость восстановить её, то MapInfo выдаст соответствующий запрос, в котором предложит либо восстановить таблицу, либо отменить и закрыть диалог. При этом кнопка "Восстановить" (та же кнопка "ОК", только с заменённым текстом) будет в приоритете, хотя стиль BS_DEFPUSHBUTTON не установлен. В других случаях, таких как изменение типа полей таблицы, может возникать другое окно, где уже кнопка "Отмена" будет в приоритете.

Предположим, что существует необходимость, чтобы кнопка "Отмена" никогда не бывала активной по-умолчанию. Но тут возникает интересная особенность. Кнопка "Отмена" вместо ID 2 имеет ID 4. Попытка смены ID даёт то, что кнопка перестаёт отображаться вообще. Попытка принудительно назначить кнопке "ОК" стиль BS_DEFPUSHBUTTON ничего не даёт. Поэтому альтернативным вариантом решения является возможность отключения этой кнопки, так как диалог в любом случае можно закрыть с помощью клавиши Esc. Чтобы отключить кнопку, необходимо применить для кнопки стиль WS_DISABLED. После чего можно получить такой результат:

Отключенная кнопка

Добавление и изменение текстовых констант

В этом разделе речь пойдёт о текстовых строках, которые также содержатся в ресурсах. Основные файлы, где они хранятся — mires.dll и micore.dll. Рассматриваться будет micore.dll. Необходимо открыть файл, перейти в директорию String Table и открыть раздел строк под номером 393.

Текстовые строки

Как видно из примера, здесь представлено некоторое количество строк. Некоторые из них специальные, содержащие переменные, в которые будут подставлены названия таблиц или колонок. Однако, нас интересуют строки под номерами 6276-6279. Там представлены функции соответствующего списка из диалога "SQL-запрос". Если следовать представленному синтаксису, то можно дописать в этот раздел свои собственные функции. Например, можно добавить функции ObjectInfo и ObjectGeography в строку 6278. После сохранения и компиляции результат будет выглядеть так:

Новые добавленные функции

Заключение

В статье показаны варианты редактирования диалоговых окон и их элементов. Возможности добавления своих элементов сильно ограничены, так как основная их часть должна быть запрограммирована для достижения тех или иных результатов, чего через ресурсы выполнить невозможно. Но тем не менее, при определённых навыках и творчестве можно получить интересные варианты.

На этом всё. Успешной работы!