天天看點

VC+MapX鷹眼實作VC+MapX鷹眼實作

VC+MapX鷹眼實作

文章來源:www.csdn.net 文章作者:collision 2005-11-16  字型:[ 大  中  小] 

在網上我看到了很多用VC+MapX實作的鷹眼,可功能都不全,看了清華出的那本<<用MapX 開發地理資訊系統>>上面有一個用vb作的鷹眼,功能不是很強,不過簡單的也夠用了,我翻譯了一下寫成了VC版的鷹眼。希望對新手有所幫助。

我的基本實作想法是,在同一個View視窗下家兩個CMapX控件,一個稱為主圖,一個稱為鷹眼圖。

CMapX m_ctrlMapX; ///主圖

CMapX m_eagleMapX; ///鷹眼圖

注意事項:在View裡的OnCreate函數一定要想建立m_eagleMapX,這樣才能看見鷹眼圖。既如此:

m_eagleMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 120, 120), this, IDC_MAP_EAGLE);

m_eagleMapX.SetGeoSet(NULL);

m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 100, 100), this, IDC_MAP);

m_ctrlMapX.SetGeoSet(NULL);

接下來,可以在主圖裡挑幾層加到鷹眼圖中(區域圖層)

再在消息中映射幾個消息:

ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEMOVE , onMouseMoveEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)

ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEDOWN , onMouseDownEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)  copyright dedecms 

ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEUP , onMouseUpEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)

最後實作這幾個函數:

void CMTRSView::onMouseUpEagleMap(short Button, short Shift, float X, float Y)

{

///使用者單擊導航圖上某點的處理

if(strMouseState == "Begin") 

{

double dblMapX1, dblMapY1;

///求出該點的地理坐标

m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX1, &dblMapY1, miScreenToMap);

///設定主圖的地理坐标

m_ctrlMapX.SetCenterX(dblMapX1);

m_ctrlMapX.SetCenterY(dblMapY1);

}

///使用者在導航圖上框出矩形區域時的處理

if(strMouseState == "Move")

{

Single sngXMax, sngXMin, sngYMax, sngYMin;

if(PreX < X) 

{

sngXMax = X;

sngXMin = PreX;

}

else

{

sngXMax = PreX;

sngXMin = X;

}

if(PreX < Y)

{

sngYMax = Y;

sngYMin = PreY;

}

else

{

sngYMax = PreY;

sngYMin = Y; 

}

double dblXMax, dblXMin, dblYMax, dblYMin;

m_eagleMapX.ConvertCoord(&sngXMin, &sngYMin, &dblXMin, &dblYMin, miScreenToMap);

m_eagleMapX.ConvertCoord(&sngXMax, &sngYMax, &dblXMax, &dblYMax, miScreenToMap);

CMapXRectangle rect;

rect.CreateDispatch(rect.GetClsid());

rect.Set(dblXMin, dblYMin, dblXMin, dblYMax);

m_ctrlMapX.SetBounds(rect.m_lpDispatch);

}

strMouseState = "Stop";

}

void CMTRSView::onMouseDownEagleMap(short Button, short Shift, float X, float Y)

{

CMapXFeatures ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();

for(int i = 1; i <= ftrs.GetCount(); i++)

{

m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));

}

if(Button == vbLeftButton)

{

strMouseState = "Begin";

PreX = X;

PreY = Y;

}

}

void CMTRSView::onMouseMoveEagleMap(short Button, short Shift, float X, float Y) 

{

if(Button != vbLeftButton) return;

CMapXRectangle rctMap;

CMapXPoints pntsMap;

CMapXPoint pntMap1, pntMap2, pntMap3, pntMap4;

CMapXStyle styLine;

CMapXFeatures ftrs;

CMapXFeature ftr;

Single sngX, sngY;

///得到滑鼠單擊點的地理坐标

sngX = PreX;

sngY = PreY;

double dblMapX1, dblMapY1;

m_eagleMapX.ConvertCoord(&sngX, &sngY, &dblMapX1, &dblMapY1, miScreenToMap);

///得到滑鼠目前點的地理坐标

double dblMapX2, dblMapY2;

m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX2, &dblMapY2, miScreenToMap);

///設定矩形的四角

pntMap1.CreateDispatch(pntMap1.GetClsid());

pntMap2.CreateDispatch(pntMap2.GetClsid());

pntMap3.CreateDispatch(pntMap3.GetClsid());

pntMap4.CreateDispatch(pntMap4.GetClsid());

pntMap1.Set(dblMapX1, dblMapY2);

pntMap2.Set(dblMapX2, dblMapY2);

pntMap3.Set(dblMapX2, dblMapY1);

pntMap4.Set(dblMapX1, dblMapY1);

///将矩形的四角加入點集中 

pntsMap.CreateDispatch(pntsMap.GetClsid());

pntsMap.Add(pntMap1);

pntsMap.Add(pntMap2);

pntsMap.Add(pntMap3);

pntsMap.Add(pntMap4);

pntsMap.Add(pntMap1);

styLine.SetLineColor(miColorBlack); ///定義樣式的線條顔色

styLine.SetLineWidth(1); ///定義樣式的線條寬度

styLine.SetLineStyle(3); ///虛線

///将導航圖鷹眼層所有對象清空

ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();

for(int i = 1; i <= ftrs.GetCount(); i++)

{

m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));

}

///在導航圖鷹眼層畫虛線矩形框,框出使用者預選擇的範圍

CMapXFeature ftrMap;

COleVariant pntsVt, styVt;

pntsVt.vt = VT_DISPATCH;

pntsVt.pdispVal = pntsMap.m_lpDispatch;

pntsVt.pdispVal->AddRef();

styVt.vt = VT_DISPATCH;

styLine.CreateDispatch(styLine.GetClsid());

styVt.pdispVal = styLine.m_lpDispatch;

styVt.pdispVal->AddRef();

ftrMap = m_eagleMapX.GetFeatureFactory().CreateLine(pntsVt, styVt); 

m_eagleMapX.GetLayers().Item("EagleLayer").AddFeature(ftrMap);

///設定滑鼠狀态為"Move"

strMouseState = "Move";

}

還有,可以在OnSize裡面設定一下鷹眼圖的大小.