首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MapX VC 開發:自定義測距工具 (PolyToolUsed 事件) 完整實現

     編輯:VC 教學

需求背景

MapX (MapInfo ActiveX) 提供 `CreateCustomTool` 建立自定義工具,配合 `PolyToolUsed` 事件可實現多邊形繪製、測距、測面積等 GIS 交互功能。本文以「測距工具」為例,展示從工具創建、事件響應到距離計算的完整流程。

四步完成自定義測距工具

1. 定義工具 ID 常量

#define MYTOOL_DISTANCE 100  // 範圍 1~999,避免與內建工具衝突

2. 創建自定義工具 (通常在 `OnInitialUpdate` 或 `OnCreate`)

// miToolTypePoly = 多邊形工具類型,miCrossCursor = 十字光標
m_ctrlMap.CreateCustomTool(MYTOOL_DISTANCE, miToolTypePoly, miCrossCursor);

3. 響應 PolyToolUsed 事件 (核心邏輯)

void CMapXSampleView::OnPolyToolUsedMap(
    short ToolNum, long Flags, LPDISPATCH Points,
    BOOL bShift, BOOL bCtrl, BOOL FAR* EnableDefault)
{
    // 僅處理繪製過程中的本工具事件
    if (Flags == miPolyToolInProgress && ToolNum == MYTOOL_DISTANCE) {
        CMapXPoints pts;
        try {
            pts.AttachDispatch(Points, FALSE);  // 取得點集合
            long n = pts.GetCount();
            double dTotalDist = 0.0;

            // 累加相鄰兩點球面距離
            for (long i = 1; i < n; ++i) {
                CMapXPoint pt1 = pts.Item(i);
                CMapXPoint pt2 = pts.Item(i + 1);
                double d = m_ctrlMapX.Distance(
                    pt1.GetX(), pt1.GetY(),
                    pt2.GetX(), pt2.GetY());
                dTotalDist += d;
            }

            // 狀態列顯示 (單位取決於地圖坐標系,通常為米/度)
            CString str;
            str.Format(_T("總距離:%.2f"), dTotalDist);
            ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0, str);
        }
        catch (COleDispatchException* e) { e->ReportError(); e->Delete(); }
        catch (COleException* e) { e->ReportError(); e->Delete(); }
    }
}

4. 啟用工具 (工具列按鈕/選單響應)

void CMapXSampleView::OnMapToolDistancetool() {
    m_ctrlMapX.SetCurrentTool(MYTOOL_DISTANCE);
}

關鍵參數說明

參數含義
ToolNum觸發事件的工具 ID,對應 `CreateCustomTool` 第一參數
Flags`miPolyToolInProgress` (繪製中)、`miPolyToolDone` (完成)、`miPolyToolCancel` (取消)
Points`MapXPoints` 集合,1-based 索引,含用戶點擊的所有頂點
EnableDefault設為 TRUE 允許 MapX 繼續預設繪製行為 (如顯示橡皮筋線)

進階擴展建議

  • 單位轉換:`Distance` 返回值單位與地圖坐標系一致 (度/米/英尺)。需轉換時用 `CoordSys` 物件或投影變換。
  • 即時回饋:在 `miPolyToolInProgress` 階段每滑鼠移動一次計算並顯示當前段長,提升體驗。
  • 樣式自定義:配合 `MapX.DrawTool` 事件繪製自定義測距線樣式 (虛線、箭頭、標註文字)。
  • 測面積:工具類型改 `miToolTypePolygon`,事件中用 `Area` 方法計算多邊形面積。

常見問題排查

  • 事件不觸發 → 確認 `CreateCustomTool` 在 `m_ctrlMapX` 完全建立後調用,且 ID 唯一
  • 距離為 0 → 檢查坐標系是否為地理坐標 (經緯度),`Distance` 可能返回度數,需投影至平面坐標系
  • 記憶體洩漏 → `AttachDispatch` 後務必在 `catch` 區塊或結束時 `ReleaseDispatch`

結語

MapX 自定義工具 + `PolyToolUsed` 事件是實現 GIS 交互量測功能的標準路徑。掌握「創建工具 → 事件解析點集 → 幾何計算 → UI 回饋」四步流程,可快速構建測距、測面積、繪圖編輯等專業功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved