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

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница опубликована в основном списке статей сайта
по адресу 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. После сохранения и компиляции результат будет выглядеть так:

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

Заключение

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

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