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

Материал из GIS-Lab
Перейти к навигации Перейти к поиску

В этой заметке будет описан способ редактирования диалоговых окон, текстовых объектов и других объектов интерфейса, находящиеся в ресурсах динамических библиотек, подгружаемых 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. Рассмотрим диалог редактирования текста.

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

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

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

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

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

Заключение

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

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

Эта страница является черновиком статьи.