MB60UG
.pdfApplication
Parent
Глава 12: Интегрированная Картография
Возвращает значение IDispatch MapBasicприложения.
Стандартное свойство OLE.
Возвращает значение IDispatch порождающего объекта; для объекта mbglobal это объект programobject, который декларировал глобальную переменную.
Стандартное свойство OLE.
Следующий пример программы на Visual Basic определяет и изменяет значение глобальной переменной (g_status) MapBasic-программы.
Dim globinfo As Object
Dim old_value As Integer
’Извлечение глобальных переменных первой
’из работающих MapBasic-программ
Set globinfo = mapinfo.MBApplications(1).MBGlobals
’ Извлечение конкретного значения old_value = globinfo(”g_status”).Value
’ Присвоение глобальной переменной нового значения: globinfo(”g_status”) = old_value + 1
Обратите внимание, что globinfo(“g_status”) эквивалентно globinfo(“g_status”).Value.
235
Глава 12: Интегрированная Картография
Свойства объекта MIMapGen
Следующая таблица содержит список свойств, применяемых к объекту MIMapGen. Первоначально объект MIMapGen используется в приложениях MapInfo ProServer; таким образом, приложения MapInfo Professional могут использовать объект MIMapGen. Например, для использования объектной модели MIMapGen, смотрите документацию к ProServer.
Имя свойства |
Функциональность |
Workspace |
Путь к файлу рабочего набора MapInfo. |
MBApp |
Маршрут к исполняемому приложению MapBasic |
|
(MBX файл). Когда он установлен, MapInfo |
|
запускает MBX. |
LongLat |
Логическое: Определяет интерфейс координатной |
|
системы. Если TRUE, все значения, которые Вы |
|
вводите или получаете (используя CenterX и |
|
CenterY) представляют широту и долготу. Если |
|
FALSE, то будет использоваться координатная |
|
система окна карты. |
SuppressDlgs |
Логическое: Если TRUE, то вызывается диалог с |
|
сообщением об ошибке. Сюда включаются |
|
диалоги, действующие как результат оператора |
|
Run Menu Command. |
ImageWidth |
Ширина изображения, в пикселах. |
ImageHeight |
Высота изображения в пикселах. |
CenterX |
X-коотрдината (Долгота) центра карты. |
CenterY |
Y-координата (Широта) центра карты. |
Zoom |
Ширина карты (в единицах расстояния). |
Обратите внимание, что задание Рабочего набора это первый шаг в использовании объекта MIMapGen. MIMapGen настроен на работу в ситуации, когда есть одно окно карты (то есть, когда web страница показывает одну карту). Что бы начать использовать MIMapGen, определите настройки Рабочего набора, так, что бы MapInfo загрузила рабочий набор - такой набор, который содержит одно окно карты. Тогда Вы сможете использовать другие методы и возможности работы с окном карты.
236
Глава 12: Интегрированная Картография
Методы работы с объектом MIMapGen
Следующие методы применяются к объекту MIMapGen.
Метод |
Функциональность |
ZoomCenterMap( ) |
Перерисовывает карту, основываясь на текущих |
|
значениях CenterX, CenterY и Zoom. Карта |
|
перерисовывается, только если центр или |
|
масштаб изменились с момента последней |
|
прорисовки карты. |
RenderMap( ) |
Имеет тоже действие, что и ZoomCenterMap, |
|
кроме того, что карта всегда перерисовывается. |
ZoomMap( |
Изменяет масштаб карты, в соответствии с |
double ZoomFactor) |
указанием фактора масштаба. Положительное |
|
значение увеличивает масштаб; отрицательное |
|
уменьшает. |
ClickCenterMap( |
Перемещает центр карты в зависимости от места, |
long MouseX, |
где будет щелчок мыши. Аргументы x/y |
long MouseY) |
отражают положение на карте в пикселах. |
ClickCenterZoomMap( |
Перемещает центр карты в зависимости от места, |
long MouseX, |
где будет щелчок мыши и изменяет масштаб в |
long MouseY, |
зависимости от масштабного фактора. |
double ZoomFactor) |
|
ClearCosmeticLayer( ) |
Те же эффекты, что и от команды Map menu: |
|
Удалить все объекты с косметического слоя. |
SQLUnselectAll( ) |
Тот же эффект, что и от команды Запрос: |
|
Отменить выделение всех строк. |
SearchRadius( |
Определение радиуса поиска. |
double CenterPointX, |
|
double CenterPointY, |
|
double Radius) |
|
SearchRadiusExt( |
Изменяет радиус поиска, определяет круг поиска, |
double CenterPointX, |
центральную точку и точку, лежащую на радиусе. |
double CenterPointY, |
|
double OuterPointX, |
|
double OuterPointY) |
|
SearchPoint( |
Ищет небольшую область вокруг указанного |
double CenterPointX, |
места. |
double CenterPointY) |
|
SearchRect( |
Ищет в прямоугольной области. |
double x1, |
|
double y1, |
|
double x2, |
|
double y2) |
|
237
Глава 12: Интегрированная Картография
GetTable( |
Возвращает объект MISelection (IDispatch); чтобы |
|
string Tablename ) |
получить доступ к содержимому таблицы, |
|
|
используйте объект MISelection. |
|
ExportMap( |
Генерирует растровый файл (JPEG, TIFF, PNG, |
|
string ImageType, |
PSD, BMP, WMF или GIF) окна Карты. Смотрите |
|
string FileSpec ) |
оператор MapBasic Save Window. |
|
ExportMapEx( |
Генерирует растровый файл (JPEG, TIFF, PNG, PSD, BMP, WMF èëè |
|
string ImageType, |
GIF) окна Карты. Смотрите оператор MapBasic Save Window. |
|
string FileSpec, string |
|
|
Copy rightInfo ) |
|
|
RefreshProperties() |
Обновляет параметры CenterX, CenterY, Zoom, |
|
|
ImageHeight è ImageWidth. |
|
ScreenToMap( |
Преобразует координаты экрана (пикселы) в |
|
long ScreenX, |
координаты карты (типа широта / долгота). |
|
long ScreenY, |
|
|
double MapX, |
|
|
double MapY ) |
|
|
MapGenHandler( |
Вызывает подпроцедуру RemoteMapGenHandler в |
|
string Message ) |
приложении MBX, которая выполняется через |
|
|
MBApp. Используйте этот метод для запуска |
|
|
операторов MapBasic в файле MBX. |
|
Замечание: Поисковые методы делают поиск только на самом верхнем слое. Для получения доступа к результатам поиска, смотрите объект MISearchInfo.
Свойства объекта MISearchInfo
Следующие свойства применяются к объекту MISearchInfo.
Свойства |
Функциональность |
Rows |
Это свойство возвращает выборку MIRows |
|
(выборку объектов MIRow). Эта выборка |
|
представляет результаты поиска. |
Fields |
Это свойство возвращает выборку MIFields |
|
(выборку объектов MIField). Эта выборка |
|
представляет установки определенных полей |
|
(имена полей и др.) описывающих результат |
|
поиска. |
TableName |
Строка: Имя таблицы, которая содержит |
|
результаты поиска. |
|
|
Замечание: Для получения объекта MISearchInfo, используйте методы поиска объектов MIMapGen: SearchRadius, SearchRadiusExt, SearchPoint или SearchRect.
238
Глава 12: Интегрированная Картография
Методы работы с объектом MIRow
Следующий метод применяется к объекту MIRow. Каждый объект MIRow представляет одну запись, возвращаемую поисковым методом или одну строку в таблице определенную в методе поиска GetTable.
Метод |
Функциональность |
Value |
Возвращает указатель на значения для данной |
|
колонки, которая определяется использованием |
|
аргумента arg. Допустимы следующие варианты |
|
VT_12, VT_14 è VT_BSTR (ãäå VT_BSTR ýòî èìÿ |
|
колонки). |
Замечание: Что бы получить выборку объектов MIRow, сошлитесь на свойства Rows объекта MISearchInfo или объекта MISelection.
Свойства объекта MIField
Следующие свойства применяются к объекту MIField. Каждый объект MIField описывает одну из колонок в последних результатах поиска или одну из колонок в таблице, определенной в методе вызова GetTable.
Свойства |
Функциональность |
Name |
Строка: Имя колонки. |
Type |
Short: Тип данных поля. Допустимы следующие |
|
значения: (1) DT_CHAR, (2) DT_DECIMAL, (3) |
|
DT_INTEGER, (4) DT_SMALLINT, (5) DT_TIME, |
|
(6) DT_LOGICAL, (8) DT_FLOAT. |
Width |
Short: Ширина поля; применяется только к |
|
полям DT_CHAR и DT_DECIMAL. |
DecimalPlaces |
Short: Число десятичных разрядов в поле |
|
DT_DECIMAL. |
Замечание: Для получения выборки объектов MIField, обратитесь к свойствам Fields объектов MISearchInfo или MISelection.
239
Глава 12: Интегрированная Картография
Свойства объекта MISelection
Следующие свойства применяются к объекту MISelection.
Свойства |
Функциональность |
Rows |
Это свойство возвращает выборку MIRows |
|
(выборку объектов MIRow). Эта выборка |
|
представляет все строки в таблице. |
Fields |
Это свойство возвращает выборку MIFields |
|
(выборку объектов MIField). Эта выборка |
|
представляет определения полей (имена полей и |
|
др.) для таблицы, которая определена в методе |
|
GetTable. |
TableName |
Строка: Имя таблицы, которая была определена в |
|
методе GetTable. |
Замечание: Для получения доступа к объекту MISelection, используйте метод GetTable из объекта MIMapGen.
Аргументы командной строки MapInfo
Если Вы используете для связи с MapInfo динамический обмен данных (DDE), Вы должны запустить MapInfo вручную (например, вызовом функции Shell( ) языка Visual Basic) перед установлением DDE-связи. При запуске MapInfo 4.0 для Windows Вы можете использовать в командной строке любой из нижеперечисленных аргументов. Если Вы хотите оставить пользователя в неведении о работе программы MapInfo в фоновом режиме, задайте один из следующих аргументов.
Аргумент командной строки |
Эффект |
|
-nosplash |
MapInfo запускается без вывода на дисплей |
|
|
заставки, показывающей заставку |
|
|
MapInfo, номер версии и т.п. |
|
-server |
MapInfo запускается без вывода на дисплей |
|
|
заставки или главного окна. Используйте |
|
|
этот аргумент, если Вы хотите, чтобы |
|
|
MapInfo работал как фоновый сервер для |
|
|
других приложений, использующих DDE. |
|
-automation èëè -embedding |
MapInfo запускается без вывода на дисплей |
|
|
заставки или главного окна. Кроме того, |
|
|
MapInfo регистрирует свой Поставщик |
|
|
Объектов OLE (OLE Class Factory) в |
|
|
подсистеме OLE, что позволяет MapInfo |
|
|
работать фоновым OLE-сервером для |
|
|
другого приложения. |
240
|
Глава 12: Интегрированная Картография |
-regserver |
MapInfo регистрирует свои OLE- |
|
возможности в регистрационной базе |
|
данных, после чего завершает работу. |
|
Запустите MapInfo с этим аргументом один |
|
раз после установки программы. Заметьте, |
|
что MapInfo автоматически регистрирует |
|
себя при обычном запуске. Особенно |
|
учтите, что при таком запуске |
|
регистрируются все способности MapInfo – |
|
механизм управления объектами OLE (OLE |
|
Automation), Внедрение OLE и т.д. |
-unregserver |
MapInfo убирает все ссылки на себя из |
|
регистрационной базы данных, после чего |
|
завершает работу. Используйте этот |
|
аргумент при удалении программы с диска. |
|
Применение этого аргумента ликвидирует |
|
регистрацию всего, что было |
|
зарегистрировано при запуске с аргументом |
|
-regserver. |
-helpdiag |
Этот аргумент устанавливает специальный |
|
флажок в MapInfo, в результате чего |
|
MapInfo выводит диагностическое окно |
|
диалога при каждой попытке вызова |
|
Справочной системы нажатием клавиши |
|
F1. Более подробное обсуждение |
|
использования Справочной системы |
|
смотрите далее в этой главе. |
Замечание: Вместо знака минус можно использовать косую черту (“/”).
Введение в Интегрированную Картографию с поддержкой
Visual C++ è MFC
Оставшаяся часть этой главы описывает процесс создания программы на языке Visual C++ с поддержкой MFC, которая использует Интегрированную Картографию. Примеры написаны для 32—битной версии Visual C++ (версия 2.0 и выше), но они работают и для 16–битной версии Visual C++ (версия 1.52); разница между версиями упоминается там, где это необходимо.
Так как эта информация предназначена для программистов, в тексте, для минимального искажения смысла, частично оставлены английские термины.
Создание нового проекта
1. Запустите Visual C++ 2.x (32–битную) или 1.5x (16–битную).
241
Глава 12: Интегрированная Картография
2.Выполните команду FILE > NEW для создания нового проекта или (PROJECT > APPWIZARD... в версии 1.5).
3.Запустите ассистирующую процецуру MFC AppWizard. Для первого раза выберите режим однодокументного окна (SDI), а не многодокументного интерфейса (MDI). Помните, что не обязательно сразу подключать стандартную поддержку OLE. Если Вам нужно использовать уведомления из Вашего приложения в MapInfo, то закажите поддержку OLE Automation на шаге 3 из 6 процедуры MFC AppWizard.
4.Соберите программу и запустите ее, чтобы убедиться в том, что она работает.
Добавление клиентской поддержки OLE Automation
Если Вы не заказали поддержку OLE в процедуре AppWizard, можно добавить клиентскую поддержку OLE Automation следующим образом.
1. Откройте файл STDAFX.H и добавьте строки:
#include <afxole.h> #include <afxdisp.h>
2. Откройте главный файл текста программы (т.е. имяпроекта.CPP) и добавьте следующие строки в начало CимяпроектаApp::InitInstance:
if (!AfxOleInit( )) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE;
}
3. Добавьте строчку в файл строчных ресурсов (с названием имяпроекта.RC). Для этого откройте ресурс “String Table”, выполните команду Resource > New String (в версии 1.5 для этого используется AppStudio). Присвойте значение ID: “IDP_OLE_INIT_FAILED” и значение Caption: “Не удалось инициализировать OLE. Проверьте правильность версии OLE-библиотек.” Закройте и сохраните файл ресурсов.
Создание класса поддержки MapInfo
В диалоге PROJECT > CLASSWIZARD (BROWSE > CLASSWIZARD в версии 1.5) откройте раздел OLE Automation и нажмите на кнопку “Read Type Library”. Найдите в Вашем каталоге MapInfo файл MAPINFOW.TLB. Нажмите OK, и будет создан класс, с помощью которого Вы можете обращаться к MapInfo через механизм управления объектами OLE (OLE Automation).
Откройте главный файл с текстом программы (с названием .CPP) и добавьте в него следующие строки.
∙После всех директив #includes:
#include ”MapInfow.h”
∙Сразу за объявлением “CимяпроектаApp theApp” добавьте объявление переменной:
DMapInfo mapinfo;
242
Глава 12: Интегрированная Картография
∙ Ближе к концу CимяпроектаApp::InitInstance, но перед вызовом OnFileNew( ):
mapinfo.CreateDispatch(“MapInfo.Application”);
Откройте файл MAPINFOW.H и добавьте в конец файла следующие строки:
extern DMapInfo mapinfo;
#include ”маршрут-к-каталогу\mapbasic.h”
Если Вы работаете в Visual C++ 1.5, Вы должны еще вручную добавить названия OLEбиблиотек в командную строку сборки (link command line); Visual C++ 2.x делает это самостоятельно. Для этого нужно выполнить команду Options > Project... и нажать на кнопку Linker.... Выберите переключатель “Common to both” в окошко “Libraries:” слова:
compobj, storage, ole2, ole2disp, ole2nls, mfcoleui
Тестирование
Добавьте еще одну строчку в конец функции CимяпроектаApp::InitInstance, сразу после
вызова CreateDispatch (его добавление описано выше):
::MessageBox(0, mapinfo.GetFullName( ), mapinfo.GetName( ), MB_OK);
Соберите снова Вашу программу. При ее запуске Вы должны увидеть сообщение с заголовком “MapInfo Professional” и полным DOS-маршрутом к MapInfo. Это означает, что MapInfo успешно запустилась через механизм OLE Automation. Позже тестирующую строку “::MessageBox...” можно закомментировать или удалить.
Переопределение "быстрых" меню
Встраивая Карту в Ваше приложение, Вы можете украсить ее всеми сервисными средствами MapInfo. Иногда этот сервис не нужен и мешает; например, стандартное быстрое меню для окна Карты включает в себя команду дублирования окна. Ее нужно удалить из быстрого меню, чтобы она не вводила в заблуждение пользователей Вашего приложения.
Для этого ближе к концу текста CимяпроектаApp::InitInstance сразу после вызова CreateDispatch добавьте следующие строки:
//удалить вызов Справочной системы mapinfo.Do(”Set Window Help Off”);
//Удаление команды дублирования из “быстрого меню” mapinfo.Do(”Create Menu \”MapperShortcut\” ID 17 as \”(-\””);
Здесь же можно добавить другие инструкции, сокращающие объем сервиса, идущего от MapInfo.
Переподчинение диалогов MapInfo
Очень важно научиться переподчинять диалоги MapInfo, появляющиеся из окна Вашего приложения, особенно, если они предназначаются для заполнения пользователем. Этот
243
Глава 12: Интегрированная Картография
прием дает уверенность в том, что диалог будет появляться над окном приложения и что окно приложения будет неактивным все время, пока пользователь заполняет диалог MapInfo. В следующем примере показано, как переподчинить два диалога MapInfo (например, используя RunMenuCommand с заданным аргументом ) и сообщения об ошибках, которые MapInfo показывает, обнаруживая непонятные события.
Âтексте MainFrm.CPP, для функции CMainFrame::OnCreate надо добавить:
∙после всех директив #includes:
#include ”MapInfow.h”
∙В конце текста CMainFrame::OnCreate:
char str[256];
sprintf(str, ”Set Application Window %lu”, (long)(UINT)m_hWnd);
mapinfo.Do(str);
Чтобы убедиться в том, что это сработало, добавьте строку:
mapinfo.Do(”Note \”Привет от MapInfo\””);
в текст функции CимяпроектаApp::InitInstance сразу после вызова OnFileNew( ). Это приведет к тому, что MapInfo покажет один из своих стандартных диалогов изнутри прикладной программы
После организации подобного переподчинения рекомендуется провести промежуточное тестирование.
Добавление окна Карты
Теперь, когда MFC-приложене заработало и Вы убедились, что к MapInfo можно обращаться через OLE Automation, пора сделать то, ради чего все это затевалось – добавить окно Карты в приложение.
Открйте диалог Project > ClassWizard (или Browse > ClassWizard в версии 1.5). Выберите класс представлений (CимяпроектаView) и раздел “Message Maps”. В самом левом окошке списка выберите объект “CимяпроектаView”.
Âсписке “Messages” выберите “WM_CREATE”, нажмите на “Add Function”; выберите “WM_DESTROY”, нажмите на “Add Function”; выберите “WM_SIZE”, и нажмите на “Add Function”.
Âзаголовочный файл для представлений (имяпроектаVW.H) добавьте строки:
unsigned long m_windowid; HWND m_windowhwnd;
244