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裡面設定一下鷹眼圖的大小.