Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MB60UG

.pdf
Скачиваний:
12
Добавлен:
13.02.2015
Размер:
1.47 Mб
Скачать

Application

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]